有限个有用的Linux命令行工具推荐

2020-04-14

前言

一般来说呢,在经过了前期的学习和一段时间的磨练之后,一般都会发现Linux的命令行界面操作起来是非常高效和方便的,说实话我也觉得图形界面的操作效率和便利程度都很低,搞不明白为什么那么多人仍然执着于图形界.今天呢我来给大家推荐几款比较好用的Linux命令行界面下的工具.

正文开始

这篇文章可能会不断地更新的,新添加的命令介绍会写在前面.

# cpulimit – 限制进程的CPU占用率

平价的VPS主机一般是共享主机,在VPS提供商的TOS(Term of Services,服务条款)中一般会限定用户不能长时间连续占用VPS实例过多的资源,例如,不得让VPS的CPU长时间跑.假如我们有计算密集型的任务要挂在VPS上保持运行怎么办呢?一种方法是升级成配置更好的限制更宽松的Dedicated Server(独立服务器又称独服),但是价格也会上升,我们希望就在现在这台VPS上运行这个计算任务,可是发现CPU占用率一直是在100%的,那么如何限定进程的CPU占用率呢?

解决方案是cpulimit,首先安装cpulimit

apt install cpulimit

然后找到要限速的进程的进程号,例如ffmpeg

pgrep ffmpeg

输出进程号比如说是25196,然后运行cpulimit,建议在tmux后台运行cpulimit

tmux
cpulimit -p 25196 -l 50

这样一来25196号进程的CPU占用率就被限定在50上下了,不会差太.会有一些误差,CPU占用率不会恒定保存在50%,是因为cpulimit的工作方式是间歇性地挂起和恢复进程.

# jq – JSON内容格式化工具

例如我们有这么一段JSON文本

{"username": "admin", "active": true, "lastLogin": "2020-04-14T21:21:07+08:00"}

最简单地我们可以用jq来使内容看起来更整齐一些

cat data.json | jq

那么会有如下效果

jq输出的效果

jq输出的效果

另外呢jq命令还有非常强大的处理json数据的功能,你可以把jq看成是命令行界面下处理json文件的专家,就像pandas适用于数据分析一.jq的这种功能适用于调试API,假如API返回的是JSON数据的话,用jq格式化之后会更加易读一些,同时对于自己写的JSON文本,jq也能检查是否存在语法错误.

要知道jq的更多功能可以运行

man jq

查看.

# tmux – 后台任务管理

在Windows下我们可以把窗口最小化或者最小化到托盘以实现程序的后台运行,在Linux中有一款管理「会话」的工具它叫做tmux,首先我们可以创建一个「会话」也就是一个Session:

tmux

然后我们运行要后台运行的命令

ping www.google.com

然后我们按住Control键再按B键,松开,再按D键即可回到我们的主界面

Control+B D

而任务仍然留在后台运行,即使我们执行

exit

退出远程ssh会话也不影响正在运行着的tmux会话,我们可以通过

tmux list-sessions

命令来查看有哪些会话,会有类似下面的输出

tmux列出会话

tmux列出会话

如果会话没有指定名字可以通过序号来访问,例如21号会话,冒号左边的数字便是会话的序号,如下命令回到tmux会话命令行

tmux attach-session -t 21

再回到主界面还是按Control+B D,而要给会话起一个名字可以按

Control+B :rename-session 新的会话名字 

再按回车.再之后就可以通过会话名字访问了

tmux attach-session -t 新的会话名字

可以运行

man tmux

查看有关终端复用器tmux的更多文档.

当我们运行爬虫,或者是比较耗时的科学计算任务的时候,tmux是个不错的选择,因为即使你退出了远程ssh会话,tmux会话运行的任务还是会保持运行.

# goaccess – 网站日志分析器

一般来说网页服务器例如Apache HTTPd或者NginX会习惯把请求日志存放在access.log这个日志文件中,而如果没有经过设置的话默认的NginX的请求日志是存放在

