bash常用命令集锦

发布 : 2021-01-01 分类 : basics 浏览 : --

以下主要用 bash 作为终端实例

一. shell 配置

1. 输入提示 (prompt)

指的是在未输入任何命令时在终端开头的提示,可以展示当前的用户、时间、当前工作目录,甚至 git 状态。每执行完一个命令或函数之后会更新提示

输入提示由 bash 的环境变量 PS1 决定,最简单的修改方式如:

PS1='[\t] \W '

提示就会变成类似这样

[10:52:12] ~

还有更高端的github上的配置,自己的配置就是基于这个版本的修改版

2. 命令自动补全

随着系统的使用时间越来越长,免不了会装各种命令程序,最终可能会有成千上万的可执行命令,如果不是常用命令,很难一次就输入正确,虽然也比较浪费时间,所以一个命令补全显得十分有必要

大多数linux的发行版本里都会有最基本的命令补全,当在命令行输入 ls 时,按下两次 tab ,应该会得到以下输出:

1
2
$ ls
ls lsappinfo lsbom lskq lsm lsmp lsof lsvfs

会在下一行开始,显示出所有以 ls 开头的命令

当输入的长度对应的可选命令只有一个候选时,按下一次 tab 即可完全补全命令,如果侯选命令都有比输入更长的相同开头,一次 tab 会补全到那个更长的开头

比如候选命令包括

abc abd abe

那么输入 a 后一次 tab 即可补全到 ab

当然还有命令级别的自动补全,比如 apt , npm , pip 这些命令都是提供了参数级别的自动补全,不过需要配置就是了,比如需要安装 bash-completion,然后将对应的补全脚本放在合适的地方,补全脚本可能是原本在安装软件的时候提供的,程序自己也可以提供这样的补全脚本,提示用户放在正确的位置。

比如执行 npm completion ,会输出补全脚本,其中注释里会提示

1
2
3
4
5
6
#
# npm command completion script
#
# Installation: npm completion >> ~/.bashrc (or ~/.zshrc)
# Or, maybe: npm completion > /usr/local/etc/bash_completion.d/npm
#

这些补全脚本可以极大的提高命令使用的舒适度

自动补全大小写忽略

如果有时候命令或者参数里包含大写的字符,可能输入会麻烦一点,所以可以进一步偷懒

执行 echo 'set completion-ignore-case on' >> ~/.inputrc 即可,在下一次开启bash实例的时候就会生效,多用在自动匹配文件名上

3. bash启动提示

即在每次开启bash时输出的提示,类似这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 _______________________________________
/ Martin was probably ripping them off. \
| That's some family, isn't it? Incest, |
| prostitution, fanaticism, software. |
| |
\ -- Charles Willeford, "Miami Blues" /
---------------------------------------
\ ,+*^^*+___+++_
\ ,*^^^^ )
\ _+* ^**+_
\ +^ _ _++*+_+++_, )
_+^^*+_ ( ,+*^ ^ \+_ )
{ ) ( ,( ,_+--+--, ^) ^\
{ (@) } f ,( ,+-^ __*_*_ ^^\_ ^\ )
{:;-/ (_+*-+^^^^^+*+*<_ _++_)_ ) ) /
( / ( ( ,___ ^*+_+* ) < < \
U _/ ) *--< ) ^\-----++__) ) ) )
( ) _(^)^^)) ) )\^^^^^))^*+/ / /
( / (_))_^)) ) ) ))^^^^^))^^^)__/ +^^
( ,/ (^))^)) ) ) ))^^^^^^^))^^) _)
*+__+* (_))^) ) ) ))^^^^^^))^^^^^)____*^
\ \_)^)_)) ))^^^^^^^^^^))^^^^)
(_ ^\__^^^^^^^^^^^^))^^^^^^^)
^\___ ^\__^^^^^^))^^^^^^^^)\\
^^^^^\uuu/^^\uuu/^^^^\^\^\^\^\^\^\^\
___) >____) >___ ^\_\_\_\_\_\_\)
^^^//\\_^^//\\_^ ^(\_\_\_\)
^^^ ^^ ^^^ ^

精心设计的字符画,加上一段名言,也可以五彩缤纷的

基本原理就是在每次bash开始时,会按顺序导入一堆配置文件,执行命令或者修改环境变量等等

这里可以修改和用户最近的配置文件 $HOME/.bashrc ,这里能发现很多重要的配置,很多地方都会用到

个人配置如下(命令大概需要额外安装):