/var/log/nginx/access.log

这个地方,我们可以用goaccess工具分析日志数据所蕴含的访客流量信息

goaccess /var/log/nginx/access.log

可以看到独立访客,请求次数,流量,请求资源路径等信息.

有关goaccess的更多信息可以通过

man goaccess

查看.

但是需要注意的是对于启用了CDN的网站来说不是所有的请求都会被转发至源服务器,有可能请求仅仅是到达CDN的边沿服务器就命中缓存产生响应.所以goaccess适用于运行在边沿服务器上.

# openssl – 证书签发和TLS测试工具

关于怎么用openssl签发CA证书和网站证书,以及怎么查看网站的证书信息,以及怎么查看证书信息和验证证书在这篇文章中有介绍.

openssl测试网站的TLS性能是这样的

openssl s_time -connect cloudflare.com:443

得出的数据是在给定时间内当前客户端能和网站服务器建立多少个TLS连接,一定程度上反应了网络状况:

从一台客户端上测试到cloudflare.com的TLS连接速度

从一台客户端上测试到cloudflare.com的TLS连接速度

从另外一台客户端上测试到cloudflare.com的TLS连接速度

从另外一台客户端上测试到cloudflare.com的TLS连接速度

就以上两份测试结果而言我们肯定任务第一台客户端到cloudflare.com的网络状况好一些,TLS握手快一些,而第二台客户端到cloudflare.com的网络状况则差一些.

要查看openssl的更多使用姿势你可以运行

man 1 openssl

仔细查看.

# ssh – 免密登录与安全连接

我们可以使用

ssh-keygen -f testkey

来生成一对公私钥,其中testkey文件是私钥,而testkey.pub文件是公钥,可以自己给密钥对别的名.

使用ssh-keygen生成公私钥

使用ssh-keygen生成公私钥

然后,##如果你还没有配置ssh私钥的话## 可以将 将私钥文件,这里是testkey复制到$HOME/.ssh/id_rsa,公钥文件复制到$HOME/.ssh/id_rsa.pub

ssh使用的默认私钥文件

ssh使用的默认私钥文件

并且将id_rsa.pub文件上传到服务器上,在服务器上将这个公钥文件id_rsa.pub并入authorized_keys就可以实现免密登录了

cat id_rsa.pub >> ~/.ssh/authorized_keys

另外一种简单地将自己的公钥并入目标主机的authorized_keys文件的方法是

ssh-copy-id -i path/to/公钥  [email protected] 

例如

ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

这样成功之后,就看可以直接通过

ssh [email protected]地址

的方式免密登录VPS服务器,免密登录部署成功之后,可以禁用密码登录(但是本地的私钥文件id_rsa和id_rsa.pub要保存好),通过编辑配置文件

vi /etc/ssh/sshd_config

#PasswordAuthentication yes

改为

PasswordAuthentication no

保存退出后重启sshd服务

systemctl restart sshd
禁用密码登录

禁用密码登录

就成功禁用密码登录了,在这之后还可以编辑本地的ssh配置文件

vi /etc/ssh/ssh_config

添加以下内容

Host myvps
    Hostname ip地址
    User vps登录用户名

来给你的VPS一个ssh别名叫做myvps,之后登录和复制文件会方便很多,例如登录:

ssh myvps

例如复制文件:

rsync file1 myvps:/path/to/copy/to

例如作为远程Git仓库:

git remote add vpsrepo "myvps:/path/to/project.git"

都很方便.

# tail – 实时显示日志文件

模拟网页服务器访问日志的实时刷新我们用ping去ping一个主机,这样也有实时刷新的效果

ping www.google.com > testfile.log &

以上命令后台运行ping并且把输出重定向到当前目录下的testfile.log文件,然后为了查看实时的日志我们可以运行

tail -F testfile.log

这样就有了那种网页服务器不断跳动的访问日志.现在可以运行

jobs

来查看后台任务,例如刚才的ping的任务编号是1,那就

fg 1

使这个ping任务转为前台,然后按

Control+C

关掉这个ping任务.

# tee – 多处重定向输出

例如

ping www.google.com | tee testlog2.txt

会在屏幕上显示ping Google的输出的同时还把ping的输出记录到testlog2.txt这个文件,同样如果这时我们运行

tail -F testlog2.txt

也是有跟正常运行tail -F一样的效果.

# journalctl – 服务日志查看

有时候我们想知道一个服务它启用了,或者是不是启用了但是又因为什么问题停止了,我们可以查看服务的日志,注意不是守护进程产生的日志,是这个服务和systemd有关的日志:

journalctl -xefu nginx.service

或者我们想看看时间同步服务运行得如何

journalctl -xefu systemd-timesyncd.service

或者我们想看看是谁在爆破我们的VPS服务器

journalctl -xefu ssh.service

可以说journalctl是个很方便的日志管理工.可以运行

journalctl --help

来查看使用说明.

# systemctl – 服务查看工具

我们知道Windows操作系统下有「服务」这个概念,而Linux上也有,「服务」其实是通过systemd守护进程来实现的,而systemctl则是用来和systemd交互的命令行工具.

查看所有服务

systemctl list-units

重启某个服务

systemctl restart sshd

停止某个服务

systemctl stop nginx

关闭某个服务(不会再被启用)

systemctl disable httpd

启用某个服务

systemctl enable httpd

查看使用说明

systemctl --help

# netstat – 网络连接情况查看

netstat可以帮助你查看有哪些端口被监听,以及当前机器和哪台机器建立了TCP连接以及连接的状态。

要查看活跃的连接

netstat -t -n

要查看哪些端口被监听

netstat -t -n -l

查看本地socket端口连接情况

netstat -x

查看路由表

netstat -r

查看IPv6路由表

netstat -6 -r

查看netstat的使用姿势

netstat --help

要是有不明的端口正在被监听,可能是后门,建议找出是哪个进程监听的那个端口,例如

# lsof – 进程文件使用情况

查看端口被哪个进程使用

lsof -i :443

查看PID为2961的进程监听了哪些个端口

lsof -p 2961 -a -i

查看PID为2961的进程打开了哪些文件

lsof -p 2961

查看某个用户打开了哪些文件

lsof -u root

查看某个文件是被哪些进程打开

lsof /var/log/nginx/access.log

查看lsof的使用姿势

lsof --help

或者

man lsof

Linux实在太易用了!

# which – 查看可执行文件具体位置

假如我们要删除macOS自带的旧版的openssl,可以运行

rm `which openssl`

然后再安装新版的

brew install openssl

# w – 查看登录情况和运行情况

要查看系统运行了多久,有多少位用户登录,负载平均,可以运行

w

来查看.

# who – 查看登录情况

要是仅仅想查看登录情况,可以运行

who

这样就只看到有哪个用户登录了.

# date – 显示时间

要查看当前时间,可以运行

date

要显示年份

date +%Y

要显示月份

date +%m

要显示是当月的多少号

date +%d

要显示时分秒

date +%H:%M:%S

要查看当前距离Unix-Epoch过了多少秒

date +%s

要查看Unix-Epoch是什么时候

date --date='@0'

要查看date的更多用法,可以运行

date --help

# 加减乘除法

要做加法

echo $((2020+1))

输出为

2021

要做减法

echo $((2020-1))

输出为

2019

要做乘法

echo $((2020*12))

输出为

24240

要做除法

echo $((2020/12))

输出为

168

# 小技巧

返回上一个工作目录

cd -

更改上一条命令,假如我们运行了

echo hello

想要把hello更改为hello123再重新运行,那就运行

^hello^hello123

效果就是输出

hello123

重做上一次命令

echo hello
!!

输出为

hello
hello

# last – 登录记录