1
2
3
cows=(beavis.zen blowfish bong bud-frogs bunny cheese cower daemon default dragon-and-cow dragon elephant-in-snake elephant eyes flaming-sheep ghostbusters hellokitty kiss kitty koala kosh luke-koala meow milk moofasa moose mutilated ren satanic sheep skeleton small stegosaurus stimpy supermilker surgery three-eyes turkey turtle tux udder vader-koala vader www)
cow=${cows[$(($RANDOM % ${#cows[@]}))]}
fortune -s computers | cowsay -f $cow | lolcat

大概输出过程包括随机选择字符画模板,输出名言,字符画,彩虹输出

4. 命令快捷方式

核心就是 alias 函数

大多数能看到的最多的使用场景,应该是 ls 命令

比如实际执行 ls 的时候,会出现彩色的输出

可以在 $HOME/.bashrc 里看到

1
2
3
4
alias ls='ls --color=auto'
alias l='ls'
alias ll='ls -l'
alias la='ls -a'

意思就是在执行 ls 时,其实自带里一个参数 --color=auto

在执行 ll 的时候,其实执行的是 ls -l

自己比较常用的方式还包括

1
2
alias blogs='ssh blogserver'  # ssh到blogserver时,仅需要执行 blogs 即可 (当然,这需要ssh配置正确)
alias mysqlMaster='mysql -hxxx.xxx -uxxx -pxxx -A' # mysql登陆到服务器时,只需要执行 mysqlMaster 即可,风险在于密码明文化了

如果想要跳过快捷方式,直接执行命令,比如 ls ,那么用完整的命令路径即可,如 /bin/ls ,可以通过 which ls 找到 ls 的完整命令路径

二. 常用命令

资源管理

ls

当之无愧最常用的命令,列出当前或指定路径的文件信息,除了最基本的 ls 无参数执行外,还有 ls -l

有一个不常用,但是曾经解救人于危难的参数 ls -li

输出如:

1
2
3
4
$ ls -li
total 8
4325380 -rwxr-xr-x 1 root root 527 Nov 17 10:21 a.sh
4325379 -rwxr-xr-x 1 root root 530 Nov 17 10:16 b.sh

第一列输出了文件的 inode 号,是某个文件在一个分区上的唯一索引号,如果两个文件的索引号一致,那肯定是同一个文件。当一个文件的文件名不能在终端上显示为参数时,这个索引号就很重要了

比如要删除一个特殊文件名的文件 - 或者乱码的文件 (在终端里用unrar解压一个Windows环境下压缩的rar文件)

首选需要找到要删除文件的inode号,然后用 find 执行删除 find . -inum {inode} -delete 或者删除目录 find . -inum {inode} -exec rm -rf {} +

控制 ls 染色

通过环境变量 LS_COLORS ,写在 .bashrc 即可

示例:

1
export LS_COLORS="*.yml=01;35:$LS_COLORS"

*.yml 染为紫色

ln

全称应该叫 link ,用于生成链接,一般是硬连接或者软连接

软连接是创建一个文件,并指向目标文件(linux中一切皆文件),目的是创建一个文件的快捷方式,删除之后,只是把快捷方式删除而已,不影响目标文件

通过 ln -s 创建

1
2
3
4
5
6
7
8
9
10
# echo fine > linux
# ls
linux
# ln -s linux l
# ls
l linux
# ls -li
total 4
917674 lrwxrwxrwx 1 root root 5 Jan 1 13:09 l -> linux
917673 -rw-r--r-- 1 root root 5 Jan 1 13:09 linux

硬连接让一个文件拥有多个可用路径,可以用于备份,防止误删除等

1
2
3
4
5
6
# ln linux h
# ls -li
total 8
917673 -rw-r--r-- 2 root root 5 Jan 1 13:09 h
917673 -rw-r--r-- 2 root root 5 Jan 1 13:09 linux
917674 lrwxrwxrwx 1 root root 5 Jan 1 13:09 l -> linux

创建硬连接比软连接更简单,没有 -s 参数,创建的硬连接和源文件指向同一个文件,可以看到两者 inode 索引相同,和软连接不一样,本身也并没有导致磁盘空间占用的翻倍。

软硬连接对比:

  1. 软连接创建了新的文件,硬连接并没有
  2. 软连接可以连接到文件系统内任何地方,硬连接限制在当前设备,否则会报错 Invalid cross-device link,这和文件系统有关
  3. 硬连接会增加文件索引数,如上面展示的 ls -li 结果中的第三列,由原本的 1 增长为 2,表示该文件的硬连接数为 2,软连接不会增加该指数

特别点:一个目录的硬连接数 = 子目录数 + 2

一个目录的每个子目录都会有一个硬连接叫 .. 指向父路径,所以是 子目录数 ,该目录自身是一个文件,所以硬连接数 +1 ,然后该目录里还有一个 . 指向当前路径,所以硬连接数 +1

rm

万能删除 rm -rf xxx ,除了 / 大概都能通通删掉

cd

change directory 切换当前路径

默认动作:

cd 回到用户 home 目录

cd - 回到前一个目录

mkdir

创建目录

mkdir -p a/b/c/d 一路创建目录到 a

lsof

端口资源查看,如查看某端口被那个进程占用

1
2
3
4
5
# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 7775 root 10u IPv4 932993 0t0 TCP *:http (LISTEN)
nginx 30628 nobody 10u IPv4 932993 0t0 TCP *:http (LISTEN)
nginx 30629 nobody 10u IPv4 932993 0t0 TCP *:http (LISTEN)
df

展示硬盘占用情况

du

展示给定路径的资源占用

组合命令: du -hc . | tail -n 1 获取当前目录总大小

find

搜索文件

按照文件名搜索: find . -name \*.py 搜索当前路径下所有 .py 文件

按照文件类型搜索: find . -type d 搜索当前路径下所有目录类型

tree

按照树形结构展示目标路径:

1
2
3
4
5
# tree x
x
├── h
├── l -> linux
└── linux
netstat

查看端口占用情况

1
2
3
4
5
# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:26381 0.0.0.0:* LISTEN 16693/redis-sentine
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7775/nginx: master

常用组合 netstat -ntpl

进程管理

ps

进程列表

常用组合 ps -ef | grep xxx: 搜索给定进程

1
2
3
4
5
ps -ef | grep nginx
root 7775 1 0 2020 ? 00:00:00 nginx: master process nginx
root 27452 23960 0 13:55 pts/1 00:00:00 grep nginx
nobody 30628 7775 0 2020 ? 00:00:31 nginx: worker process
nobody 30629 7775 0 2020 ? 00:00:00 nginx: worker process

各列分别表示:用户,进程号,父进程号,class,进程开始时间,TTY,CPU时间,命令

kill

给指定进程发送信号,不仅仅是 SIGKILL

一般先通过 ps 找到目标进程id,kill -9 {pid}

htop

动态展示系统进程状态 (比 top 直观)

工具类

文本处理程序

如:awk, grep, tail, head, less, more, cat, sort

每个命令都很少单独使用,大多数时候都是组合在一起

例子:

  • docker同时持续查看多个容器日志的关键词
1
docker ps | grep xxx | awk '{print $1}' | xargs docker inspect --format {{.LogPath}} | xargs tail -f | grep keyword
ssh

通过ssh协议访问目标机器

首先生成ssh 公钥密钥对

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ssh-keygen -t ecdsa -C hellflame
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa): key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in key.
Your public key has been saved in key.pub.
The key fingerprint is:
SHA256:c1a7ZLBJEHNA7Q5oZ3Ud9lMQ7rcm4yaHNpsdIxc2uyA hellflame
The key's randomart image is:
+---[ECDSA 256]---+
| .*+. .=+.|
| +o .o...|
| . oo.. ...|
| o +..= o .|
| . oSo= ++. .|
| +.o..+..|
| E ooB o |
| .=BoB |
| .o*+ |
+----[SHA256]-----+
# ls
key key.pub

然后在服务端部署公钥

key.pub 里的内容写进服务端 $HOME/.ssh/authorized_keys,如果没有这个文件,创建之后,文件权限需要限制只允许当前用户有读权限

一般为了安全,在服务端可设置仅允许通过 ssh key 登陆,在 /etc/ssh/sshd_config 配置 PasswordAuthentication no ,拒绝密码登陆

更新之后重启sshd即可

1
service sshd restart

配置本地ssh公钥

在当前客户端,$HOME/.ssh/config 文件中添加配置如:

1
2
3
4
5
Host xxx.xx.xx.x
IdentityFile /path/to/key
User root # 服务器登陆用户名
ServerAliveInterval 30
ServerAliveCountMax 3

其中 /path/to/key 指向刚生成的密钥路径

本文作者 : hellflame
原文链接 : https://hellflame.github.io/2021/01/01/bash-command-summary/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
留下足迹
点击通过issue留言