查看登录记录

last

每一次登录记录都看得清清楚楚.

# history – 运行记录

查看命令运行记录

history

用户运行过的每一个命令都记得清清楚楚.

查看最近10条命令

history 10

查看帮助,避免误操作

history --help

删掉历史记录

history -c

# lsb_release – 查看当前系统版本

查看当前系统版本

lsb_release --all

# lscpu – CPU信息查看

查看CPU信息

lscpu

# df – 磁盘使用量查看

查看磁盘空间使用量

df

查看磁盘空间使用了多少兆字节

df -m

查看挂载在根目录的磁盘使用了多少G

df -B G /

查看df的使用说明

df --help

# lsblk – 列出磁盘

列出当前机器有哪些磁盘

lsblk

输出类似于

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1  9.6M  0 rom
vda    252:0    0   20G  0 disk
└─vda1 252:1    0   20G  0 part /

# fdisk – 磁盘管理工具

查看分区表

fdisk -l /dev/vda

查看fdisk的使用方式

fdisk --help

# iftop – 网络流量查看

查看网络流量

iftop

查看iftop使用说明

man iftop

# man – 文档查看工具

要查看某个命令的说明,例如查看man这个命令的说明,可以运行

man man

要查看curl的说明,可以运行

man curl

一般来说man显示的文档比加上--help参数运行命令显示出的文档要更加详细.

man的介绍

man的介绍

同时注意man有不同的章节,不同的章节会显示不同的内容,例如

man 1 crontab

显示的是crontab的基本解释,而

man 5 crontab

则显示针对crontab的更加详细的文档.

同时man也能显示特殊设备文件的文档,例如

man 4 null

显示/dev/null的文档,而

man 4 zero

显示/dev/zero的文档,而

man 4 urandom

显示/dev/urandom的文档.

# nmap – 端口扫描工具

查看你的网上邻居

nmap -v -sn 192.168.1.0/24

查看cloudflare.com开启了哪些端口

nmap -v -sT cloudflare.com
查看cloudflare.com开启了哪些端口

查看cloudflare.com开启了哪些端口

查看nmap的一般使用说明

nmap --help

查看nmap的详细使用说明

man nmap

# find – 文件搜索器

要搜索一些文件,例如以.png作为后缀名的文件

find -name "*.png"

会找出好多.png的文件。

要搜索某个文件,例如文件名是hwy_vs_displ-1.png

find -name "hwy_vs_displ-1.png"

要查看find的更多用法

find --help

# tree – 目录结构打印

有时候我们想看一个目录下都有哪些子目录和文件,例如当前目录的目录结构

tree .

于是目录结构一览无余

.
├── a
│   └── c
│       ├── d
│       ├── e
│       └── f
├── b
├── testfile.log
└── testlog2.txt

也可以只打印1层

tree -L 1 .

或者打印2层

tree -L 2 .

因为有时候目录树太深了不方便查看,所以只打印几层就够了.

# 文件管理

列出最新的文件,使用ls命令

ls -t . | head -n 10
列出最新文件

列出最新文件

在macOS上安装coreutils包后用gdu替代缺乏维护的du,然后我们用gdu打印当前目录下每个目录占用的磁盘空间,交由sort排序

gdu -BM -c -d 1 | sort -n -k 1

这样可以方便的清理磁盘空间.

总结

可见,命令行下的操作,一点也不比图形界面的难用,除了显示图形,命令行真的是很能干,除了浏览网页和制作涉及到图形图像和美学的资料,命令行真的是很高效的,我们知道了这些命令之后,几乎能在Linux操作系统下按照自己的想法来管理服务器了.

要快速的学习,首先是要看日志,然后是要勤用--help选项,然后是认真看man文档,然后是多Google搜索自己遇到的问题,而且要用英文去搜才能搜出东西来.

经验分享linuxshell

8皇后问题:数学解法和启发式解法

简单数独问题的数学方程式表示