101-Linux-命令-全-
101 Linux 命令(全)
原文:
bobbyiliev/101-linux-commands译者:飞龙
101 Linux 命令开源电子书
这是一本开源的电子书,包含 101 个每个人都应该知道的 Linux 命令。无论你是 DevOps/SysOps 工程师、开发者,还是仅仅是一个 Linux 爱好者,你很可能在职业生涯的某个时刻需要使用终端。
Hacktoberfest
这本电子书得以实现,多亏了 Hacktoberfest 和开源社区的支持!
关于我
我的名字是 Bobby Iliev,自 2014 年以来一直担任 Linux DevOps 工程师。我是一个狂热的 Linux 爱好者,也是开源运动哲学的支持者。我总是做那些我不能做的事情,以便我学会如何做,我相信知识共享。
我认为始终保持专业,并让自己置身于好人之中,努力工作,对每个人都友好是至关重要的。你必须比其他人保持持续的高水平表现。这是真正专业人士的标志。
如需更多信息,请访问我的博客 bobbyiliev.com,在 Twitter 上关注我 @bobbyiliev_ 以及 YouTube。
DigitalOcean
DigitalOcean 是一个云服务平台,为开发者提供他们所喜爱的简单性,为企业信任在规模上运行生产应用程序。
它提供高度可用、安全且可扩展的计算、存储和网络解决方案,帮助开发者更快地构建优秀的软件。
DigitalOcean 于 2012 年成立,在纽约和马萨诸塞州的剑桥设有办公室,提供透明且价格合理的定价,优雅的用户界面,以及最大的开源资源库之一。
如需更多信息,请访问 www.digitalocean.com 或在 Twitter 上关注 @digitalocean。
如果你刚开始使用 DigitalOcean,你可以通过这个推荐链接获得免费 $200 信用额度并启动自己的服务器:
DevDojo
DevDojo 是一个学习所有关于网页开发和网页设计的资源。利用午餐时间学习,或者醒来后和我们一起享受一杯咖啡,学习新知识。
加入这个开发者社区,我们可以一起学习,一起建设,一起成长。
如需更多信息,请访问 www.devdojo.com 或在 Twitter 上关注 @thedevdojo。
电子书生成工具
这本电子书是由 Ibis Next 生成的,由 Roberto Butti 开发,该工具是从原始的 Ibis 由 Mohamed Said 分支出来的。
Ibis Next 是一个 PHP 工具,帮助你用 Markdown 编写电子书,并支持生成 PDF、EPUB 和 HTML 格式。
封面
本电子书的封面由 苏海尔·卡卡尔 设计。
许可证
MIT 许可证
版权所有 (c) 2020 博比·伊列夫
任何人免费获得本软件及其相关文档副本(“软件”)的副本,均可不受限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件的副本,并允许向软件提供者提供软件的人这样做,前提是遵守以下条件:
上面的版权声明和本许可声明应包含在软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,包括但不限于适销性、特定用途的适用性和非侵权性保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论这些责任是因合同行为、侵权行为或其他行为引起的,无论这些责任是否与软件或其使用或其他方式有关。
ls 命令
ls 命令让您可以看到特定目录内的文件和目录(默认为当前工作目录)。它通常按升序字母顺序列出文件和目录。
示例:
- 要显示当前工作目录内的文件:
ls
- 要显示特定目录内的文件和目录:
ls {Directory_Path}
- 以人类可读的大小列出所有文件(包括隐藏文件)的详细信息:
ls -lah
- 按修改时间排序文件,最新的先:
ls -lt
- 按大小列出文件,最大的先:
ls -lhS
- 仅显示当前路径中的目录:
ls -d */
- 列出所有文本文件及其详细信息:
ls -lh *.txt
- 递归列出子目录中的所有文件:
ls -R
语法:
ls [-OPTION] [DIRECTORY_PATH]
交互式训练
在这个交互式教程中,您将学习使用 ls 命令的不同方法:
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-l |
- | 以长格式显示结果 |
-S |
- | 按文件大小排序结果 |
-t |
- | 按修改时间排序结果 |
-r |
--reverse |
以相反的顺序显示文件和目录(降序字母顺序) |
-a |
--all |
显示所有文件,包括隐藏文件(以点 . 开头的文件名) |
-la |
- | 显示包括隐藏文件在内的长格式文件和目录 |
-lh |
- | 以可读大小列出长格式文件和目录 |
-A |
--almost-all |
显示所有文件,与 -a 相同,但不显示 .(当前工作目录)和 ..(父目录) |
-d |
--directory |
不列出目录内的文件和目录,而是显示有关目录本身的信息,可以与 -l 一起使用以显示长格式信息 |
-F |
--classify |
在每个列出的名称末尾附加一个指示字符,例如:在每个目录名称后附加 / 字符 |
-h |
--human-readable |
与 -l 相同,但以人类可读的单位显示文件大小,而不是字节 |
-i |
--inode |
显示每个文件的 inode 号 |
-R |
--recursive |
递归列出子目录 |
-1 |
- | 每行列出一个文件 |
-c |
- | 按更改时间(文件元数据最后更改的时间)排序 |
-u |
- | 按访问时间(文件最后访问的时间)排序 |
-X |
- | 按文件扩展名字母顺序排序 |
| - | --color=auto |
将输出着色以区分文件类型 |
-g |
- | 与 -l 相同,但不显示所有者 |
-o |
- | 与 -l 相同,但不显示组 |
-C |
- | 按列列出条目 |
-s |
--size |
打印每个文件的分配大小 |
| - | --group-directories-first |
在文件之前列出目录 |
文件类型指示符:
当使用 -F 或 --classify 标志时,ls 会将特殊字符附加到文件名上以指示其类型:
| 指示符 | 文件类型 | 示例 |
|---|---|---|
/ |
目录 | docs/ |
* |
可执行文件 | script.sh* |
@ |
符号链接 | link@ |
| |
FIFO(命名管道) | pipe| |
= |
套接字 | socket= |
| 无指示符 | 普通文件 | file.txt |
示例:
ls -F
documents/ script.sh* link@ data.txt pipe| socket=
基于 Red Hat 的系统上的 SELinux 支持:
在使用基于 Red Hat 的发行版(RHEL、CentOS、Fedora、Rocky Linux、AlmaLinux)且使用 SELinux 的系统上,ls 命令提供了额外的选项来显示 SELinux 安全上下文信息:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-Z |
--context |
显示文件和目录的 SELinux 安全上下文 |
-lZ |
- | 显示带有 SELinux 安全上下文的长格式 |
示例输出:
ls -Z
unconfined_u:object_r:user_home_t:s0 file.txt
unconfined_u:object_r:user_home_t:s0 directory
ls -lZ
-rw-rw-r--. 1 user user unconfined_u:object_r:user_home_t:s0 1234 Jan 15 10:30 file.txt
drwxrwxr-x. 2 user user unconfined_u:object_r:user_home_t:s0 4096 Jan 15 10:25 directory
SELinux 上下文格式为:用户:角色:类型:级别
注意: -Z 选项仅在启用了 SELinux 的系统上有效。在非 SELinux 系统上,此选项可能不可用或不会显示任何附加信息。
理解长格式输出:
当使用 ls -l 时,每一行都会显示关于文件或目录的详细信息:
-rw-r--r-- 1 user group 1234 Jan 15 10:30 file.txt
列分解:
-
文件类型和权限 (
-rw-r--r--):-
第一个字符:文件类型(
-= 普通文件,d= 目录,l= 符号链接,b= 块设备,c= 字符设备,p= 管道,s= 套接字) -
接下来的 9 个字符:三个组(所有者、组、其他人)的权限
r= 读取,w= 写入,x= 执行,-= 没有权限
-
-
链接计数 (
1): 文件到硬链接的数量 -
所有者 (
user): 文件所有者的用户名 -
组 (
group): 文件所属的组名 -
大小 (
1234): 文件大小(以字节为单位)(使用-h标志以人类可读格式显示,如1.2K,3.4M) -
修改时间 (
Jan 15 10:30): 文件最后修改的日期和时间 -
文件名 (
file.txt): 文件或目录的名称
带人类可读大小的示例:
ls -lh
drwxr-xr-x 2 user group 4.0K Jan 15 10:25 documents
-rwxr-xr-x 1 user group 2.3M Jan 14 09:15 script.sh
-rw-r--r-- 1 user group 15K Jan 16 14:30 data.csv
使用通配符和模式:
ls 命令支持通配符进行模式匹配:
| 通配符 | 描述 | 示例 | 匹配 |
|---|---|---|---|
* |
匹配任意数量的字符 | ls *.txt |
所有以 .txt 结尾的文件 |
? |
匹配恰好一个字符 | ls file?.txt |
file1.txt, file2.txt,但不包括 file10.txt |
[] |
匹配括号内的任意字符 | ls file[123].txt |
file1.txt, file2.txt, file3.txt |
[!] |
匹配括号外的任意字符 | ls file[!3].txt |
file1.txt, file2.txt,但不包括 file3.txt |
{} |
匹配任何由逗号分隔的模式 | ls *.{jpg,png,gif} |
所有具有这些扩展名的图像文件 |
示例:
# List all PDF and DOCX files
ls *.{pdf,docx}
# List files starting with 'test' followed by a single digit
ls test?.log
# List all files starting with uppercase letters
ls [A-Z]*
# List all hidden configuration files
ls .config*
基于 Red Hat 的系统上的 SELinux 支持:
在使用基于 Red Hat 的发行版(RHEL、CentOS、Fedora、Rocky Linux、AlmaLinux)且使用 SELinux 的系统上,ls 命令提供了额外的选项来显示 SELinux 安全上下文信息:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-Z |
--context |
显示文件和目录的 SELinux 安全上下文 |
-lZ |
- | 显示带有 SELinux 安全上下文的长格式 |
示例输出:
ls -Z
unconfined_u:object_r:user_home_t:s0 file.txt
unconfined_u:object_r:user_home_t:s0 directory
ls -lZ
-rw-rw-r--. 1 user user unconfined_u:object_r:user_home_t:s0 1234 Jan 15 10:30 file.txt
drwxrwxr-x. 2 user user unconfined_u:object_r:user_home_t:s0 4096 Jan 15 10:25 directory
SELinux 上下文格式为:用户:角色:类型:级别
注意: -Z 选项仅在启用了 SELinux 的系统上有效。在非 SELinux 系统上,此选项可能不可用或不会显示任何附加信息。
设置持久选项:
使用 alias 命令在 Linux 中自定义命令行为很容易。要使这些更改永久生效,请按照以下步骤操作:
-
创建别名: 使用所需选项定义您的别名。例如,要增强
ls命令:alias ls="ls --color=auto -lh" -
持久性: 此别名仅对当前会话有效。要使其永久生效,请将别名添加到您的 shell 配置文件中:
-
Bash: 将别名追加到
~/.bashrc:echo 'alias ls="ls --color=auto -lh"' >> ~/.bashrc source ~/.bashrc
-
-
验证: 打开一个新的终端会话,
ls命令将按配置显示文件。
性能提示:
1. 避免在大目录上进行递归列出:
-
在具有许多子目录和文件的目录上,
-R标志可能会很慢 -
考虑使用
find命令以获得更多控制:find /path -type f
2. 在脚本中禁用颜色输出:
-
在管道输出或脚本中使用
--color=never以提高性能 -
示例:
ls --color=never | grep pattern
3. 限制大目录的输出:
-
与
head结合使用,仅查看前几个条目:ls -1 | head -n 20 -
或者使用
ls -1 | wc -l仅计算文件数量而不显示它们
**4. 在可能的情况下,使用特定路径而不是通配符:
- 当你知道确切的文件名时,
ls /var/log/syslog比使用ls /var/log/sys*更快
常见用例:
1. 查找目录中最大的文件:
ls -lhS | head -n 10
2. 仅列出目录:
ls -d */
或者,使用完整细节:
ls -ld */
3. 计算目录中的文件数量:
ls -1 | wc -l
4. 列出过去 24 小时内修改的文件:
ls -lt | head
5. 按扩展名显示文件:
ls -lX
6. 列出带有其 inode 编号的文件(对调试很有用):
ls -li
7. 每行显示目录内容(对脚本很有用):
ls -1
8. 结合多个排序选项(大小 + 逆序):
ls -lhSr
cd 命令
cd 命令用于更改当前工作目录(即当前用户正在工作的目录)。"cd" 代表 "change directory",它是 Linux 终端中最常用的命令之一。
cd 命令通常与 ls 命令(见第一章)结合使用,用于在系统中导航。您也可以按 TAB 键自动完成目录名,或者按 TAB 键两次以列出当前位置可用的目录。
语法:
cd [OPTIONS] [directory]
基本示例:
- 切换到特定目录:
cd /path/to/directory
- 切换到您的家目录:
cd ~
OR simply:
cd
- 切换到上一个目录:
cd -
这也将打印上一个目录的绝对路径。
- 切换到系统的根目录:
cd /
- 向上移动一个目录层级(父目录):
cd ..
- 向上移动多个目录层级:
cd ../../..
此示例向上移动三个层级。
实际示例:
使用相对路径:
cd Documents/Projects/MyApp
使用绝对路径:
cd /usr/local/bin
与家目录快捷键结合使用:
cd ~/Downloads
导航到具有空格名称的目录:
cd "My Documents"
OR
cd My\ Documents
在两个目录之间切换:
cd /var/log
cd /etc
cd - # Returns to /var/log
cd - # Returns to /etc
其他标志及其功能
| 短标志 | 长标志 | 描述 |
|---|---|---|
-L |
- | 跟随符号链接(默认行为)。cd 命令将跟随符号链接并将工作目录更新为目标位置。 |
-P |
- | 使用不跟随符号链接的物理目录结构。显示实际路径而不是符号链接路径。 |
-L 与 -P 与符号链接的示例:
# Assume /var/www is a symlink to /home/user/webcd -L /var/www # Working directory shows as /var/www
pwd # Outputs: /var/www
cd -P /var/www # Working directory resolves to actual path
pwd # Outputs: /home/user/web
常见错误和故障排除
权限被拒绝:
cd /root
# bash: cd: /root: Permission denied
解决方案:您需要适当的权限来访问该目录。如果需要,请尝试使用 sudo。
没有找到文件或目录:
cd /invalid/path
# bash: cd: /invalid/path: No such file or directory
解决方案:使用 ls 验证路径是否存在或检查是否有拼写错误。请记住,路径区分大小写。
不是目录:
cd /etc/passwd
# bash: cd: /etc/passwd: Not a directory
解决方案:确保您正在导航到目录,而不是文件。
重要提示:
-
大小写敏感: Linux 文件系统区分大小写。
cd Documents与cd documents不同。 -
特殊字符: 包含空格或特殊字符的目录名需要引用或转义。
-
cd命令是 shell 内置命令: 它不是一个外部程序,这就是为什么它可以更改 shell 的当前目录。 -
成功时无输出: 默认情况下,
cd命令在成功时不会输出任何内容(除了cd -会打印新路径)。
cat命令
cat命令允许我们创建单个或多个文件,查看文件内容,或将文件连接并重定向输出到终端或文件。
“cat”代表“连接”,它是 Linux 终端中最常用的命令之一。
使用示例:
- 要在终端中显示文件内容:
cat <specified_file_name>
- 在终端中显示多个文件的内容:
cat file1 file2 ...
- 使用 cat 命令创建文件:
cat > file_name
- 要显示当前目录中具有相同文件类型的所有文件:
cat *.<filetype>
- 要显示当前目录中所有文件的内容:
cat *
- 将给定文件的内容放入另一个文件中:
cat old_file_name > new_file_name
- 使用带有
more和less选项的 cat 命令:
cat filename | more
cat filename | less
- 将 file1 的内容追加到 file2:
cat file1 >> file2
- 将两个文件合并到一个新文件中:
cat file1_name file2_name merge_file_name
- 一些 cat 的实现,使用选项-n,可以显示行号:
cat -n file1_name file2_name > new_numbered_file_name
语法:
cat [OPTION] [FILE]...
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-A |
--show-all |
等同于 -vET |
-b |
--number-nonblank |
对非空输出行进行编号,覆盖-n |
-e |
- | 等同于 -vE |
-T |
- | 使用cat命令打开的文件中显示制表符分隔的行。 |
-E |
- | 在每个文件的末尾显示$。 |
-E |
- | 显示带行号的文件。 |
-n |
--number |
对所有输出行进行编号 |
-s |
--squeeze-blank |
抑制重复的空输出行 |
-u |
- | (忽略) |
-v |
--show-nonprinting |
使用^和 M-符号,除了 LFD 和 TAB |
| - | --help |
显示此帮助信息并退出 |
| - | --version |
输出版本信息并退出 |
tac命令
tac是 Linux 命令,允许你逐行查看文件,从最后一行开始。(tac不会反转每行的内容,只会反转行显示的顺序。)它是以cat命令命名的。
使用示例:
- 要在终端中显示文件内容:
tac <specified_file_name>
- 此选项在之前而不是之后附加分隔符。
tac -b concat_file_name tac_example_file_name
- 此选项将分隔符解释为正则表达式。
tac -r concat_file_name tac_example_file_name
- 此选项使用 STRING 作为分隔符而不是换行符。
tac -s concat_file_name tac_example_file_name
- 此选项将显示帮助文本并退出。
tac --help
- 此选项将输出版本信息并退出。
tac --version
语法:
tac [OPTION]... [FILE]...
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-b |
--before |
在之前而不是之后附加分隔符 |
-r |
--regex |
将分隔符解释为正则表达式 |
-s |
--separator=STRING |
使用 STRING 作为分隔符而不是换行符 |
| - | --help |
显示此帮助信息并退出 |
| - | --version |
输出版本信息并退出 |
head 命令
head 命令打印文件的第一个十行。
示例:
head filename.txt
语法:
head [OPTION] [FILENAME]
获取特定数量的行:
使用 -n 选项和一个数字(应为整数)来显示行数。
示例:
head -n 10 foo.txt
此命令将显示文件 foo.txt 的前十行。
语法:
head -n <number> foo.txt
其他标志及其功能
| 短标志 | 长标志 | 描述 |
|---|
| -c | --bytes=[-]NUM | 打印每个文件的第一个 NUM 字节;带有前导 '-',
打印每个文件的除最后一行外的所有字节 |
| -n | --lines=[-]NUM | 打印前 NUM 行,而不是前 10 行;带有前导 '-',
打印除最后一行外的每一行的所有内容 |
-q |
--quiet, --silent |
从不打印包含文件名的标题 |
|---|---|---|
-v |
--verbose |
总是打印包含文件名的标题 |
-z |
--zero-terminated |
行分隔符是 NUL,而不是换行符 |
--help |
显示此帮助信息并退出 | |
--version |
输出版本信息并退出 |
tail 命令
tail 命令打印文件的最后十行。
示例:
tail filename.txt
语法:
tail [OPTION] [FILENAME]
常见用例
获取特定数量的行:
使用 -n 选项和一个数字(应该是整数)的行数来显示。
示例:
tail -n 10 foo.txt
此命令将显示文件 foo.txt 的最后十行。
实时监控文件中的新条目
可以让 tail 输出你正在查看的文件中添加的任何新行。因此,如果向文件写入新行,它将立即显示在你的输出中。这可以通过使用 --follow 或 -f 选项来完成。这对于监控日志文件特别有用。
示例:
tail -f foo.txt
按 Ctrl+C 停止跟踪。
组合选项以进行日志监控
tail -n 100 -f app.log # Show last 100 lines, then follow
tail -f -s 2 slow.log # Follow with 2-second refresh interval
同时跟踪多个文件
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
显示特定的字节范围
tail -c 100 file.txt # Last 100 bytes
tail -c +50 file.txt # From byte 50 to end
即使在轮换后也继续跟踪日志
tail -F /var/log/app.log
-F 选项对于监控由 logrotate 管理的日志至关重要。
跳过标题行
tail -n +2 data.csv # Start from line 2 (skip header)
tail -n +11 file.txt # Start from line 11 onwards
多个文件的静默模式
tail -q -n 5 *.log # No filename headers
额外标志及其功能
| 短标志 | 长标志 | 描述 |
|---|
| -c | --bytes=[+]NUM | 输出最后 NUM 个字节;或使用 -c +NUM 以
输出每个文件从字节 NUM 开始的内容 |
-f |
--follow[={name|descriptor}] |
随着文件增长输出附加数据;省略选项参数表示 'descriptor' |
|---|---|---|
-F |
与 --follow=name --retry 相同 | |
-n |
--lines=[+]NUM |
输出最后 NUM 行,而不是最后 10 行;或使用 -n +NUM 以从行 NUM 开始输出 |
| | --max-unchanged-stats=N | 使用 --follow=name 时,在 N(默认 5)次迭代后重新打开未更改大小的 FILE
以查看它是否已被取消链接或重命名
(这是轮换日志文件的通常情况);
使用 inotify,此选项很少有用 |
--pid=PID |
使用 -f 时,在进程 ID,PID 死亡后终止 | |
|---|---|---|
-q |
--quiet, --silent |
从不输出包含文件名的标题 |
--retry |
如果文件不可访问,则继续尝试打开文件 |
| -s | --sleep-interval=N | 使用 -f 时,在迭代之间暂停大约 N 秒(默认 1.0);
使用 inotify 和 --pid=P,检查进程 P 在
至少每 N 秒一次 |
-v |
--verbose |
总是输出包含文件名的标题 |
|---|---|---|
-z |
--zero-terminated |
行分隔符是 NUL,而不是换行符 |
--help |
显示此帮助信息并退出 | |
--version |
输出版本信息并退出 |
小贴士
-
使用
-F而不是-f进行生产日志监控 -
与
grep、awk或sed结合进行过滤监控 -
对于大文件,使用
tail比在编辑器中打开要快得多 -
使用
-n +N从特定行开始(对于跳过标题很有用)
pwd 命令
pwd 代表打印工作目录。它从根目录开始打印当前工作目录的路径。
示例:
pwd
输出将是你的当前目录:
/home/your_user/some_directory
语法:
pwd [OPTION]
小贴士:你也可以通过打印 $PWD 变量来检查:
echo $PWD
输出将与 pwd 命令相同。
选项:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-L |
--logical |
如果环境变量 $PWD 包含当前目录的绝对名称,且没有 "." 或 ".." 组件,则输出这些内容,即使它们包含符号链接。否则,回退到默认(-P)行为。 |
-P |
--physical |
打印当前目录的完整解析名称,其中名称的所有组件都是实际目录名称,而不是符号链接。 |
--help |
显示帮助信息,并退出。 | |
--version |
显示版本信息,并退出。 |
默认情况下,pwd 的行为相当于指定了 -L。
touch 命令
touch 命令修改文件的时间戳。如果指定的文件不存在,则创建一个具有该名称的空文件。
语法
touch [OPTION]... FILE...
选项
| 短标志 | 长标志 | 描述 |
|---|---|---|
-a |
- | 仅更改访问时间。 |
-c |
--no-create |
不创建任何文件。 |
-d STRING |
--date=STRING |
解析 STRING 并使用它代替当前时间。 |
-f |
- | (忽略)此选项不执行任何操作,但接受以与 BSD 版本的 touch 命令保持兼容。 |
-h |
--no-dereference |
仅影响符号链接本身,而不是任何引用的文件(仅在可以更改符号链接时间戳的系统中使用)。此选项意味着 -c,如果文件不存在则不创建任何内容。 |
-m |
- | 仅更改修改时间。 |
-r=FILE |
--reference=FILE |
使用此文件的时间代替当前时间。 |
-t STAMP |
- | 使用数字时间 STAMP 而不是当前时间。STAMP 的格式为 [[CC]YY]MMDDhhmm[.ss]。 |
| - | --time=WORD |
另一种指定要设置哪种类型的时间的方法(例如 访问、修改 或 更改)。这与指定 -a 或 -m 等效。 |
-
WORD 是
access、atime或use:等同于-a。 -
WORD 是
modify或mtime:等同于-m。
另一种指定要设置哪种类型的时间的方法(与 -a 和 -m 相同)。| |
-|--help|显示帮助信息,并退出.| |-|--version|显示版本信息,并退出。|
示例
- 如果 file.txt 存在,则将其所有时间戳设置为当前系统时间。如果 file.txt 不存在,则创建一个具有该名称的空文件。
touch file.txt
- 如果 file.txt 存在,则将其时间设置为当前系统时间。如果它不存在,则不执行任何操作。
touch -c file.txt
- 仅更改 file.txt 的 访问 时间。修改 时间不更改。更改 时间设置为当前系统时间。如果 file.txt 不存在,则创建。
touch -a file.txt
- 更改符号链接文件 symboliclink 的时间。如果是符号链接,则更改符号链接的时间,而不是 引用文件的时间。
touch -h symboliclink
- 将 file-b.txt 的 访问 和 修改 时间更改为与 file-a.txt 的时间匹配。更改 时间将设置为当前系统时间。如果 file-b.txt 不存在,则不会创建。注意,在此上下文中,file-a.txt 必须已经存在。
touch -cr file-a.txt file-b.txt
- 将 file.txt 的 访问 时间和 修改 时间设置为当前年份的 2 月 1 日。更改 时间设置为当前系统时间。
touch -d "1 Feb" file.txt
cal 命令
cal 命令在终端中显示格式化的日历。如果没有指定选项,cal 将显示当前月份,并突出显示当前日期。
语法:
cal [general options] [-jy] [[month] year]
选项:
| 选项 | 描述 |
|---|---|
-h |
不突出显示今天的日期。 |
-m month |
指定要显示的月份。月份指定可以是完整的月份名称(例如,二月),至少三个字母的月份缩写(例如,Feb),或数字(例如,2)。如果您指定一个数字,后跟字母“f”或“p”,则分别显示下一年或前一年的该月。例如,-m 2f 将显示下年的二月。 |
-y year |
指定要显示的年份。例如,-y 1970 将显示 1970 年整年的日历。 |
-3 |
显示上个月、这个月和下个月。 |
-1 |
仅显示这个月。这是默认选项。 |
-A num |
显示在已指定月份之后发生的 num 个月。例如,-3 -A 3 将显示上个月、这个月和之后的四个月;以及-y 1970 -A 2 将显示 1970 年中的每个月,以及 1971 年的前两个月。 |
-B num |
显示在已指定月份之前发生的 num 个月。例如,-3 -B 2 将显示前三个月、这个月和下个月。 |
-d YYYY-MM |
假设当前月份是 YYYY 年 MM 月。 |
示例:
- 显示这个月的日历,并突出显示今天。
cal
- 与上一个命令相同,但不突出显示今天。
cal -h
- 显示上个月、这个月和下个月。
cal -3
- 显示整个年份的日历。
cal -y
- 显示 2000 年整年的日历。
cal -y 2000
- 与上一个命令相同。
cal 2000
- 显示今年 12 月的日历。
cal -m [December, Dec, or 12]
- 显示 2000 年 12 月的日历。
cal 12 2000
bc 命令
bc 命令提供了通过命令行执行数学计算的功能。
示例:
- 算术:
Input : $ echo "11+5" | bc
Output : 16
- 增量:
-
var –++ : 后增量运算符,首先使用变量的结果,然后增加变量。
-
– ++var : 预增量运算符,首先增加变量,然后存储变量的结果。
Input: $ echo "var=3;++var" | bc
Output: 4
- 减量:
-
var – – : 后减量运算符,首先使用变量的结果,然后减少变量。
-
– – var : 预减量运算符,首先减少变量,然后存储变量的结果。
Input: $ echo "var=3;--var" | bc
Output: 2
- 赋值:
-
var = value : 将值分配给变量
-
var += value : 类似于 var = var + value
-
var -= value : 类似于 var = var – value
-
var *= value : 类似于 var = var * value
-
var /= value : 类似于 var = var / value
-
var ^= value : 类似于 var = var ^ value
-
var %= value : 类似于 var = var % value
Input: $ echo "var=4;var" | bc
Output: 4
- 比较或关系:
-
如果比较为真,则结果为 1。否则,(false),返回 0
-
expr1<expr2 : 如果 expr1 严格小于 expr2,则结果为 1。
-
expr1<=expr2 : 如果 expr1 小于或等于 expr2,则结果为 1。
-
expr1>expr2 : 如果 expr1 严格大于 expr2,则结果为 1。
-
expr1>=expr2 : 如果 expr1 大于或等于 expr2,则结果为 1。
-
expr1==expr2 : 如果 expr1 等于 expr2,则结果为 1。
-
expr1!=expr2 : 如果 expr1 不等于 expr2,则结果为 1。
Input: $ echo "6<4" | bc
Output: 0
Input: $ echo "2==2" | bc
Output: 1
- 逻辑或布尔:
-
expr1 && expr2 : 如果两个表达式非零,则结果为 1。
-
expr1 || expr2 : 如果任一表达式非零,则结果为 1。
-
! expr : 如果 expr 为 0,则结果为 1。
Input: $ echo "! 1" | bc
Output: 0
Input: $ echo "10 && 5" | bc
Output: 1
语法:
bc [ -hlwsqv ] [long-options] [ file ... ]
其他标志及其功能:
注意:此列表并不全面。
| 短标志 | 长标志 | 描述 |
|---|---|---|
-i |
--interactive |
强制交互模式 |
-l |
--mathlib |
使用预定义的数学例程 |
-q |
--quiet |
在不打印标题的情况下打开 bc 的交互模式 |
-s |
--standard |
将非标准 bc 构造视为错误 |
-w |
--warn |
如果使用非标准 bc 构造,则提供警告 |
注意:
-
如果在脚本中使用,可以进一步欣赏
bc的功能。除了基本的算术运算外,bc还支持增量/减量、复杂计算、逻辑比较等。 -
bc中的两个标志涉及非标准构造。例如,如果你评估100>50 | bc,你会得到一个奇怪的警告。根据bc的 POSIX 页面,关系运算符仅在用于if、while或for语句时有效。
df 命令
Linux/Unix 中的 df 命令用于显示磁盘使用情况和信息。df 是 "disk free" 的缩写。
df 显示包含每个文件名参数的文件系统上的可用磁盘空间。如果没有提供文件名,则显示所有当前挂载的文件系统上的可用空间。
语法
df [OPTION]... [FILE]...
选项
| 短标志 | 长标志 | 描述 |
|---|---|---|
-a |
--all |
包含伪、重复、不可访问的文件系统。 |
-B |
--block-size=SIZE |
在打印之前按 SIZE 缩放大小;例如,-BM 以 1,048,576 字节为单位打印大小;请参阅下面的 SIZE 格式。 |
-h |
--human-readable |
以 1024 的幂次打印大小(例如,1023M)。 |
-H |
--si |
以 1000 的幂次打印大小(例如,1.1G)。 |
-i |
--inodes |
列出 inode 信息而不是块使用情况。 |
-k |
- | 类似于 --block-size=1K。 |
-l |
--local |
限制列出本地文件系统。 |
- |
--no-sync |
在获取使用信息之前不调用 sync(默认)。 |
- |
--output[=FIELD_LIST] |
使用由 FIELD_LIST 定义的输出格式,或者如果省略 FIELD_LIST,则打印所有字段。 |
-P |
--portability |
使用 POSIX 输出格式 |
- |
--sync |
在获取使用信息之前调用同步。 |
- |
--total |
省略对可用空间不重要的所有条目,并生成总计数。 |
-t |
--type=TYPE |
限制列出类型为 TYPE 的文件系统。 |
-T |
--print-type |
打印文件系统类型。 |
-x |
--exclude-type=TYPE |
限制列出不是类型 TYPE 的文件系统。 |
-v |
- | 忽略;包含以兼容性原因。 |
- |
--help |
显示帮助信息并退出。 |
- |
--version |
输出版本信息并退出。 |
示例:
- 显示可用磁盘空间 操作: --- 输出可用磁盘空间和目录挂载位置
详情: --- 输出的值不可读(以字节为单位)
命令:
df
- 以可读形式显示可用磁盘空间 操作: --- 输出可用磁盘空间和目录挂载位置
详情: --- 输出的值是可读的(以 GBs/MBs 为单位)
命令:
df -h
- 显示特定文件系统的可用磁盘空间 操作: --- 输出可用磁盘空间和目录挂载位置
详情: --- 输出的值仅适用于选定的文件系统
命令:
df -hT file_system_name
- 显示可用 inode 操作: --- 输出所有文件系统的可用 inode
详情: --- 输出的值适用于 inode 而不是可用空间
命令:
df -i
- 显示文件系统类型 操作: --- 输出文件系统类型
详情: --- 输出的值适用于所有文件系统
命令:
df -T
- 从输出中排除文件系统类型 操作: --- 输出信息时排除选定的文件系统类型
详情: --- 输出的值适用于所有文件系统,除了选定的文件系统类型
命令:
df -x file_system_type
help 命令
help 命令显示有关内置命令的信息。显示有关内置命令的信息。
如果指定了 PATTERN,则此命令会提供与 PATTERN 匹配的所有命令的详细帮助,否则会打印可用的帮助主题列表。
快速提示:
help命令仅适用于本身是 Bash shell 内置的命令(如cd、pwd、echo、read)。它对独立程序(如ls、grep或find)不起作用。要获取这些程序的帮助,应使用man命令(例如,man ls)。
语法
$ help [-dms] [PATTERN ...]
选项
| 选项 | 描述 |
|---|---|
-d |
为每个主题输出简短描述。 |
-m |
以伪手册页格式显示用法。 |
-s |
仅输出与提供的 PATTERN 匹配的每个主题的简短用法摘要。 |
使用示例:
- 我们可以获取
cd命令的完整信息
$ help cd
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.
Change the current directory to DIR. The default DIR is the value of the
HOME shell variable.
...
(additional details about options and exit status follow)
- 我们可以获取关于
pwd命令的简短描述
$ help -d pwd
pwd: pwd [-LP]
Print the name of the current working directory.
- 我们可以获取
cd命令的语法
$ help -s cd
cd [-L|[-P [-e]] [-@]] [dir]
factor 命令
factor 命令打印每个指定的整数 NUMBER 的质因数。如果命令行上没有指定,它将从标准输入读取。
语法
$ factor [NUMBER]...
OR:
$ factor OPTION
选项
| 选项 | 描述 |
|---|---|
--help |
显示此帮助信息并退出。 |
--version |
输出版本信息并退出。 |
示例
- 打印质数的质因数。
$ factor 50
- 打印非质数的质因数。
$ factor 75
uname 命令
uname 命令允许您打印系统信息,默认输出内核名称。
语法:
$ uname [OPTION]
示例
- 打印所有系统信息。
$ uname -a
- 打印内核版本。
$ uname -v
选项
| 短标志 | 长标志 | 描述 |
|---|---|---|
-a |
--all |
打印所有信息,如果未知则省略处理器和硬件平台。 |
-s |
--kernel-name |
打印内核名称。 |
-n |
--nodename |
打印网络节点主机名。 |
-r |
--kernel-release |
打印内核发布版本。 |
-v |
--kernel-version |
打印内核版本。 |
-m |
--machine |
打印机器硬件名称。 |
-p |
--processor |
打印处理器类型(非便携式)。 |
-i |
--hardware-platform |
打印硬件平台(非便携式)。 |
-o |
--operating-system |
打印操作系统。 |
mkdir命令
mkdir命令用于在 Linux/Unix 系统中创建目录(文件夹)。它是最基本的文件系统命令之一,提供了创建单个目录、多个目录和嵌套目录结构的各种选项。
语法
mkdir [OPTIONS] DIRECTORY [DIRECTORY ...]
关键特性
-
单个目录创建:创建单个目录
-
多目录创建:一次创建多个目录
-
嵌套目录创建:自动创建父目录
-
权限设置:在创建时设置目录权限
-
详细输出:显示创建进度
-
SELinux 支持:设置安全上下文
基本用法
创建单个目录
# Create a directory in current location
mkdir mydir
# Create directory with absolute path
mkdir /home/user/documents
# Create directory in home directory
mkdir ~/projects
创建多个目录
# Create multiple directories at once
mkdir dir1 dir2 dir3
# Create directories with different paths
mkdir ~/documents ~/downloads ~/pictures
# Create numbered directories
mkdir project{1,2,3,4,5}
# Create directories with ranges
mkdir folder{01..10}
高级用法
创建嵌套目录
# Create nested directory structure (creates parent directories)
mkdir -p projects/web/frontend/src
# Create complex directory structure
mkdir -p company/{departments/{hr,finance,it},projects/{web,mobile,desktop}}
# Create directory structure with absolute path
mkdir -p /opt/myapp/{bin,config,logs,data}
创建时设置权限
# Create directory with specific permissions (755)
mkdir -m 755 public_dir
# Create directory with full permissions for owner only (700)
mkdir -m 700 private_dir
# Create directory with read/write for owner, read for group and others (644)
mkdir -m 644 shared_dir
# Create directory with full access for everyone (777)
mkdir -m 777 temp_dir
# Using symbolic notation
mkdir -m u=rwx,g=rx,o=rx public_folder
详细模式
# Show what directories are being created
mkdir -v newdir
# Verbose with multiple directories
mkdir -v dir1 dir2 dir3
# Verbose with nested structure
mkdir -pv projects/{frontend/{src,dist},backend/{api,database}}
实际示例
项目结构创建
# Create a typical web project structure
mkdir -p mywebsite/{css,js,images,includes,admin}
# Create a software project structure
mkdir -p myproject/{src/{main,test},docs,build,config}
# Create a backup directory structure
mkdir -p backups/{daily,weekly,monthly}/{system,database,files}
系统管理
# Create log directories for an application
sudo mkdir -p /var/log/myapp/{error,access,debug}
# Create configuration directories
sudo mkdir -p /etc/myapp/{conf.d,ssl,keys}
# Create data directories with proper permissions
sudo mkdir -p /var/lib/myapp/data
sudo mkdir -m 750 /var/lib/myapp/secure
用户环境设置
# Set up user development environment
mkdir -p ~/development/{projects,tools,scripts}
mkdir -p ~/development/projects/{personal,work,opensource}
# Create organization directories
mkdir -p ~/documents/{work,personal,finance,education}
mkdir -p ~/documents/work/{reports,presentations,spreadsheets}
与特殊字符一起工作
包含空格的目录
# Create directory with spaces (use quotes)
mkdir "My Documents"
mkdir 'Project Files'
# Create multiple directories with spaces
mkdir "Dir One" "Dir Two" "Dir Three"
# Using escape characters
mkdir My\ Documents
特殊字符
# Create directories with special characters
mkdir "data-2024"
mkdir "backup_$(date +%Y%m%d)"
mkdir "temp.$(whoami)"
# Avoid problematic characters
mkdir project_2024 # Better than "project 2024"
mkdir user_data # Better than "user's data"
错误处理和验证
常见错误场景
# Check if directory exists before creatingif [ ! -d "mydir" ]; then
mkdir mydir
echo "Directory created"
else
echo "Directory already exists"
fi
# Create directory only if parent exists
mkdir subdir # Fails if current directory doesn't exist
mkdir -p parentdir/subdir # Creates both if needed
安全目录创建
# Function to safely create directoriescreate_safe_dir() {
if mkdir -p "$1" 2>/dev/null; then
echo "Created directory: $1"
else
echo "Failed to create directory: $1"
return 1
fi
}
# Usage
create_safe_dir "/path/to/new/directory"
与其他命令结合使用
目录创建和导航
# Create directory and immediately change to it
mkdir myproject && cd myproject
# Create and navigate in one command (function)
mkcd() {
mkdir -p "$1" && cd "$1"
}
mkcd ~/projects/newproject
创建包含文件的目录
# Create directory structure and add files
mkdir -p project/{src,docs,tests}
touch project/src/main.py
touch project/docs/README.md
touch project/tests/test_main.py
# Create directory and set up basic files
mkdir website
cd website
mkdir {css,js,images}
touch index.html css/style.css js/script.js
批量操作
# Create directories from a list
cat > dirlist.txt << EOF
projects/web
projects/mobile
projects/desktop
documents/reports
documents/presentations
EOF
# Create all directories from file
while read dir; do
mkdir -p "$dir"
done < dirlist.txt
权限和所有权
创建后设置所有权
# Create directory and set ownership
mkdir myapp
sudo chown user:group myapp
# Create with specific permissions and ownership
sudo mkdir -m 755 /opt/myapp
sudo chown user:group /opt/myapp
为不同用户创建目录
# Create user-specific directories
sudo mkdir -p /home/newuser/{Documents,Downloads,Pictures}
sudo chown -R newuser:newuser /home/newuser
sudo chmod 755 /home/newuser
SELinux 上下文
设置 SELinux 上下文
# Create directory with specific SELinux context
mkdir -Z user_home_t user_data
# Create directory and set context afterward
mkdir secure_data
sudo semanage fcontext -a -t httpd_exec_t "/path/to/secure_data(/.*)?"
sudo restorecon -R /path/to/secure_data
故障排除
常见问题和解决方案
# Permission denied
sudo mkdir /restricted/path # Use sudo for system directories
# Parent directory doesn't exist
mkdir -p path/to/deep/directory # Use -p flag
# Directory already exists
mkdir -p existing_dir # -p prevents error if directory exists
# Invalid characters in name
mkdir "valid_name" # Use quotes or escape special characters
调试目录创建
# Check available space before creating
df -h .
# Verify parent directory permissions
ls -ld parent_directory
# Check if directory was created successfully
if [ -d "newdir" ]; then
echo "Directory created successfully"
ls -ld newdir
fi
选项参考
| 选项 | 长格式 | 描述 |
|---|---|---|
-m MODE |
--mode=MODE |
为创建的目录设置文件模式(权限) |
-p |
--parents |
如有必要创建父目录,如果已存在则无错误 |
-v |
--verbose |
为每个创建的目录打印消息 |
-Z CTX |
--context=CTX |
设置 SELinux 安全上下文 |
--help |
- | 显示帮助信息并退出 |
--version |
- | 输出版本信息并退出 |
最佳实践
目录命名规范
# Use descriptive names
mkdir user_documents # Good
mkdir stuff # Poor
# Use consistent naming patterns
mkdir project_2024_01
mkdir project_2024_02
# Avoid spaces and special characters
mkdir my-project # Good
mkdir "my project" # Works but can cause issues
组织策略
# Date-based organization
mkdir -p archives/$(date +%Y)/{01..12}
# Project-based organization
mkdir -p projects/{active,completed,archived}
# User-based organization
mkdir -p users/{admins,developers,testers}
自动化和脚本
#!/bin/bash# Script to create standard project structure
PROJECT_NAME="$1"
if [ -z "$PROJECT_NAME" ]; then
echo "Usage: $0 <project_name>"
exit 1
fi
echo "Creating project structure for: $PROJECT_NAME"
mkdir -p "$PROJECT_NAME"/{
src/{main,test},
docs/{api,user},
config/{dev,prod,test},
scripts/{build,deploy},
data/{input,output,temp}
}
echo "Project structure created successfully!"
tree "$PROJECT_NAME"
与其他工具集成
使用版本控制
# Create project with Git initialization
mkdir myproject
cd myproject
git init
mkdir {src,docs,tests}
touch .gitignore README.md
使用 Docker
# Create Docker project structure
mkdir -p docker-project/{app,data,logs,config}
touch docker-project/Dockerfile
touch docker-project/docker-compose.yml
重要注意事项
-
使用
-p标志以避免在目录已存在时出错 -
创建系统目录时请注意权限
-
总是使用引号包围包含空格的目录名
-
考虑使用
tree命令来可视化创建的目录结构 -
mkdir命令使用默认权限创建目录,这些权限由 umask 修改 -
创建目录时使用绝对路径
mkdir命令对于在 Linux 系统中组织文件和创建目录结构至关重要。
更多详细信息,请查看手册:man mkdir
gzip 命令
Linux/Unix 中的 gzip 命令用于压缩/解压缩数据。
用法
压缩一个文件
操作: --- 压缩一个文件
详情: --- 通过应用压缩来减小文件大小
命令:
gzip file_name
解压缩一个文件
操作: --- 解压缩一个文件
详情: --- 在数据大小方面恢复文件的原始形式
命令:
gzip -d archive_01.gz
压缩多个文件:
操作: --- 压缩多个文件
详情: --- 将多个文件压缩到多个存档中
命令:
gzip file_name_01 file_name_02 file_name_03
解压缩多个文件:
操作: --- 解压缩多个文件
详情: --- 从多个存档中解压缩多个文件
命令:
gzip -d archive_01.gz archive_02.gz archive_03.gz
压缩一个目录:
操作: --- 解压缩目录中的所有文件
详情: --- 将目录下的多个文件压缩到一个单独的存档中
命令:
gzip -r directory_name
解压缩一个目录:
操作: --- 解压缩目录中的所有文件
详情: --- 从一个单独的存档中解压缩目录下的多个文件
命令:
gzip -dr directory_name
压缩时的详细(详细)输出:
操作: --- 以更详细的方式压缩一个文件
详情: --- 输出更多关于命令操作的信息
命令:
gzip -v file_name
whatis 命令
whatis 命令用于显示命令的单行手册页描述。它可以用来获取对(未知)命令用途的基本理解。
使用示例:
- 要显示
ls的用途:
whatis ls
- 要显示以
make开头的所有命令的用途,请执行以下操作:
whatis -w make*
语法:
whatis [-OPTION] [KEYWORD]
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-d |
--debug |
显示调试信息 |
-r |
--regex |
将每个关键字解释为正则表达式 |
-w |
--wildcard |
关键字包含通配符 |
who 命令
who 命令让您打印出登录用户列表、系统的当前运行级别以及上次系统启动时间。
示例
- 打印当前登录用户的全部详细信息
who -a
- 打印所有已死进程的列表
who -d -H
语法:
who [options] [filename]
其他标志及其功能
| 短标志 | 描述 |
|---|---|
-r |
打印所有当前运行级别 |
-d |
打印所有已死进程 |
-q |
打印所有登录名和总登录用户数 |
-h |
打印显示的列标题 |
-b |
打印上次系统启动时间 |
free 命令
Linux/Unix 中的 free 命令用于显示内存(RAM/SWAP)信息。
用法
显示内存使用情况
操作: --- 输出内存使用情况 - 可用和已用,以及交换空间
详情: --- 默认情况下,值以千字节为单位显示。
命令:
free
以可读形式显示内存使用情况
操作: --- 输出内存使用情况 - 可用和已用,以及交换空间
详情: --- 输出的值是可读的(以 GB / MB 为单位)
命令:
free -h
显示带有总行内存使用情况
操作: --- 输出内存使用情况,并添加一个包含总量的总结行。
详情: --- -t 标志对于查看内存和交换空间的合计总量很有用。
命令:
free -t
top/htop 命令
top 是预安装在 Linux 发行版和类 Unix 操作系统中的默认命令行实用程序。它用于显示有关系统和其最高 CPU 消耗进程以及 RAM 使用情况的信息。
htop 是基于 ncurses 的 Linux 和类 Unix 操作系统的交互式进程查看器和进程管理器。如果你把 top 放在类固醇上,你就得到了 htop。
top 和 htop 的比较:
| 特性 | top | htop |
|---|---|---|
| 类型 | 交互式系统监控器、进程查看器和进程管理器 | 交互式系统监控器、进程查看器和进程管理器 |
| 操作系统 | Linux 发行版,macOS | Linux 发行版,macOS |
| 安装 | 内置且始终存在。也因为这一点而得到更广泛的采用。 | 大多数 Linux 发行版中未预安装。需要手动安装 |
| 用户界面 | 仅基本文本 | 颜色丰富且更美观的文本图形界面 |
| 滚动支持 | 否 | 是,支持水平和垂直滚动 |
| 鼠标支持 | 否 | 是 |
| 进程利用率 | 显示进程,但不是以树形格式显示 | 是的,包括用户和内核线程 |
| 滚动支持 | 否 | 是,支持水平和垂直滚动 |
| 鼠标支持 | 否 | 是 |
| 进程利用率 | 显示进程,但不是以树形格式显示 | 是的,包括用户和内核线程 |
| 网络利用率 | 否 | 否 |
| 磁盘利用率 | 否 | 否 |
| 评论 | 对于一些高级选项(如搜索、向进程发送消息等)有一个学习曲线。了解 top 是好的,因为它是许多系统上的默认进程查看器。 | 更易于使用,并支持类似 vi 的搜索,使用 /。向进程发送消息(kill、renice)更容易,不需要像 top 那样输入进程号。 |
示例:
top
- 要显示运行进程的动态实时信息:
top
- 按内部内存大小排序进程(默认顺序 - 进程 ID):
top -o mem
- 首先按 CPU 排序,然后按运行时间排序:
top -o cpu -O time
- 仅显示指定用户的进程:
top -user {user_name}
htop
- 显示运行进程的动态实时信息。
top的增强版本。
htop
- 显示特定用户的进程:
htop --user {user_name}
- 按指定的
sort_item排序进程(使用htop --sort help查看可用选项):
htop --sort {sort_item}
语法:
top [OPTIONS]
htop [OPTIONS]
额外的标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-a |
- | 按内存使用量排序。 |
-b |
- | 批量模式操作。以 '批量模式' 启动 top,这在将 top 的输出发送到其他程序或文件时可能很有用。在此模式下,top 不会接受输入,直到达到您使用 '-n' 命令行选项设置的迭代限制或被终止。 |
-h |
- | top --user {用户名} 仅显示属于用户的进程。 |
-U |
-user | 帮助。 |
-u |
- | 这是一个与:-o cpu -O time 等效的别名。 |
sl命令
Linux 中的sl命令是一个幽默的程序,它会在你的终端上运行一列蒸汽机车(sl)。

安装
在运行之前安装该软件包。
sudo apt install sl
语法
sl
echo 命令
echo 命令用于将文本字符串显示到终端。它是 Linux/Unix 系统中最基础的命令之一,常用于 shell 脚本、命令行操作和系统管理任务中,用于输出文本、变量和格式化内容。
语法
echo [OPTIONS] [STRING...]
关键特性
-
文本输出:显示简单的文本字符串
-
变量扩展:显示环境变量的值
-
转义序列:使用特殊字符格式化输出
-
文件操作:向文件写入或追加文本
-
脚本集成:对于 shell 脚本至关重要
基本用法
简单文本输出
# Display simple textecho "Hello, World!"
echo Hello World
# Display multiple arguments
echo Hello World Linux
echo "Multiple" "words" "here"
# Empty line
echo
变量显示
# Display environment variablesecho $HOME
echo $USER
echo $PATH
# Display custom variables
name="John"
echo $name
echo "Hello, $name"
# Display with variable expansion
echo "Current user: $USER, Home: $HOME"
高级特性
转义序列
# Enable escape sequence interpretationecho -e "Hello\nWorld" # New line
echo -e "Name:\tJohn" # Tab
echo -e "Hello\bWorld" # Backspace
echo -e "Hello\rWorld" # Carriage return
echo -e "Line 1\vLine 2" # Vertical tab
echo -e "\aAlert sound" # Alert/bell
# Display backslash literally
echo -e "Path: C:\\\\Users" # Literal backslashes
echo -e "Quote: \"Hello\"" # Escaped quotes
输出控制
# Suppress trailing newlineecho -n "Enter your name: "
# Multiple lines without newlines
echo -n "Loading"
echo -n "."
echo -n "."
echo "."
# Combine with read for user input
echo -n "Enter password: "
read -s password
文件操作
写入文件
# Overwrite file contentecho "Hello World" > file.txt
# Create file with multiple lines
echo -e "Line 1\nLine 2\nLine 3" > multiline.txt
# Write variables to file
echo "Current date: $(date)" > info.txt
echo "Current user: $USER" >> info.txt
追加到文件
# Append to existing fileecho "New line" >> file.txt
# Append with timestamp
echo "$(date): Log entry" >> logfile.txt
# Append multiple lines
echo -e "Error occurred\nTimestamp: $(date)" >> error.log
字符串格式化和操作
文本格式化
# Center text (simple approach)echo " Centered Text "
# Create separators
echo "================================"
echo " IMPORTANT "
echo "================================"
# Box drawing
echo "┌─────────────────┐"
echo "│ System Info │"
echo "└─────────────────┘"
颜色输出
# ANSI color codesecho -e "\033[31mRed text\033[0m"
echo -e "\033[32mGreen text\033[0m"
echo -e "\033[33mYellow text\033[0m"
echo -e "\033[34mBlue text\033[0m"
# Background colors
echo -e "\033[41mRed background\033[0m"
echo -e "\033[42mGreen background\033[0m"
# Bold and italic
echo -e "\033[1mBold text\033[0m"
echo -e "\033[3mItalic text\033[0m"
实际应用
显示系统信息
# System status scriptecho "=== System Information ==="
echo "Hostname: $(hostname)"
echo "Current User: $USER"
echo "Current Directory: $(pwd)"
echo "Date/Time: $(date)"
echo "Uptime: $(uptime -p)"
echo "Memory Usage: $(free -h | grep Mem | awk '{print $3"/"$2}')"
配置文件生成
# Generate configuration fileecho "# Generated configuration - $(date)" > app.conf
echo "server_name=$HOSTNAME" >> app.conf
echo "port=8080" >> app.conf
echo "debug=false" >> app.conf
echo "log_level=info" >> app.conf
日志文件管理
# Structured logginglog_info() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] $1" >> application.log
}
log_error() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] $1" >> application.log
}
# Usage
log_info "Application started"
log_error "Database connection failed"
菜单创建
# Simple menu systemshow_menu() {
echo "================================="
echo " Main Menu"
echo "================================="
echo "1\. View System Info"
echo "2\. List Files"
echo "3\. Check Disk Usage"
echo "4\. Exit"
echo "================================="
echo -n "Enter your choice: "
}
命令替换和变量
命令替换
# Display command outputecho "Current date is: $(date)"
echo "Number of files: $(ls | wc -l)"
echo "Free disk space: $(df -h / | tail -1 | awk '{print $4}')"
# Multiple command substitution
echo "System: $(uname -s), Kernel: $(uname -r), Architecture: $(uname -m)"
数组和变量操作
# Array display
fruits=("apple" "banana" "orange")
echo "Fruits: ${fruits[@]}"
echo "First fruit: ${fruits[0]}"
# Variable with default values
echo "Editor: ${EDITOR:-nano}"
echo "Shell: ${SHELL:-/bin/bash}"
# String length and manipulation
text="Hello World"
echo "Text: $text"
echo "Length: ${#text}"
echo "Uppercase: ${text^^}"
echo "Lowercase: ${text,,}"
错误处理和验证
输入验证
# Check if variable is setif [ -n "$USER" ]; then
echo "User is set to: $USER"
else
echo "User variable is not set"
fi
# Conditional output
[ -d "/tmp" ] && echo "Directory /tmp exists" || echo "Directory /tmp not found"
错误消息
# Error to stderrecho "Error: Invalid input" >&2
# Success/failure with exit codes
if some_command; then
echo "✓ Command succeeded"
else
echo "✗ Command failed" >&2
exit 1
fi
交互式特性
用户提示
# Simple promptecho -n "Enter your name: "
read name
echo "Hello, $name!"
# Yes/No prompt
echo -n "Do you want to continue? (y/n): "
read -n 1 answer
echo
case $answer in
y|Y) echo "Continuing..." ;;
n|N) echo "Aborting..." ;;
*) echo "Invalid choice" ;;
esac
进度指示器
# Simple progress barecho -n "Processing: "
for i in {1..20}; do
echo -n "="
sleep 0.1
done
echo " Complete!"
# Percentage progress
for i in {0..100..10}; do
echo -ne "Progress: $i%\r"
sleep 0.2
done
echo -e "\nDone!"
与其他命令集成
管道和重定向
# Pipe to other commandsecho "hello world" | tr '[:lower:]' '[:upper:]'
echo "one two three" | wc -w
# Complex pipelines
echo "$PATH" | tr ':' '\n' | sort | uniq
# Tee for simultaneous output and file writing
echo "Important message" | tee -a important.log
数据处理
# Generate data for processingecho "apple,5,red" | cut -d',' -f2
echo "one:two:three" | awk -F':' '{print $2}'
# Create structured data
echo -e "Name,Age,City\nJohn,25,NYC\nJane,30,LA" > data.csv
选项和标志参考
| 选项 | 描述 |
|---|---|
-n |
不输出尾部换行 |
-e |
启用对反斜杠转义的解析 |
-E |
禁用对反斜杠转义的解释(默认) |
转义序列参考
| 序列 | 描述 |
|---|---|
\a |
警报(铃声/蜂鸣声) |
\b |
退格 |
\c |
抑制尾部换行 |
\e |
转义字符 |
\f |
起始页 |
\n |
换行 |
\r |
回车 |
\t |
水平制表符 |
\v |
垂直制表符 |
\\ |
文字反斜杠 |
\" |
文字双引号 |
\nnn |
八进制值 nnn 的字符 |
\xhh |
十六进制值 hh 的字符 |
最佳实践
脚本编写
# Use quotes to prevent word splittingecho "Value: $variable" # Good
echo Value: $variable # Can cause issues
# Use -e when needed
echo -e "Multi\nLine" # Correct for escape sequences
echo "Multi\nLine" # Literal backslash-n
# Consistent formatting
echo "Starting process..."
echo "Process completed successfully."
echo "Results saved to: $output_file"
调试和日志记录
# Debug informationecho "DEBUG: Variable value is '$variable'" >&2
# Timestamped logs
echo "[$(date)] Starting backup process" >> backup.log
# Function for consistent logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a application.log
}
重要提示
-
echo命令的行为在不同 shell(bash、dash、zsh)之间可能有所不同 -
使用
printf进行更便携和精确的格式化 -
单引号保留字面值,双引号允许变量扩展
-
总是引用变量以防止单词分割
-
仅当需要转义序列解释时才使用
echo -e -
echo默认添加换行符;使用-n来抑制它
echo 命令是 shell 脚本和命令行操作的基础,为各种用例提供灵活的文本输出功能。
查阅更多详细信息,请查看手册:man echo
finger 命令
finger 命令通过查询 /etc/passwd、/var/run/utmp 和 /var/log/wtmp 等文件来显示本地系统用户的信息。这是一个本地命令,不依赖于任何服务或守护进程来运行。此命令有助于快速检索与登录时间、空闲状态和其他系统信息相关的用户相关细节。
示例:
- 查看特定用户的详细信息。
finger abc
输出
Login: abc Name: (null)
Directory: /home/abc Shell: /bin/bash
On since Mon Nov 1 18:45 (IST) on :0 (messages off)
On since Mon Nov 1 18:46 (IST) on pts/0 from :0.0
New mail received Fri May 7 10:33 2013 (IST)
Unread since Sat Jun 7 12:59 2003 (IST)
No Plan.
- 查看用户的登录详情和空闲状态。
finger -s root
输出
Login Name Tty Idle Login Time Office Office Phone
root root *1 19d Wed 17:45
root root *2 3d Fri 16:53
root root *3 Mon 20:20
root root *ta 2 Tue 15:43
root root *tb 2 Tue 15:44
语法:
finger [-l] [-m] [-p] [-s] [username]
其他标志及其功能:
| 标志 | 描述 |
|---|---|
-l |
强制长输出格式。 |
-m |
仅匹配用户名(不是名字或姓氏)。 |
-p |
在长格式打印输出中抑制打印 .plan 文件。 |
-s |
强制短输出格式。 |
其他信息:
默认格式:
默认格式包括登录名、全名、终端名和写入状态等项目。该命令提供有关空闲时间、登录时间和特定站点信息的详细信息。
长格式:
在长格式中,命令会添加有关用户主目录、登录外壳以及 .plan 和 .project 文件内容的详细信息。
隐私考虑
虽然 finger 命令对于检索系统用户信息很有用,但它可能在共享或多用户环境中暴露敏感细节:
-
用户名和登录时间:显示登录时间,可用于跟踪用户活动。
-
主目录:暴露用户主目录的路径。
-
空闲状态:显示用户多久没有活动,可能表明他们是否正在积极使用系统。
-
邮件状态:显示邮件信息,可能无意中透露用户参与情况。
潜在风险:
在不受信任用户的环境中,finger 命令暴露的信息可能被用于:
-
社会工程攻击:恶意行为者可能利用这些信息来制作个性化的钓鱼攻击。
-
时间攻击:知道用户何时空闲或活跃可能会给攻击者在时间上尝试攻击带来优势。
-
针对性攻击:了解用户主目录的知识可以集中攻击那些位置。
缓解隐私风险:
为了缓解这些风险,考虑在用户隐私重要的环境中限制对 finger 命令的访问。
in.fingerd 服务
区分 finger 命令和 in.fingerd 服务 很重要。finger 命令是本地的,而 in.fingerd 是一个网络守护进程,允许远程查询用户信息。由于潜在的安全风险,此服务在现代系统中通常默认禁用。
如果启用,in.fingerd 服务可能会通过网络暴露用户信息,这可能被攻击者利用。为了缓解这种风险,系统管理员应确保在不需要该服务时禁用该服务。
禁用 in.fingerd 服务:
如果您担心远程查询,您可以禁用in.fingerd服务:
sudo systemctl disable in.fingerd
sudo systemctl stop in.fingerd
通过禁用in.fingerd服务,您可以防止远程查询用户信息,从而增强系统安全性。
groups命令
在 Linux 中,可以有多个用户(那些使用/操作系统的人)和组(用户的集合)。组使得管理具有相同安全和访问权限的用户变得容易。一个用户可以是不同组的成员。
重要要点:
groups命令打印出每个给定用户名的首要组和任何补充组,或者如果没有给出名称,则打印当前进程的组。如果给出了多个名称,则在用户组的列表之前打印每个用户的名称,并且用户名与组列表之间用冒号分隔。
语法:
groups [username]
示例 1
提供用户名
groups demon
在这个示例中,使用 groups 命令传递了用户名 demon,输出显示了用户 demon 所在的组,组名之间用冒号分隔。
示例 2
当没有传递用户名时,这将显示当前用户的组成员资格:
groups
这里当前用户是 demon。因此,当我们不带参数运行groups命令时,我们得到 demon 是用户的组。
示例 3
使用 groups 命令传递 root 权限:
$demon# groups
注意:进程的首要组和补充组通常从其父进程继承,并且通常在登录后不会改变。这意味着如果您在登录后更改组数据库,组将不会反映您在现有登录会话中的更改。唯一的选择是–help 和–version。
man 命令
man 命令用于显示我们可以在终端上运行的任何命令的手册。它提供的信息包括:描述、选项、作者等。
示例:
printf的手册页
man printf
- 介绍部分的第二部分手册页:
man 2 intro
- 使用
-l标志查看本地文件的手册:
man -l [LOCAL-FILE]
语法:
man [SECTION-NUM] [COMMAND NAME]
额外的标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-f |
- | 返回命令的章节 |
-a |
- | 显示所有命令的手册页 |
-k |
- | 在所有手册页中使用正则表达式搜索给定命令 |
-w |
- | 返回给定命令手册页的位置 |
-I |
- | 按大小写敏感搜索命令手册 |
passwd 命令
在 Linux 中,passwd 命令用于更改用户账户的密码。普通用户只能更改自己的账户密码,但超级用户可以更改任何账户的密码。passwd 命令还可以更改账户或相关密码的有效期。
示例
$ passwd
passwd 命令的语法是:
$ passwd [options] [LOGIN]
选项
-a, --all
This option can be used only with -S and causes show status for all users.
-d, --delete
Delete a user's password.
-e, --expire
Immediately expire an account's password.
-h, --help
Display help message and exit.
-i, --inactive
This option is used to disable an account after the password has been expired for a number of days.
-k, --keep-tokens
Indicate password change should be performed only for expired authentication tokens (passwords).
-l, --lock
Lock the password of the named account.
-q, --quiet
Quiet mode.
-r, --repository
change password in repository.
-S, --status
Display account status information.
w命令
w命令显示当前在机器上活跃的用户及其进程的详细信息。
示例:
- 在没有参数的情况下运行
w命令将显示登录用户及其进程的列表。
w
- 显示名为hope的用户的详细信息。
w hope
语法:
finger [-l] [-m] [-p] [-s] [username]
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-h |
--no-header |
不打印标题。 |
-u |
--no-current |
在确定当前进程和 CPU 时间时忽略用户名。(要查看此示例,请使用su切换到 root 用户,然后运行w和w -u。) |
-s |
--short |
显示简化的输出 (不打印登录时间、JCPU 或 PCPU 时间). |
-f |
--from |
切换打印来自字段 (远程主机名)。默认情况下,不打印来自字段,尽管您的系统管理员或发行版维护者可能已编译了一个默认显示来自字段的版本。 |
--help |
- | 显示帮助信息,并退出。 |
-V |
--version |
显示版本信息,并退出。 |
-o |
--old-style |
旧式输出 (对于小于一分钟的空闲时间打印空白空间)。 |
用户 |
- | 仅显示指定用户的详细信息。 |
其他信息
输出标题显示(按此顺序):当前时间、系统运行时间、当前登录用户数以及过去 1 分钟、5 分钟和 15 分钟的系统负载平均值。
对于每个用户,以下条目将被显示:
JCPU 时间是连接到 tty 的所有进程所使用的时间。它不包括过去的后台作业,但包括当前正在运行的后台作业。
PCPU 时间是当前进程在“what”字段中命名的时间所使用的时间。
whoami 命令
whoami 命令显示当前有效用户的用户名。换句话说,当执行时,它只是打印当前登录用户的用户名。
要显示您的有效用户 ID,只需在您的终端中输入 whoami:
manish@godsmack:~$ whoami
# Output:
manish
语法:
whoami [-OPTION]
只有两个选项可以传递给它:
--help: 用于显示帮助信息并退出
示例:
whoami --help
输出结果:
Usage: whoami [OPTION]...
Print the user name associated with the current effective user ID.
Same as id -un.
--help display this help and exit
--version output version information and exit
--version: 输出版本信息并退出
示例:
whoami --version
输出结果:
whoami (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Richard Mlynarik.
history命令
history命令显示您当前 shell 会话和过去会话中之前执行过的命令列表。这允许您回顾、搜索和重新执行命令,而无需重新输入。
命令语法
history [options] [n]
历史如何工作
您的命令历史记录存储在您的主目录中的一个文件中:
-
Bash:
~/.bash_history -
Zsh:
~/.zsh_history
存储的命令数由 shell 变量控制:
-
HISTSIZE: 在会话期间保留在内存中的最大命令数 -
HISTFILESIZE: 在历史文件中保留的最大命令数
您可以使用以下命令检查这些值:
echo $HISTSIZE
echo $HISTFILESIZE
常见选项
-
history n- 显示最后n个命令 -
history -c- 清除历史记录列表(仅当前会话) -
history -d offset- 删除位置offset的历史条目 -
history -a- 将新历史行追加到历史文件 -
history -w- 将当前历史记录写入历史文件
示例
1. 显示您的完整命令历史:
history
2. 仅显示最后 10 个命令:
history 10
3. 在您的历史记录中搜索特定命令:
history | grep artisan
history | grep git
history | grep docker
4. 通过历史编号执行命令:
!123
这将在您的历史记录中重新运行位置 123 的命令。
5. 执行以特定字符串开头的最新命令:
!git
这将运行以"git"开头的最新命令。
6. 执行上一个命令:
!!
7. 使用 sudo 执行上一个命令:
sudo !!
8. 重复使用上一个命令的参数:
# If you ran: cat /var/log/syslog# You can use the last argument with:
vim !$
# This runs: vim /var/log/syslog
9. 清除您的命令历史记录:
history -c
10. 从历史中删除特定条目:
history -d 456
反向搜索(Ctrl+R)
最强大的功能之一是反向增量搜索:
-
按
Ctrl+R -
开始输入命令的一部分
-
最新的匹配命令出现
-
再次按
Ctrl+R以循环查看较旧匹配项 -
按
Enter执行,或按Esc编辑命令
历史控制变量
您可以使用这些变量在~/.bashrc或~/.zshrc中自定义历史行为:
# Increase history sizeexport HISTSIZE=10000
export HISTFILESIZE=20000
# Ignore duplicate commands
export HISTCONTROL=ignoredups
# Ignore commands starting with a space
export HISTCONTROL=ignorespace
# Combine both options
export HISTCONTROL=ignoreboth
# Ignore specific commands from being saved
export HISTIGNORE="ls:cd:pwd:exit:history"
# Add timestamps to history
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
安全考虑
防止敏感命令被保存:
- 前缀为空格(如果
HISTCONTROL=ignorespace已设置):
mysql -u root -p
- 暂时禁用历史记录:
set +o history
# Run sensitive commands here
set -o history
- 删除特定条目:
history -d <line_number>
- 在登出前清除历史记录:
history -c && history -w
实际应用案例
-
调试:检查导致错误的命令序列
-
文档:复制脚本或文档中的命令序列
-
效率:快速重新执行复杂命令而无需重新输入
-
学习:在共享系统时回顾他人使用的命令(在适当的情况下)
-
审计跟踪:跟踪执行了哪些命令以及何时执行(启用时间戳)
login 命令
login 命令启动用户会话。
语法
$ login [-p] [-h host] [-H] [-f username|username]
标志及其功能
| 短标志 | 描述 |
|---|---|
-f |
用于跳过登录认证。此选项通常由 getty(8)的自动登录功能使用。 |
-h |
供其他服务器(例如 telnetd(8))使用,以将远程主机的名称传递给登录,以便它可以被放置在 utmp 和 wtmp 中。只有超级用户可以使用此选项。 |
-p |
供 getty(8)使用,以告知 login 保留环境变量。 |
-H |
供其他服务器(例如 telnetd(8))使用,以告知 login 在 login:提示符中应抑制打印主机名。 |
--help |
显示帮助文本并退出。 |
-v |
显示版本信息并退出。 |
示例
要以用户 abhishek 的身份登录系统,请在登录提示符下输入以下内容:
$ login: abhishek
如果已定义密码,则会出现密码提示。在此提示下输入您的密码。
lscpu命令
在 Linux/Unix 中,lscpu用于显示 CPU 架构信息。lscpu从sysfs和/proc/cpuinfo文件收集 CPU 架构信息。
例如:
manish@godsmack:~$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 142
Model name: Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
Stepping: 9
CPU MHz: 700.024
CPU max MHz: 3100.0000
CPU min MHz: 400.0000
BogoMIPS: 5399.81
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K
NUMA node0 CPU(s): 0-3
选项
-a, --all 在输出中包含在线和离线 CPU 的行(-e 的默认值)。此选项只能与选项-e 或-p 一起指定。例如:lsof -a
-b, --online 将输出限制为在线 CPU(-p 的默认值)。此选项只能与选项-e 或-p 一起指定。例如:lscpu -b
-c, --offline 将输出限制为离线 CPU。此选项只能与选项-e 或-p 一起指定。
-e, --extended [=list] 以人类可读的格式显示 CPU 信息。例如:lsof -e
更多信息:使用man lscpu或lscpu --help
cp 命令
cp 是一个用于复制文件和目录的命令行实用程序。cp 代表复制。此命令用于复制文件或文件组或目录。它创建一个磁盘上文件的精确镜像,具有不同的文件名。cp 命令在其参数中至少需要两个文件名。
示例:
- 将源文件的内容复制到目标文件。
cp sourceFile destFile
如果目标文件不存在,则创建该文件并将内容复制到其中。如果它已存在,则覆盖该文件。
- 要将文件复制到另一个目录,指定目标目录的绝对路径或相对路径。
cp sourceFile /folderName/destFile
- 要复制一个目录,包括其所有文件和子目录
cp -R folderName1 folderName2
上述命令创建目标目录,并递归地从源目录复制所有文件和子目录到目标目录。
如果目标目录已存在,则将源目录及其内容复制到目标目录内部。
- 要复制文件和子目录,但不复制源目录
cp -RT folderName1 folderName2
语法:
cp 命令的一般语法如下:
cp [OPTION] SOURCE DESTINATION
cp [OPTION] SOURCE DIRECTORY
cp [OPTION] SOURCE-1 SOURCE-2 SOURCE-3 SOURCE-n DIRECTORY
第一种和第二种语法用于将源文件复制到目标文件或目录。第三种语法用于将多个源(文件)复制到目录。
一些有用的选项
-i(交互式)i代表交互式复制。使用此选项时,系统在覆盖目标文件之前会先警告用户。cp 会提示用户进行响应,如果按 y 则覆盖文件,而按其他任何选项则不复制。
$ cp -i file1.txt fileName2.txt
cp: overwrite 'file2.txt'? y
-b(备份)-b(备份):使用此选项,cp 命令在相同文件夹中以不同的名称和格式创建目标文件的备份。
$ ls
a.txt b.txt
$ cp -b a.txt b.txt
$ ls
a.txt b.txt b.txt~
-f(强制) 如果系统无法打开目标文件进行写操作,因为用户没有对此文件的写权限,则使用 -f 选项与 cp 命令一起,首先删除目标文件,然后从源文件到目标文件复制内容。
$ ls -l b.txt
-r-xr-xr-x+ 1 User User 3 Nov 24 08:45 b.txt
用户、组和其他人没有写权限。
没有使用 -f 选项,命令未执行
$ cp a.txt b.txt
cp: cannot create regular file 'b.txt': Permission denied
使用 -f 选项,命令执行成功
$ cp -f a.txt b.txt
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-i |
--interactive | 在覆盖前提示 |
-f |
--force | 如果无法打开现有目标文件进行写操作,因为用户没有对此文件的写权限,则使用 -f 选项与 cp 命令一起,首先删除目标文件,然后从源文件到目标文件复制内容。 |
-b |
- | 在同一文件夹中以不同的名称和格式创建目标文件的备份。 |
-r or -R |
--recursive |
cp 命令通过递归复制整个目录结构来显示其递归行为。 |
-n |
--no-clobber |
不覆盖现有文件(覆盖之前的 -i 选项) |
-p |
- | 尽可能保留指定的属性(默认:模式、所有权、时间戳),如果可能,还可以保留其他属性:上下文、链接、xattr、全部 |
mv 命令
mv 命令允许您在 UNIX 类文件系统中将一个或多个文件或目录从一个位置移动到另一个位置。它可以用于两个不同的功能:
-
重命名文件或文件夹。
-
将一组文件移动到不同的目录。
注意:重命名时不会在磁盘上消耗额外的空间,且 mv 命令不会提供确认提示
语法:
mv [options] source (file or directory) destination
示例:
- 要重命名名为 old_name.txt 的文件:
mv old_name.txt new_name.txt
- 将名为 essay.txt 的文件从当前目录移动到名为 assignments 的目录,并将其重命名为 essay1.txt:
mv essay.txt assignments/essay1.txt
- 将名为 essay.txt 的文件从当前目录移动到名为 assignments 的目录中,且不重命名
mv essay.txt assignments
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-f |
--force |
强制移动,通过覆盖目标文件而不提示 |
-i |
--interactive |
在覆盖前进行交互式提示 |
-u |
--update |
仅在源文件比目标文件新或目标文件缺失时移动 |
-n |
--no-clobber |
不覆盖现有文件 |
-v |
--verbose |
打印源文件和目标文件 |
-b |
--backup |
创建现有目标文件的备份 |
ps 命令
ps 命令(进程状态)用于显示 Linux 系统上运行进程的信息——例如它们的 PID、内存使用情况、CPU 时间以及关联的用户。
它通常与 grep 等命令一起使用,以搜索特定进程或使用 less 滚动大量输出。
为什么使用 ps
想象你的系统感觉变慢或应用程序变得无响应——你可以使用 ps 来:
-
识别消耗大量 CPU/内存的进程
-
查找程序的 PID(进程 ID)
-
杀死或调试挂起的进程
-
检查共享系统上谁在运行什么
基本语法
ps [options]
没有指定任何选项时,ps 命令只显示当前终端会话中的进程。
示例:
ps
输出:
PID TTY TIME CMD
4587 pts/0 00:00:00 bash
4621 pts/0 00:00:00 ps
essential 使用
要记住的一个组合: ps aux
-
a= 所有进程(所有用户) -
u= 显示用户/所有者信息 -
x= 包括没有终端的进程
ps aux
输出示例:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 168208 1100 ? Ss 10:15 0:02 /sbin/init
myuser 2471 0.5 1.2 431204 24500 ? Sl 10:17 1:05 code
myuser 2523 2.3 0.7 230940 14860 pts/0 R+ 10:22 0:01 ps aux
一些更实用的日常示例
查找并杀死进程
你想要停止一个冻结的 OpenShot 进程。
ps aux | grep openshot
输出:
myuser 3625 99.9 6.1 1243924 252340 ? Rl 10:30 25:17 openshot
myuser 3649 0.0 0.0 6348 740 pts/0 S+ 10:31 0:00 grep --color=auto openshot
现在,杀死它:
kill -9 3625
通过用户显示进程
ps -u username
输出:
PID TTY TIME CMD
2284 ? 00:00:00 sshd
2455 ? 00:00:02 bash
过滤和排序输出
显示前 10 个内存消耗最多的进程:
ps aux --sort=-%mem | head -10
显示前 10 个 CPU 消耗最多的进程:
ps aux --sort=-%cpu | head -10
检查父/子进程层次结构
ps -ef --forest
这会显示一个树状结构,显示父子关系——在调试服务启动时非常有用。
自定义输出格式
要仅显示 PID、用户、内存和命令:
ps -eo pid,user,%mem,cmd
真实生活中的 DevOps 示例
1. 检查哪个进程使用了特定的端口
sudo ps -fp $(sudo lsof -t -i:8080)
2. 监控 Jenkins、Nginx 或 Docker 进程
ps aux | grep nginx
ps aux | grep jenkins
ps aux | grep docker
3. 查找僵尸进程
ps aux | awk '{ if ($8 == "Z") print $0; }'
快速参考的关键选项
| 选项 | 描述 |
|---|---|
aux |
所有具有详细信息的进程 |
-ef |
完整列表(替代 aux) |
-eo format |
自定义输出列 |
--sort |
按列排序(-%mem, -%cpu) |
-p PID |
显示特定的 PID |
-C name |
通过命令名显示进程 |
-u user |
显示用户的进程 |
f |
ASCII 艺术进程树 |
其他选项:
| 选项 | 描述 |
|---|---|
a |
显示具有终端(tty)的所有进程列表 |
-A |
列出所有进程。等同于 -e |
-a |
显示除会话领导者和与终端不关联的进程之外的所有进程 |
-d |
选择除会话领导者之外的所有进程 |
--deselect |
显示除满足指定条件之外的进程。等同于 -N |
-e |
列出所有进程。等同于 -A |
-N |
显示除满足指定条件之外的进程。等同于 -deselect |
T |
选择与该终端关联的所有进程。等同于没有参数的 -t 选项 |
r |
仅选择运行中的进程 |
--help simple |
显示所有基本选项 |
--help all |
显示所有可用选项 |
相关工具
如果你需要 实时 监控,请使用:
top
或者更用户友好的现代版本:
htop
kill 命令
Linux 中的 kill 命令(位于 /bin/kill),是一个内置命令,用于手动终止进程。kill 命令向进程发送一个信号,从而终止该进程。如果用户没有指定与 kill 命令一起发送的任何信号,则默认发送 TERM 信号,该信号将终止进程。
信号可以通过三种方式指定:
-
按数字(例如 -5)
-
带有 SIG 前缀(例如 -SIGkill)
-
不带有 SIG 前缀(例如 -kill)
语法
kill [OPTIONS] [PID]...
示例:
- 要显示所有可用的信号,可以使用以下命令选项:
kill -l
- 展示如何使用 PID 与
kill命令结合使用。
$kill pid
- 展示如何向进程发送信号。
kill {-signal | -s signal} pid
- 指定信号:
- 使用数字作为信号
kill -9 pid
- 在信号中使用 SIG 前缀
kill -SIGHUP pid
- 在信号中不使用 SIG 前缀
kill -HUP pid
参数:
要被通知的进程列表可以是名称和 PID 的混合。
pid Each pid can be expressed in one of the following ways:
n where n is larger than 0. The process with PID n is signaled.
0 All processes in the current process group are signaled.
-1 All processes with a PID larger than 1 are signaled.
-n where n is larger than 1. All processes in process group n are signaled.
When an argument of the form '-n' is given, and it is meant to denote a
process group, either a signal must be specified first, or the argument must
be preceded by a '--' option, otherwise it will be taken as the signal to
send.
name All processes invoked using this name will be signaled.
选项:
-s, --signal signal
The signal to send. It may be given as a name or a number.
-l, --list [number]
Print a list of signal names, or convert the given signal number to a name. The
signals can be found in /usr/include/linux/signal.h.
-L, --table
Similar to -l, but it will print signal names and their corresponding numbers.
-a, --all
Do not restrict the command-name-to-PID conversion to processes with the same UID
as the present process.
-p, --pid
Only print the process ID (PID) of the named processes, do not send any signals.
--verbose
Print PID(s) that will be signaled with kill along with the signal.
killall 命令
killall 向运行指定命令的所有进程发送信号。如果没有指定信号名称,则发送 SIGTERM。通常,killall 命令通过进程名称来杀死所有进程。
信号可以通过名称(例如 -HUP 或 -SIGHUP)、数字(例如 -1)或选项 -s 来指定。
如果命令名称不是正则表达式(选项 -r)且包含斜杠(/),则将选择执行该特定文件的进程进行杀死,无论其名称如何。
如果每个列出的命令至少有一个进程被杀死,或者没有列出命令但至少有一个进程匹配 -u 和 -Z 搜索标准,则 killall 返回零退出代码。否则返回非零。
killall 进程永远不会杀死自己(但可能会杀死其他 killall 进程)。
示例:
- 使用
SIGTERM杀死匹配名称conky的所有进程:
killall conky
# OR
killall -SIGTERM conky
# OR
killall -15 conky
您也可以用这种方法杀死 Wine 进程(在 Linux 上运行的 Windows 可执行文件)。
killall TQ.exe
- 列出所有支持的信号:
$ killall -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT
CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS
关于数字。
$ for s in $(killall -l); do echo -n "$s " && kill -l $s; done
HUP 1
INT 2
QUIT 3
ILL 4
TRAP 5
ABRT 6
BUS 7
FPE 8
KILL 9
USR1 10
SEGV 11
USR2 12
PIPE 13
ALRM 14
TERM 15
STKFLT 16
CHLD 17
CONT 18
STOP 19
TSTP 20
TTIN 21
TTOU 22
URG 23
XCPU 24
XFSZ 25
VTALRM 26
PROF 27
WINCH 28
POLL 29
PWR 30
SYS 31
- 在杀死之前询问,以防止意外杀死:
$ killall -i conky
Kill conky(1685) ? (y/N)
- 杀死所有进程并等待进程结束。
killall -w conky
- 根据时间杀死:
# Kill all firefox younger than 2 minutes
killall -y 2m firefox
# Kill all firefox older than 2 hours
killall -o 2h firefox
语法:
killall [OPTION]... [--] NAME...
killall -l, --list
killall -V, --version
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-e |
--exact |
对于非常长的名称要求精确匹配 |
-I |
--ignore-case |
不区分大小写的进程名称匹配 |
-g |
--process-group |
杀死进程组而不是进程 |
-y |
--younger-than |
杀死比指定时间年轻的进程 |
-o |
--older-than |
杀死超过指定时间的进程 |
-i |
--interactive |
在杀死进程之前提示,以避免意外终止。 |
-l |
--list |
列出所有已知的信号名称 |
-q |
--quiet |
不打印抱怨信息 |
-r |
--regexp |
将名称解释为扩展正则表达式 |
-s |
--signal SIGNAL |
发送此信号而不是 SIGTERM |
-u |
--user USER |
只杀死以用户身份运行的进程 |
-v |
--verbose |
报告信号是否成功发送 |
-w |
--wait |
等待进程结束 |
-n |
--ns PID |
匹配属于指定 PID 的同一命名空间的进程。 |
-Z |
--context |
REGEXP 只杀死具有上下文的进程(必须先于其他参数) |
相关命令
kill, pidof
env 命令
Linux/Unix 中的 env 命令用于打印当前环境变量列表,或者在不更改当前环境的情况下运行一个自定义环境中的程序。
语法
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
用法
-
打印当前环境变量的集合
env -
使用空环境运行命令
env -i command_name -
从环境中删除变量
env -u variable_name -
每个输出以 NULL 结尾
env -0
选项完整列表
| 短标志 | 长标志 | 描述 |
|---|---|---|
-i |
--ignore-environment |
使用空环境启动 |
-0 |
--null |
每个输出行以 NUL 结尾,而不是换行符 |
-u |
--unset=NAME |
从环境中删除变量 |
-C |
--chdir=DIR |
将工作目录更改为 DIR |
-S |
--split-string=S |
处理并分割 S 为单独的参数。它用于在 shebang 行上传递多个参数 |
-v |
--debug |
打印每个处理步骤的详细信息 |
| - | --help |
打印帮助信息 |
| - | --version |
打印版本信息 |
printenv 命令
printenv 打印指定 环境变量 的值。如果没有指定 变量,则打印所有变量的名称和值对。
示例:
- 显示所有环境变量的值。
printenv
- 显示当前用户 主目录 的位置。
printenv HOME
- 要将
--null命令行选项用作输出条目之间的终止字符。
printenv --null SHELL HOME
注意:默认情况下, printenv 命令使用换行符作为输出条目之间的终止字符。
语法:
printenv [OPTION]... PATTERN...
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-0 |
--null |
以 0 字节而不是 换行符 结束每行输出。 |
--help |
- | 显示帮助信息并退出。 |
hostname 命令
hostname 用于显示系统的 DNS 名称,以及显示或设置其主机名或 NIS 域名。
语法:
hostname [-a|--alias] [-d|--domain] [-f|--fqdn|--long] [-A|--all-fqdns] [-i|--ip-address] [-I|--all-ip-addresses] [-s|--short] [-y|--yp|--nis]
示例:
-
hostname -a, hostname --alias显示主机别名(如果已使用)。此选项已弃用,不应再使用。 -
hostname -s, hostname --short显示短主机名。这是在第一个点处截断的主机名。 -
hostname -V, hostname --version在标准输出上打印版本信息并成功退出。
帮助命令
运行以下命令以查看hostname命令的完整指南。
man hostname
nano命令
nano命令让您可以创建/编辑文本文件。
安装:
Nano 文本编辑器预安装在 macOS 和大多数 Linux 发行版上。它是vi和vim的替代品。要检查您的系统是否已安装,请输入:
nano --version
如果您没有安装nano,您可以通过包管理器来完成:
Ubuntu 或 Debian:
sudo apt install nano
示例:
- 打开一个现有文件,输入
nano后跟文件路径:
nano /path/to/filename
- 创建一个新文件,输入
nano后跟文件名:
nano filename
- 使用光标在特定行和字符处打开文件,请使用以下语法:
nano +line_number,character_number filename
一些快捷键及其功能概述:
| 快捷键 | 描述 |
|---|---|
Ctrl + S |
保存当前文件 |
Ctrl + O |
提供写入文件(“另存为”)的选项 |
Ctrl + X |
关闭缓冲区,退出 nano |
Ctrl + K |
将当前行剪切到剪切板 |
Ctrl + U |
粘贴剪切板内容 |
Alt + 6 |
将当前行复制到剪切板 |
Alt + U |
撤销上一个操作 |
Alt + E |
重做上一个撤销的操作 |
rm 命令
rm 代表 "删除",是一个用于删除(删除)特定文件的命令。它也可以通过使用适当的标志来删除目录。
示例:
rm filename.txt
语法
rm [OPTION] [FILE|DIRECTORY]
标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-f |
--force |
忽略文件或目录不存在的情况,从不提示 |
-i |
- | 在每次删除之前提示 |
-I |
- | 在删除超过 3 个文件之前提示一次,或在递归删除时提示 |
-d |
--dir |
删除空目录 |
-v |
--verbose |
解释正在执行的操作 |
-r 或 -R |
--recursive |
递归删除目录及其内容 |
| - | --help |
显示帮助信息然后退出 |
| - | --version |
首先打印版本信息,然后退出 |
| - | --no-preserve-root |
不特别处理 / |
| - | -preserve-root[=all] |
不删除 /(默认),使用 'all' 时,拒绝任何来自其父设备的命令行参数 |
| - | --interactive[=WHEN] |
根据 WHEN 提示,从不提示,仅 -I 提示一次,或始终提示 -i,如果没有 WHEN,则始终提示 |
| - | --one-file-system |
当递归删除层次结构时,跳过任何位于与相应命令行参数不同的文件系统上的目录 |
重要通知:
-
rm默认不删除目录,因此请使用-r、-R、--recursive选项来删除每个列出的目录及其所有内容。 -
要删除以
-开头的文件,例如-foo,请使用以下命令之一:-
rm -- -foo -
rm ./-foo
-
-
为了确保被删除的文件/目录真的无法恢复,请考虑使用
shred命令。
ifconfig 命令
ifconfig 用于配置内核驻留的网络接口。它在启动时用于根据需要设置接口。之后,通常只有在调试或需要系统调整时才需要使用。
如果没有给出参数,ifconfig 将显示当前激活接口的状态。如果给出单个接口参数,它将只显示该接口的状态;如果给出单个 -a 参数,它将显示所有接口的状态,即使它们处于关闭状态。否则,它将配置一个接口。
语法:
ifconfig [-v] [-a] [-s] [interface]
ifconfig [-v] interface [aftype] options
示例:
- 要显示当前激活的接口:
ifconfig
- 要显示所有当前激活的接口,即使它们处于关闭状态:
ifconfig -a
- 要显示所有错误条件:
ifconfig -v
- 要显示简短列表:
ifconfig -s
- 要显示特定网络接口的详细信息(例如
eth0):
ifconfig eth0
- 要激活接口的驱动程序(例如
eth0):
ifconfig eth0 up
- 要停用接口的驱动程序(例如
eth0):
ifconfig eth0 down
- 要将特定 IP 地址分配给网络接口(例如
eth0):
ifconfig eth0 10.10.1.23
- 要更改网络接口的 MAC(媒体访问控制)地址(例如
eth0):
ifconfig eth0 hw ether AA:BB:CC:DD:EE:FF
- 要为网络接口定义子网掩码(例如
eth0):
ifconfig eth0 netmask 255.255.255.224
- 要在网络上启用混杂模式(例如
eth0):
ifconfig eth0 promisc
在正常模式下,当网络卡收到一个数据包时,它会验证该数据包是否属于自己。如果不是,它将正常丢弃该数据包。然而,在混杂模式下,它接受通过网络卡流过的所有数据包。
- 要在网络上禁用混杂模式(例如
eth0):
ifconfig eth0 -promisc
- 要将最大传输单元设置到网络接口(例如
eth0):
ifconfig eth0 mtu 1000
MTU 允许您设置在接口上传输的数据包的最大大小。MTU 能够在一次单独的事务中处理一个接口的最大字节数。
- 要向网络接口添加额外的 IP 地址,您可以配置网络别名到网络接口:
ifconfig eth0:0 10.10.1.24
请注意,别名网络地址与网络接口的子网掩码相同。例如,如果您的 eth0 网络 IP 地址是 10.10.1.23,则别名 IP 地址可以是 10.10.1.24。一个无效的 IP 地址示例是 10.10.2.24,因为接口子网掩码是 255.255.255.224。
- 要删除网络别名:
ifconfig eth0:0 down
请记住,对于每个作用域(即具有相同地址/子网掩码组合的同一网络),如果删除第一个别名,则所有别名都将被删除。
帮助命令
运行以下命令以查看 ifconfig 命令的完整指南。
man ifconfig
ip命令
ip命令是 iproute2 包中的一个强大工具,用于网络管理任务。它作为较老网络工具(如ifconfig、route和arp)的现代替代品。ip命令可以显示或操作路由、网络设备、接口和隧道。
语法
ip [ OPTIONS ] OBJECT { COMMAND | help }
关键功能
-
接口管理:配置和监控网络接口
-
IP 地址管理:添加、删除和显示 IP 地址
-
路由控制:管理路由表和路由
-
邻居管理:处理 ARP/邻居缓存条目
-
网络命名空间:使用网络命名空间
-
隧道:创建和管理网络隧道
基本用法
显示网络接口
# Show all network interfaces
ip link show
# Show specific interface
ip link show eth0
# Show interface statistics
ip -s link show eth0
IP 地址管理
# Show all IP addresses
ip addr show
# Show addresses for specific interface
ip addr show eth0
# Add IP address to interface
sudo ip addr add 192.168.1.100/24 dev eth0
# Remove IP address from interface
sudo ip addr del 192.168.1.100/24 dev eth0
# Flush all addresses from interface
sudo ip addr flush dev eth0
接口管理
接口启用/禁用
# Bring interface up
sudo ip link set eth0 up
# Bring interface down
sudo ip link set eth0 down
# Set interface MTU
sudo ip link set eth0 mtu 1400
# Change MAC address
sudo ip link set eth0 address 00:11:22:33:44:55
创建虚拟接口
# Create VLAN interface
sudo ip link add link eth0 name eth0.100 type vlan id 100
# Create bridge interface
sudo ip link add name br0 type bridge
# Create virtual ethernet pair
sudo ip link add veth0 type veth peer name veth1
# Delete virtual interface
sudo ip link delete veth0
路由管理
查看路由
# Show routing table
ip route show
# Show routes for specific destination
ip route get 8.8.8.8
# Show routes via specific interface
ip route show dev eth0
# Show IPv6 routes
ip -6 route show
管理路由
# Add default route
sudo ip route add default via 192.168.1.1
# Add specific route
sudo ip route add 10.0.0.0/8 via 192.168.1.1
# Add route via specific interface
sudo ip route add 172.16.0.0/16 dev eth1
# Delete route
sudo ip route del 10.0.0.0/8
# Replace existing route
sudo ip route replace default via 192.168.1.254
多重路由表
# Show all routing tables
ip route show table all
# Add route to specific table
sudo ip route add 192.168.2.0/24 via 10.0.0.1 table 100
# Show specific routing table
ip route show table 100
# Add routing rule
sudo ip rule add from 192.168.1.0/24 table 100
邻居(ARP)管理
ARP 缓存操作
# Show ARP cache
ip neigh show
# Show neighbors for specific interface
ip neigh show dev eth0
# Add static ARP entry
sudo ip neigh add 192.168.1.50 lladdr 00:11:22:33:44:55 dev eth0
# Delete ARP entry
sudo ip neigh del 192.168.1.50 dev eth0
# Flush ARP cache
sudo ip neigh flush all
高级功能
网络命名空间
# List network namespaces
ip netns list
# Create network namespace
sudo ip netns add myns
# Execute command in namespace
sudo ip netns exec myns ip addr show
# Delete network namespace
sudo ip netns del myns
# Move interface to namespace
sudo ip link set eth1 netns myns
隧道
# Create GRE tunnel
sudo ip tunnel add gre1 mode gre remote 10.0.0.2 local 10.0.0.1 ttl 255
# Create IPIP tunnel
sudo ip tunnel add ipip1 mode ipip remote 192.168.1.2 local 192.168.1.1
# Show tunnels
ip tunnel show
# Delete tunnel
sudo ip tunnel del gre1
流量控制
# Show queueing disciplines
ip qdisc show
# Add traffic shaping
sudo ip qdisc add dev eth0 root handle 1: htb default 30
# Show traffic control statistics
ip -s qdisc show dev eth0
监控和统计
接口统计
# Show detailed interface statistics
ip -s link show
# Show extended statistics
ip -s -s link show eth0
# Monitor interface changes
ip monitor link
# Monitor address changes
ip monitor addr
实时监控
# Monitor all network events
ip monitor
# Monitor only route changes
ip monitor route
# Monitor with timestamps
ip -t monitor
常见选项
通用选项
# Use specific protocol family
ip -4 addr show # IPv4 only
ip -6 addr show # IPv6 only
# Show more details
ip -d link show
# Output in JSON format
ip -j addr show
# Colorize output
ip -c addr show
# Don't resolve names
ip -n route show
批量操作
# Execute commands from file
sudo ip -batch commands.txt
# Example batch file content:
# link set eth0 up
# addr add 192.168.1.100/24 dev eth0
# route add default via 192.168.1.1
实际示例
设置静态 IP
# Complete static IP configuration
sudo ip addr add 192.168.1.100/24 dev eth0
sudo ip link set eth0 up
sudo ip route add default via 192.168.1.1
# Add DNS (edit /etc/resolv.conf)
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
创建带有 VLAN 的桥接
# Create bridge
sudo ip link add name br0 type bridge
# Create VLAN interfaces
sudo ip link add link eth0 name eth0.10 type vlan id 10
sudo ip link add link eth0 name eth0.20 type vlan id 20
# Add interfaces to bridge
sudo ip link set eth0.10 master br0
sudo ip link set eth0.20 master br0
# Bring everything up
sudo ip link set br0 up
sudo ip link set eth0.10 up
sudo ip link set eth0.20 up
网络故障排除
# Check connectivity path
ip route get 8.8.8.8
# Verify interface status
ip link show | grep -E "(UP|DOWN)"
# Check for duplicate IPs
ip addr show | grep inet
# Monitor network changes
ip monitor all
选项参考
| 选项 | 描述 |
|---|---|
-4, -6 |
使用 IPv4 或 IPv6 协议族 |
-b, -batch |
从文件中读取命令 |
-c, -color |
使用彩色输出 |
-d, -details |
显示详细信息 |
-f, -family |
指定协议族 |
-h, -human |
人类可读输出 |
-j, -json |
JSON 输出格式 |
-n, -numeric |
不解析名称 |
-o, -oneline |
单行输出 |
-r, -resolve |
解析主机名 |
-s, -stats |
显示统计信息 |
-t, -timestamp |
显示时间戳 |
对象参考
| 对象 | 描述 |
|---|---|
link |
网络设备(接口) |
addr |
IPv4 或 IPv6 地址 |
route |
路由表条目 |
rule |
路由策略数据库中的规则 |
neigh |
邻居(ARP)表条目 |
ntable |
邻居表配置 |
tunnel |
在 IP 上建立隧道 |
maddr |
多播地址 |
mroute |
多播路由缓存条目 |
monitor |
监视 netlink 消息 |
重要提示
-
ip命令在大多数配置更改时需要 root 权限 -
使用
ip做出的更改是立即的,但重启后不会持久 -
对于持久配置,请使用网络配置文件或 NetworkManager
-
在更改配置之前,始终备份网络配置
-
使用
ip代替过时的工具,如ifconfig和route
与 NetworkManager 集成
# Check if NetworkManager is managing interface
nmcli device status
# Temporarily disable NetworkManager for interface
sudo nmcli device set eth0 managed no
# Re-enable NetworkManager management
sudo nmcli device set eth0 managed yes
ip命令对于现代 Linux 网络管理至关重要,并提供了对网络配置的全面控制。
想要了解更多细节,请查看手册:man ip
clear 命令
在 Linux 中,clear命令用于清除终端屏幕。
示例
$ clear
之前:
$ echo Hello World
Hello World
$ clear
执行clear命令后:
$
截图:

执行命令后,你的终端屏幕将会清除:

su 命令
su(替换用户)命令允许您以其他用户账户运行命令。它通常用于切换到 root 账户以执行管理任务,或者在不注销和重新登录的情况下以不同用户身份运行命令。
语法
su [OPTIONS] [-] [USER [ARGUMENT...]]
关键特性
-
用户切换:切换到系统上的任何用户账户
-
环境控制:选择是否继承或重置环境变量
-
Shell 选择:指定要使用的 shell
-
组管理:切换主要和次要组
-
命令执行:以其他用户身份运行特定命令
基本用法
切换到 Root
# Switch to root user (requires root password)
su
# Switch to root with login shell (recommended)
su -
# Alternative syntax for login shell
su -l
su --login
切换到特定用户
# Switch to specific user
su username
# Switch to user with login shell
su - username
su -l username
# Switch to user and run specific command
su - username -c "whoami"
环境处理
登录 Shell 与非登录 Shell
# Non-login shell (keeps current environment)
su username
# Current directory and environment variables are preserved
# Login shell (starts fresh environment)
su - username
# Changes to user's home directory and loads their profile
环境变量控制
# Preserve current environment
su -m username
su --preserve-environment username
# Preserve specific environment variables
su -w HOME,TERM username
su --whitelist-environment=HOME,TERM username
# Reset environment but preserve specific variables
su - username --preserve-environment=PATH
高级用法
组管理
# Switch user and primary group
su -g developers username
# Switch with supplementary groups
su -G developers,admins username
# Check current groups
su - username -c "groups"
Shell 选择
# Use specific shell
su -s /bin/bash username
su --shell=/bin/zsh username
# Use shell if allowed by /etc/shells
su -s /usr/bin/fish username
# Check available shells
cat /etc/shells
命令执行
# Run single command as another user
su - username -c "ls -la /home/username"
# Run multiple commands
su - username -c "cd /tmp && ls -la && pwd"
# Run script as another user
su - username -c "/path/to/script.sh"
# Run command with arguments
su - username -c "grep 'pattern' /var/log/syslog"
实际示例
系统管理
# Switch to root for administrative tasks
su -
# Now you can run administrative commands
# Run single administrative command
su -c "systemctl restart apache2"
# Edit system configuration file
su -c "nano /etc/hosts"
# Check system logs
su -c "tail -f /var/log/syslog"
开发工作流程
# Switch to application user for deployment
su - appuser -c "cd /opt/myapp && ./deploy.sh"
# Run application as specific user
su - www-data -c "/usr/bin/php /var/www/html/script.php"
# Test permissions as different user
su - testuser -c "ls -la /shared/directory"
用户管理任务
# Create file as specific user
su - username -c "touch /home/username/newfile.txt"
# Check user's environment
su - username -c "env | sort"
# Run user's shell configuration
su - username -c "source ~/.bashrc && echo \$PATH"
安全考虑
密码要求
# su requires the target user's password
su username # Requires username's password
# Root can switch to any user without password
sudo su - username # Uses sudo authentication
# Check who can use su
grep su /etc/group
审计和日志记录
# Check su usage in logs
sudo grep su /var/log/auth.log
# Monitor current su sessions
w
who
# Check login history
last
安全使用模式
# Always use login shell for administrative tasks
su - # Better than just 'su'
# Use sudo instead of su when possible
sudo command # Better than 'su -c command'
# Limit time as root
su -c "command1 && command2 && exit"
与 Sudo 的比较
何时使用 su
# Multiple administrative commands
su -
# Run several commands as root
exit
# Interactive root session
su -
# Work as root for extended period
何时使用 sudo
# Single command execution
sudo systemctl restart service
# Better security and logging
sudo -u username command
# Temporary privilege escalation
sudo apt update && sudo apt upgrade
配置和自定义
PAM 配置
# Check PAM configuration for su
cat /etc/pam.d/su
# Restrict su to wheel group (some distributions)
# Edit /etc/pam.d/su and uncomment:
# auth required pam_wheel.so use_uid
Shell 配置
# Check if shell is allowed
grep username /etc/passwd
cat /etc/shells
# Set shell for user
sudo chsh -s /bin/bash username
环境自定义
# Customize login environment
# Edit ~/.profile, ~/.bashrc, or ~/.bash_profile
# Set specific environment for su sessions
# Create ~/.surc or modify shell configuration
故障排除
常见问题
# Authentication failure
su: Authentication failure
# Check password, user existence, account status
# Permission denied
su: Permission denied
# Check PAM configuration, wheel group membership
# Shell not allowed
su: Warning: shell not allowed
# Add shell to /etc/shells or use -s option
调试
# Check user account status
sudo passwd -S username
# Verify user existence
id username
grep username /etc/passwd
# Check group membership
groups username
# Test with verbose output
su -v username
脚本集成
在脚本中使用 su
#!/bin/bash# Script to run commands as different userif [ "$EUID" -ne 0 ]; then
echo "Please run as root"
exit 1
fi
# Switch to app user and run commands
su - appuser -c "
cd /opt/myapp
./backup.sh
./cleanup.sh
"
自动化任务
# Cron job running as specific user# Add to root's crontab:# 0 2 * * * su - backupuser -c '/usr/local/bin/backup.sh'# System service running as user
su - serviceuser -c '/opt/service/start.sh' &
选项参考
| 选项 | 长格式 | 描述 |
|---|---|---|
- |
--login |
启动登录 shell,加载用户的环境 |
-c CMD |
--command=CMD |
执行命令并退出 |
-f |
--fast |
将 -f 传递给 shell(用于 csh/tcsh) |
-g GRP |
--group=GRP |
指定主要组 |
-G GRP |
--supp-group=GRP |
指定次要组 |
-l |
--login |
与 - 选项相同 |
-m |
--preserve-environment |
不重置环境变量 |
-p |
--preserve-environment |
与 -m 选项相同 |
-s SHL |
--shell=SHL |
使用指定的 shell |
-w VAR |
--whitelist-environment=VAR |
不重置指定的变量 |
--help |
- | 显示帮助信息 |
--version |
- | 显示版本信息 |
最佳实践
安全最佳实践
-
当可能时,使用
sudo而不是su以获得更好的日志记录 -
始终使用登录 shell (
su -) 进行管理任务 -
限制作为 root 用户的时间
-
当可能时,使用特定命令而不是交互式会话
-
定期通过系统日志审计 su 使用情况
运营最佳实践
-
在脚本中切换用户时使用描述性注释
-
在尝试切换之前验证用户存在
-
在脚本中优雅地处理认证失败
-
在系统文档中记录用户切换要求
重要提示
-
su需要目标用户的密码(除非以 root 身份运行) -
建议使用
su -进行管理任务,因为它提供了一个干净的环境 -
su会话记录在/var/log/auth.log或类似的系统日志中 -
在某些系统上可能启用了
wheel组限制 -
完成后始终退出 su 会话以返回到原始用户
su 命令对于 Linux 系统中的用户切换和权限管理至关重要,但应谨慎使用,并考虑适当的安全措施。
想要了解更多详情,请查阅手册:man su
wget 命令
wget 命令用于从互联网下载文件。它支持使用 HTTP、HTTPS 和 FTP 协议下载文件。它允许您一次性下载多个文件,后台下载,恢复下载,限制带宽,镜像网站,等等。
语法
wget 的语法要求您定义下载选项以及要下载的文件的 URL。
$ wget [options] [URL]
示例
在此示例中,我们将从不同的来源下载 Ubuntu 20.04 桌面 iso 文件。转到您的终端或打开一个新的终端,并输入下面的 wget。这将开始下载。下载可能需要几分钟才能完成。
- 开始常规下载
wget https://releases.ubuntu.com/20.04/ubuntu-20.04.3-desktop-amd64.iso
- 您可以使用
-c选项恢复下载
wget -c https://mirrors.piconets.webwerks.in/ubuntu-mirror/ubuntu-releases/20.04.3/ubuntu-20.04.3-desktop-amd64.iso
- 要在后台下载,请使用
-b选项
wget -b https://mirrors.piconets.webwerks.in/ubuntu-mirror/ubuntu-releases/20.04.3/ubuntu-20.04.3-desktop-amd64.iso
更多选项
除了下载之外,wget 还提供了许多其他功能,例如下载多个文件、后台下载、限制下载带宽和恢复中断的下载。查看其 man 页面中的所有 wget 选项。
man wget
其他标志及其功能
| 短标志 | 描述 |
|---|---|
-v |
打印系统上可用的 wget 版本 |
-h |
打印显示所有可能选项的帮助信息 |
-b |
此选项用于在启动时将进程发送到后台。 |
-t |
此选项用于设置重试次数为指定的次数 |
-c |
此选项用于恢复部分下载的文件 |
curl命令
在 Linux 中,curl 是一个功能强大的命令行工具,用于使用广泛的协议(包括 HTTP、HTTPS 和 FTP)从服务器或向服务器传输数据。它通常用于测试 API、下载文件和自动化与 Web 相关的任务。
curl命令的语法:
$ curl [options...] <url>
该命令将在终端窗口中打印出 example.com 主页的源代码。
常用选项:
curl 有超过 200 个选项!以下是一些最常见和有用的选项。
| 选项 | 长版本 | 描述 |
|---|---|---|
-O |
--remote-name |
下载文件并使用与远程文件相同的名称保存。 |
-o <file> |
--output <file> |
将下载的输出保存到特定的文件名。 |
-L |
--location |
如果服务器报告请求的页面已移动,则跟随重定向。 |
-X <METHOD> |
--request <METHOD> |
指定要使用的 HTTP 请求方法(例如,POST、PUT、DELETE)。 |
-H <header> |
--header <header> |
允许您向请求添加自定义 HTTP 头。 |
示例:
1. 查看网页的源代码
这是 curl 最简单的用法。它将从 URL 获取内容,并将其 HTML 源代码直接打印到您的终端。
$ curl example.com
2. 下载一个文件
-O标志用于下载文件。curl 会使用与远程文件相同的名称将其保存在您的当前目录中。
$ curl -O https://github.com/bobbyiliev/101-linux-commands/archive/refs/tags/v1.0.zip
3. 下载文件并重命名
使用-o标志,您可以指定下载文件的新的名称。
$ curl -o linux-commands.zip https://github.com/bobbyiliev/101-linux-commands/archive/refs/tags/v1.0.zip
安装:
curl 命令包含在大多数 Linux 发行版中。但是,如果系统默认没有携带 curl,您需要手动安装。要安装 curl,请执行以下命令:
通过执行以下命令来更新系统:
$ sudo apt update
$ sudo apt upgrade
现在,通过执行以下命令来安装 curl 实用工具:
$ sudo apt install curl
通过执行以下命令来验证安装:
$ curl -version
上述命令将显示 curl 命令的安装版本。
yes命令
Linux 中的yes命令用于打印给定STRING的连续输出流。如果未提及STRING,则打印‘y’。它会重复输出字符串,直到被终止(例如使用 ctrl + c)。
示例:
- 在终端中无限期地打印“hello world”,直到被终止:
yes hello world
- 一个更通用的命令:
yes [STRING]
选项
它接受以下选项:
-
--help
显示此帮助信息并退出
-
--version
输出版本信息并退出
last命令
此命令会显示自var/log/wtmp文件创建以来所有登录和登出的用户列表。你还可以添加一些参数,例如显示特定用户何时登录以及登录了多久。
如果你想要查看最后 5 条日志,只需在命令中添加-5,如下所示:
last -5
如果你想要查看最后 10 条记录,请添加-10。
另一个很酷的功能是,如果你添加-F,你可以看到包括日期在内的登录和登出时间。
last -F
使用此命令可以查看很多东西。如果你需要了解更多关于此命令的信息,你可以运行:
last --help
locate命令
locate命令通过由updatedb命令生成的数据库文件搜索文件系统中的文件和目录,其名称与给定的模式匹配。
示例:
- 运行
locate命令搜索名为.bashrc的文件。
locate .bashrc
输出
/etc/bash.bashrc
/etc/skel/.bashrc
/home/linuxize/.bashrc
/usr/share/base-files/dot.bashrc
/usr/share/doc/adduser/examples/adduser.local.conf.examples/bash.bashrc
/usr/share/doc/adduser/examples/adduser.local.conf.examples/skel/dot.bashrc
/root/.bashrc文件将不会显示,因为我们是以普通用户身份运行命令的,该用户没有访问/root目录的权限。
如果结果列表很长,为了更好的可读性,可以将输出通过管道传递到[less](https://linuxize.com/post/less-command-in-linux/)`命令:
locate .bashrc | less
- 搜索系统中的所有
.md文件
locate *.md
- 搜索所有
.py文件并仅显示 10 个结果
locate -n 10 *.py
- 执行不区分大小写的搜索。
locate -i readme.md
输出
/home/linuxize/p1/readme.md
/home/linuxize/p2/README.md
/home/linuxize/p3/ReadMe.md
- 返回所有包含
.bashrc在名称中的文件的数量。
locate -c .bashrc
输出
6
- 以下命令将仅返回文件系统中现有的
.json文件。
locate -e *.json
- 要运行更复杂的搜索,使用
-r(--regexp)选项。要在您的系统上搜索所有.mp4和.avi文件并忽略大小写。
locate --regex -i "(\.mp4|\.avi)"
语法:
1\. locate [OPTION]... PATTERN...
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-A |
--all |
用于仅显示与所有 PATTERNs 匹配的条目,而不是仅要求其中之一匹配。 |
-b |
--basename |
用于仅匹配指定的模式与基本名称。 |
-c |
--count |
用于写入匹配条目的数量,而不是在标准输出上写入文件名。 |
-d |
--database DBPATH |
用于用 DBPATH 替换默认数据库。 |
-e |
--existing |
用于在命令执行期间仅显示引用现有文件的条目。 |
-L |
--follow |
如果指定了--existing选项,用于检查文件是否存在并跟随符号链接。它将省略输出中的损坏符号链接。这是默认行为。可以使用--nofollow选项指定相反的行为。 |
-h |
--help |
用于显示包含可用选项摘要的帮助文档。 |
-i |
--ignore-case |
用于忽略指定模式的区分大小写。 |
-p |
--ignore-spaces |
用于在匹配模式时忽略标点符号和空格。 |
-t |
--transliterate |
用于在匹配模式时忽略重音符号,使用 iconv 转写。 |
-l |
--limit, -n LIMIT |
如果指定了此选项,则命令在找到 LIMIT 条目后成功退出。 |
-m |
--mmap |
用于忽略与 BSD 和 GNU locate 的兼容性。 |
-0 |
--null |
用于使用 ASCII NUL 字符在输出中分隔条目,而不是在单独的一行上写入每个条目。 |
-S |
--statistics |
用于将每个读取数据库的统计信息写入标准输出,而不是搜索文件。 |
-r |
--regexp REGEXP |
用于搜索基本正则表达式 REGEXP。 |
--regex |
- | 它用于将所有模式描述为扩展正则表达式。 |
-V |
--version |
它用于显示版本和许可信息。 |
-w |
--wholename |
它用于匹配指定模式中仅整个路径名。 |
iostat 命令
Linux 中的 iostat 命令用于监控设备和分区的系统输入/输出统计信息。它通过观察设备活跃时间与其平均传输速率的关系来监控系统输入/输出。iostat 生成的报告可用于更改系统配置,以平衡物理磁盘之间的输入/输出。iostat 包含在 sysstat 软件包中。如果您没有安装,需要先进行安装。
语法:
iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ]
[ -z ] [ [ [ -T ] -g group_name ] { device [...] | ALL } ]
[ -p [ device [,...] | ALL ] ] [ interval [ count ] ]
示例:
- 显示所有 CPU 和设备自启动以来的单个历史报告:
iostat -d 2
- 以两秒间隔显示连续的设备报告:
iostat -d 2 6
3.对于所有设备,每两秒显示六个报告:
iostat -x sda sdb 2 6
4.对于设备 sda 和 sdb,每两秒显示六个扩展报告:
iostat -p sda 2 6
附加标志及其功能:
| 短标志 | 描述 |
|---|---|
-x |
显示更详细的统计信息。 |
-c |
仅显示 cpu 统计信息。 |
-d |
仅显示设备报告 |
-xd |
仅显示设备的扩展 I/O 统计信息。 |
-k |
以千字节或兆字节为单位捕获统计信息。 |
-k23 |
带延迟显示 cpu 和设备统计信息。 |
-j ID mmcbkl0 sda6 -x -m 2 2 |
显示持久设备名称统计信息。 |
-p |
显示块设备的统计信息。 |
-N |
显示 lvm2 统计信息。 |
sudo命令
sudo(“替身用户做”或“超级用户做”)命令允许具有适当权限的用户以其他用户身份执行命令,例如超级用户。
这相当于 Windows 中的“以管理员身份运行”选项。sudo命令允许您将当前用户账户提升为具有 root 权限。此外,sudo中的 root 权限仅在临时时间内有效。一旦时间到期,您必须再次输入密码才能恢复 root 权限。
警告:使用
sudo命令时请务必小心。在以 root 身份操作时,您可能会造成不可逆转和灾难性的更改!
语法:
sudo [-OPTION] command
其他标志及其功能:
| 标志 | 描述 |
|---|---|
-V |
-V(版本)选项使 sudo 打印版本号并退出。如果调用用户已经是 root,-V 选项将打印出 sudo 编译时使用的默认值和机器的本地网络地址。 |
-l |
-l(列表)选项打印出用户在当前主机上允许(和禁止)执行的命令。 |
-L |
-L(列出默认值)选项列出在默认值行中设置的参数,并为每个参数提供简短描述。此选项与 grep 结合使用时非常有用。 |
-h |
-h(帮助)选项使 sudo 打印用法消息并退出。 |
-v |
如果提供了-v(验证)选项,sudo将更新用户的戳记,如果需要,将提示用户输入密码。这会将 sudo 超时时间延长 5 分钟(或 sudoers 中设置的任何超时时间),但不会运行命令。 |
-K |
-K(确定杀死)选项从 sudo 中完全删除用户的戳记。同样,此选项不需要密码。 |
-u |
-u(用户)选项使 sudo 以除 root 以外的用户身份运行指定的命令。要指定 uid 而不是用户名,请使用#uid。 |
-s |
-s(shell)选项在设置了 SHELL 环境变量的情况下运行指定的 shell,或者在 passwd 文件中指定的 shell。 |
-- |
--标志指示 sudo 停止处理命令行参数。它与-s 标志结合使用时最有用。 |
示例
此命令将您的命令提示符切换到作为 root 用户的 BASH shell:
sudo bash
您的命令行应更改为:
root@hostname:/home/[username]
将文本字符串添加到文件中通常用于将软件仓库的名称添加到源文件中,而无需打开文件进行编辑。请使用以下语法与 echo、sudo 和 tee 命令结合使用:
echo ‘string-of-text’ | sudo tee -a [path_to_file]
示例:
echo "deb http://nginx.org/packages/debian `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list
apt命令
apt(优势软件包系统)命令用于与dpkg(由 debian 使用的软件包系统)交互。已经存在dpkg命令来管理.deb软件包。但apt是一个更用户友好且高效的途径。
简而言之,apt是一个用于在基于 debian 的 Linux 上安装、删除和执行其他操作的命令。
您将主要使用带有sudo权限的apt命令。
安装软件包:
使用install后跟package_name与apt一起安装新软件包。
语法:
sudo apt install package_name
示例:
sudo apt install g++
此命令将在您的系统上安装 g++。
移除软件包:
使用remove后跟package_name与apt一起移除特定的软件包。
语法:
sudo apt remove package_name
示例:
sudo apt remove g++
此命令将从您的系统中移除 g++。
搜索软件包:
使用apt搜索package_name,以在所有仓库中搜索软件包。
语法:
apt search package_name
注意:无需 sudo 权限
示例:
apt search g++
移除未使用的软件包:
当在系统上安装依赖于其他软件包的新软件包时,也会安装这些软件包的依赖项。当软件包被移除时,依赖项将保留在系统中。这些遗留的软件包不再被其他任何东西使用,可以移除。
语法:
sudo apt autoremove
此命令将从您的系统中移除所有未使用的软件包。
更新软件包索引:
apt软件包索引实际上是一个数据库,存储了在您的系统上启用的可用软件包的记录。
语法:
sudo apt update
此命令将更新系统上的软件包索引。
升级软件包:
如果您想为已安装的软件包安装最新更新,您可能需要运行此命令。
语法:
sudo apt upgrade
此命令不会升级需要移除已安装软件包的软件包。
如果您想升级单个软件包,请传递软件包名称:
语法:
sudo apt upgrade package_name
此命令将升级您的软件包到最新版本。
yum命令
yum命令是 Red Hat Enterprise Linux 中安装、更新、删除和管理软件包的主要包管理工具。它是Yellow Dog Updater, Modified的缩写。
yum在安装、更新和删除软件包时执行依赖关系解析。它可以管理系统中的已安装仓库或.rpm 软件包中的软件包。
语法:
yum -option command
示例:
- 要查看过去事务中发生的情况概览:
yum history
- 要撤销之前的交易:
yum history undo <id>
- 要使用“是”作为所有确认的响应来安装 firefox 软件包
yum -y install firefox
- 要将 mysql 软件包更新到最新稳定版本
yum update mysql
常用命令与 yum 一起使用:
| 命令 | 描述 |
|---|---|
install |
安装指定的软件包 |
remove |
删除指定的软件包 |
search |
在软件包元数据中搜索关键字 |
info |
列出描述 |
update |
将每个软件包更新到最新版本 |
repolist |
列出仓库 |
history |
显示过去事务中发生的情况 |
groupinstall |
安装特定的软件包组 |
clean |
清除所有启用仓库中的缓存文件 |
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-C |
--cacheonly |
完全从系统缓存运行,不更新缓存,即使缓存已过期也使用它。 |
| - | --security |
包括提供安全问题的修复的软件包。适用于升级命令。 |
-y |
--assumeyes |
自动对所有问题回答“是”。 |
| - | --skip-broken |
通过从事务中删除导致问题的软件包来解决 depsolve 问题。它是具有 False 值的严格配置选项的别名。 |
-v |
--verbose |
详细操作,显示调试信息。 |
zip 命令
zip 命令用于压缩文件并减小其大小。它输出包含一个或多个压缩文件或目录的存档。
示例:
为了使用 zip 命令压缩单个文件,语法如下:
zip myZipFile.zip filename.txt
这也适用于多个文件:
zip multipleFiles.zip file1.txt file2.txt
如果您正在压缩整个目录,别忘了添加 -r 标志:
zip -r zipFolder.zip myFolder/
语法:
zip [OPTION] zipFileName filesList
可能的选项:
| 标志 | 描述 |
|---|---|
-d |
从 zip 存档中删除文件。在创建 zip 文件后,可以使用 -d 选项从存档中删除文件 |
-u |
更新 zip 存档中的文件。此选项可用于更新指定的文件列表或将新文件添加到现有的 zip 文件中。只有当 zip 存档中已存在的版本更新时间晚于存档中的版本时,才更新 zip 存档中的现有条目。 |
-m |
压缩后删除原始文件。 |
-r |
递归地压缩目录,将递归地压缩目录中的文件。此选项有助于压缩指定目录中存在的所有文件。 |
-x |
在创建 zip 时排除文件 |
-v |
详细模式或打印诊断版本信息。通常,当应用于实际操作时,此选项启用压缩过程中的进度指示器,并请求关于 zip 文件结构异常的详细诊断信息 |
unzip命令
unzip命令将所有文件从指定的 ZIP 存档提取到当前目录。
示例:
为了提取文件,语法如下:
unzip myZipFile.zip
要将 ZIP 文件解压到不同于当前目录的目录,别忘了添加-d标志:
unzip myZipFile.zip -d /path/to/directory
要解压 ZIP 文件并排除特定文件或文件或目录被提取,别忘了添加-x标志:
unzip myZipFile.zip -x file1.txt file2.txt
语法:
unzip zipFileName [OPTION] [PARAMS]
可能的选项:
| 标志 | 描述 | 参数 |
|---|---|---|
-d |
将存档解压到不同的目录。 | /路径/到/目录 |
-x |
提取存档但不提取指定的文件。 | 文件名(们) |
-j |
如果压缩存档包含文件夹结构,则不解压创建新文件夹。 | - |
-l |
列出存档文件的内容,但不提取它。 | - |
-n |
不覆盖现有文件;提供替代文件名。 | - |
-o |
覆盖文件。 | - |
-P |
为解压受保护的存档文件提供密码。 | 密码 |
-q |
解压时不在标准输出中写入状态消息。 | - |
-t |
测试存档文件是否有效。 | - |
-v |
显示关于存档的详细(冗长)信息,但不提取它。 | - |
shutdown命令
shutdown命令允许您以安全的方式关闭系统。当执行shutdown时,系统将通知所有已登录的用户并禁止进一步登录。您可以选择立即关闭系统或延迟特定时间后关闭。
只有具有 root(或 sudo)权限的用户才能使用shutdown命令。
示例:
- 立即关闭您的系统:
sudo shutdown now
- 在 10 分钟后关闭您的系统:
sudo shutdown +10
- 在 5 分钟后关闭您的系统,并显示一条消息:
sudo shutdown +5 "System will shutdown in 5 minutes"
语法:
shutdown [OPTIONS] [TIME] [MESSAGE]
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-r |
- | 重新启动系统 |
-c |
- | 取消已计划的关闭操作 |
dir 命令
dir 命令列出目录的内容(默认为当前目录)。它与 ls 命令在列出内容格式上有所不同。默认情况下,dir 命令按列列出文件和文件夹,垂直排序,特殊字符由反斜杠转义序列表示。
语法:
dir [OPTIONS] [FILE]
示例:
- 要列出当前目录中的文件:
dir
- 要列出当前目录中的隐藏文件:
dir -a
- 要列出每个条目的详细信息
dir -l
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-a |
--all |
显示所有隐藏文件(以 . 开头),以及由 . 和 .. 表示的两个文件 |
-A |
--almost-all |
与 -a 选项类似,但不会显示表示当前目录和上一目录的文件。 |
-l |
- | 为每个条目显示详细信息 |
-s |
--size |
打印每个文件的分配大小,以块为单位 |
-h |
--human-readable |
与 -l 和 -s 一起使用,以类似 1K、2M 等人类可读格式打印大小 |
-F |
- | 根据附加的符号(/、*、@、%、=)将条目分类到其类型 |
-v |
--verbose |
打印源文件和目标文件 |
| - | --group-directories-first |
在文件之前分组目录 |
-R |
--recursive |
递归列出子目录。 |
-S |
- | 按文件大小排序,显示最大的文件首先 |
-d |
--directory |
列出目录条目而不是内容 |
reboot 命令
reboot 命令用于重启 Linux 系统。然而,它需要使用 sudo 命令 提升权限。通常在系统或网络更新后需要使用此命令。
语法
reboot [OPTIONS...]
选项
-
–help:此选项打印简短的帮助文本并退出。
-
-halt:此命令将停止机器。
-
-w,–wtmp-only:此选项仅写入 wtmp 关闭条目,实际上不会停止、关机或重启。
示例
- 基本用法。主要用于重启,无需任何其他详细信息
$ sudo reboot
然而,也可以使用带有 -r 选项的 shutdown 命令
$ sudo shutdown -r now
注意:reboot、halt 和关机在语法和效果上几乎相同。运行每个命令的 –-help 以查看详细信息。
reboot命令的使用有限,而shutdown命令被用来替代重启命令以满足更高级的重启和关机需求。其中一种情况是计划重启。语法如下
$ sudo shutdown –r [TIME] [MESSAGE]
这里的时间有各种格式。最简单的一种是 now,已在上一节中列出,告诉系统立即重启。其他有效的格式包括 +m,其中 m 是我们等待重启所需的分钟数,以及 HH:MM,它指定了 24 小时制的时间。
示例:2 分钟后重启系统
$ sudo shutdown –r +2
示例:凌晨 3:00 计划重启
$ sudo shutdown –r 03:00
- 取消重启。通常发生在某人想要取消计划重启的情况下
语法
$ sudo shutdown –c [MESSAGE]
用法
$sudo shutdown -c "Scheduled reboot cancelled because the chicken crossed the road"
- 显示系统重启的历史记录 语法
$ last reboot
sort命令
sort命令用于排序文件,将记录按特定顺序排列。默认情况下,sort 命令假定文件内容为 ASCII 格式进行排序。使用 sort 命令的选项也可以用于数值排序。
示例:
假设你创建了一个名为 file.txt 的数据文件:
Command :
$ cat > file.txt
abhishek
chitransh
satish
rajan
naveen
divyam
harsh
对文件进行排序:现在使用 sort 命令
语法:
sort filename.txt
Command:
$ sort file.txt
Output :
abhishek
chitransh
divyam
harsh
naveen
rajan
satish
注意:此命令实际上不会更改输入文件,即 file.txt 文件。
对混合大小写内容的文件进行排序功能
即大写和小写:当我们有一个包含大小写字母的混合文件时,首先会对大写字母进行排序,然后是小写字母。
示例:
创建一个 mix.txt 文件
Command :
$ cat > mix.txt
abc
apple
BALL
Abc
bat
现在使用 sort 命令
Command :
$ sort mix.txt
Output :
Abc
BALL
abc
apple
bat
paste 命令
paste 命令将两个或更多文件的行按顺序写入标准输出,行之间由制表符分隔
语法:
paste [OPTIONS]... [FILE]...
示例:
- 将两个文件粘贴在一起
paste file1 file2
- 使用换行符作为分隔符粘贴两个文件
paste -d '\n' file1 file2
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-d |
--delimiter |
使用制表符作为分隔符 |
-s |
--serial |
逐个粘贴文件,而不是并行粘贴 |
-z |
--zero-terminated |
将行分隔符设置为 NUL,而不是换行符 |
--help |
打印命令帮助 | |
--version |
打印版本信息 |
exit命令
exit命令用于终止(关闭)一个活跃的 shell 会话
语法:
exit
快捷方式:代替输入exit,请按ctrl + D,它将执行相同的功能。
diff/sdiff 命令
此命令用于通过逐行比较文件来显示文件中的差异。
语法:
diff [options] File1 File2
示例
- 假设有两个文件,分别命名为 a.txt 和 b.txt,它们包含以下 5 个印度邦的信息-:
$ cat a.txt
Gujarat
Uttar Pradesh
Kolkata
Bihar
Jammu and Kashmir
$ cat b.txt
Tamil Nadu
Gujarat
Andhra Pradesh
Bihar
Uttar pradesh
输入 diff 命令后,我们将得到以下输出。
$ diff a.txt b.txt
0a1
> Tamil Nadu
2,3c3
< Uttar Pradesh
Andhra Pradesh
5c5
Uttar pradesh
标志及其功能
| 短标志 | 描述 |
|---|---|
-c |
要以上下文模式查看差异,请使用 -c 选项。 |
-u |
要以统一模式查看差异,请使用 -u 选项。它与上下文模式类似 |
-i |
默认情况下,此命令区分大小写。要使此命令对 diff 不区分大小写,请使用 -i 选项。 |
-version |
此选项用于显示当前在您的系统上运行的 diff 版本。 |
tar命令
tar命令代表磁带归档,用于创建归档和提取归档文件。此命令在 Linux 中提供归档功能。我们可以使用 tar 命令创建压缩或未压缩的归档文件,并维护和修改它们。
示例:
- 在 abel 目录中创建 tar 文件:
tar -cvf file-14-09-12.tar /home/abel/
- 在当前目录中解压文件:
tar -xvf file-14-09-12.tar
语法:
tar [options] [archive-file] [file or directory to be archived
其他标志及其功能:
| 使用标志 | 描述 |
|---|---|
-c |
创建归档 |
-x |
提取归档 |
-f |
使用给定文件名创建归档 |
-t |
显示或列出归档文件中的文件 |
-u |
归档并添加到现有的归档文件中 |
-v |
显示详细信息 |
-A |
连接归档文件 |
-z |
zip,告诉 tar 命令使用 gzip 创建 tar 文件 |
-j |
使用 tbzip 过滤归档 tar 文件 |
w |
验证归档文件 |
r |
更新或添加已存在的.tar 文件中的文件或目录 |
-? |
显示项目的简要总结 |
-d |
查找归档与文件系统之间的差异 |
--usage |
显示可用的 tar 选项 |
--version |
显示已安装的 tar 版本 |
--show-defaults |
显示默认启用的选项 |
| 选项标志 | 描述 |
| :-- | :-- |
--check-device |
在增量归档期间检查设备号 |
-g |
用于允许与 GNU 格式增量备份的兼容性 |
--hole-detection |
用于检测稀疏文件中的空洞 |
-G |
用于允许与旧 GNU 格式增量备份的兼容性 |
--ignore-failed-read |
在文件读取错误时不要退出程序 |
--level |
设置创建归档的转储级别 |
-n |
假设归档是可寻址的 |
--no-check-device |
创建归档时不要检查设备号 |
--no-seek |
假设归档是不可寻址的 |
--occurrence=N |
仅处理每个文件的第 N 次出现 |
--restrict |
禁用可能有害的选项 |
--sparse-version=MAJOR,MINOR |
设置要使用的稀疏格式版本 |
-S |
高效处理稀疏文件 |
| 覆盖控制标志 | 描述 |
| :-- | :-- |
-k |
不替换现有文件 |
--keep-newer-files |
不替换比归档版本更新的现有文件 |
--keep-directory-symlink |
不替换现有的符号链接 |
--no-overwrite-dir |
保留现有目录的元数据 |
--one-top-level=DIR |
将所有文件提取到 DIR 中 |
--overwrite |
覆盖现有文件 |
--overwrite-dir |
覆盖目录的元数据 |
--recursive-unlink |
在提取之前递归删除目录中的所有文件 |
--remove-files |
在将文件添加到目录后删除文件 |
--skip-old-files |
提取时不要替换现有的文件 |
-u |
在提取之前删除每个文件 |
-w |
写入归档后验证归档 |
gunzip 命令
gunzip 命令是 gzip 命令的反义词。换句话说,它解压缩由 gzip 命令压缩的文件。
"gunzip 接受一系列文件作为参数。它将每个以 .gz、-gz、.z、-z 或 _z(不区分大小写)结尾且以正确的魔数开头的文件替换为未压缩文件,并移除原始扩展名。"
示例:
- 解压缩文件
gunzip filename.gz
- "递归地解压缩目录内所有与
gunzip支持的压缩文件格式匹配的文件:
gunzip -r directory_name/
- "解压缩当前工作目录中所有后缀匹配
.tgz的文件:
gunzip -S .tgz *
- 列出压缩和未压缩的大小、压缩比以及输入压缩文件的未压缩名称:
gunzip -l file_1 file_2
语法:
gunzip [ -acfhklLnNrtvV ] [-S suffix] [ name ... ]
关于使用 gzip、gunzip 和 tar 命令的视频教程:
本视频 展示了如何在 Unix shell 中进行压缩和解压缩。它使用 gunzip 作为解压缩命令。
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
| -c | --stdout | 写入标准输出,保持原始文件不变 |
| -h | --help | 提供帮助信息 |
| -k | --keep | 保持(不删除)输入文件 |
| -l | --list | 列出压缩文件内容 |
| -q | --quiet | 抑制所有警告 |
| -r | --recursive | 递归地对目录进行操作 |
| -S | --suffix=SUF | 在压缩文件上使用后缀 SUF |
| --synchronous | 同步输出(如果系统崩溃更安全,但速度较慢) | |
| -t | --test | 测试压缩文件完整性 |
| -v | --verbose | 详细模式 |
| -V | --version | 显示版本号 |
**注意:gunzip filename.gz 等同于 gzip -d filename.gz。
警告:默认情况下,不使用 -c 选项运行 gunzip 会删除原始压缩文件。
hostnamectl 命令
hostnamectl 命令提供了一个用于控制 Linux 系统主机名及其相关设置的适当 API。该命令还帮助在不实际定位和编辑给定系统上的 /etc/hostname 文件的情况下更改主机名。
语法
$ hostnamectl [OPTIONS...] COMMAND ...
其中 COMMAND 可以是以下任何一项
status:用于检查当前主机名设置
set-hostname NAME:用于设置系统主机名
set-icon-name NAME:用于为主机设置图标名称
示例
- 查看当前主机名的基本用法
$ hostnamectl
或者
$ hostnamectl status
- 将静态主机名更改为 myhostname。这可能需要或不需要 root 权限
$ hostnamectl set-hostname myhostname --static
- 设置或更改临时主机名
$ hostnamectl set-hostname myotherhostname --transient
- 设置美观的主机名。要设置的名字需要放在双引号(” “)内。
$ hostname set-hostname "prettyname" --pretty
iptables 命令
iptables 命令是 Linux 系统的强大防火墙管理工具。它允许您通过设置、维护和检查 IP 数据包过滤规则表来配置 Linux 内核防火墙(netfilter)。
语法
iptables [options] [chain] [rule-specification] [target]
基本概念
表
-
filter: 数据包过滤的默认表(INPUT, OUTPUT, FORWARD)
-
nat: 网络地址转换(PREROUTING, POSTROUTING, OUTPUT)
-
mangle: 数据包修改(PREROUTING, POSTROUTING, INPUT, OUTPUT, FORWARD)
-
raw: 连接跟踪豁免(PREROUTING, OUTPUT)
链
-
INPUT: 发往本地系统的入站数据包
-
OUTPUT: 来自本地系统的出站数据包
-
FORWARD: 通过系统路由的数据包
-
PREROUTING: 路由决策之前的数据包
-
POSTROUTING: 路由决策之后的数据包
目标
-
ACCEPT: 允许数据包
-
DROP: 静默丢弃数据包
-
REJECT: 丢弃并发送错误消息
-
LOG: 记录数据包并继续处理
-
DNAT: 目标网络地址转换
-
SNAT: 源网络地址转换
-
MASQUERADE: 动态源网络地址转换
基本命令
列出规则
# List all rules
sudo iptables -L
# List rules with line numbers
sudo iptables -L --line-numbers
# List rules in specific table
sudo iptables -t nat -L
sudo iptables -t mangle -L
# Show packet and byte counters
sudo iptables -L -v
# Show rules in iptables-save format
sudo iptables -S
基本规则操作
# Add rule to end of chain
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Insert rule at specific position
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
# Delete specific rule
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# Delete rule by line number
sudo iptables -D INPUT 3
# Replace rule at specific position
sudo iptables -R INPUT 1 -p tcp --dport 443 -j ACCEPT
常见规则示例
1. 允许/阻止特定端口
# Allow SSH (port 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow HTTP (port 80)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Allow HTTPS (port 443)
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Block specific port
sudo iptables -A INPUT -p tcp --dport 8080 -j DROP
2. 通过 IP 地址允许/阻止
# Allow specific IP
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT
# Block specific IP
sudo iptables -A INPUT -s 192.168.1.50 -j DROP
# Allow subnet
sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# Block IP range
sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
3. 通过接口允许/阻止
# Allow traffic on loopback
sudo iptables -A INPUT -i lo -j ACCEPT
# Allow on specific interface
sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
# Block on specific interface
sudo iptables -A INPUT -i eth1 -j DROP
高级规则
1. 状态连接
# Allow established and related connections
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow new connections on specific ports
sudo iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
2. 速率限制
# Limit SSH connections (6 per minute)
sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 6/min -j ACCEPT
# Limit ping requests
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/sec -j ACCEPT
3. 基于时间的规则
# Allow access during business hours
sudo iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 17:00 -j ACCEPT
# Allow access on weekdays
sudo iptables -A INPUT -p tcp --dport 22 -m time --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
4. 多端口规则
# Allow multiple ports
sudo iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
# Block multiple ports
sudo iptables -A INPUT -p tcp -m multiport --dports 135,445,1433 -j DROP
NAT 配置
1. 源网络地址转换(SNAT)
# Static SNAT
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1
# Dynamic SNAT (Masquerading)
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
2. 目标网络地址转换(DNAT)
# Port forwarding
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
# Forward to different IP
sudo iptables -t nat -A PREROUTING -d 203.0.113.1 -j DNAT --to-destination 192.168.1.100
政策配置
默认策略
# Set default policies
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# View current policies
sudo iptables -L | grep "policy"
链管理
# Create custom chain
sudo iptables -N CUSTOM_CHAIN
# Delete custom chain (must be empty)
sudo iptables -X CUSTOM_CHAIN
# Flush specific chain
sudo iptables -F INPUT
# Flush all chains
sudo iptables -F
记录
# Log dropped packets
sudo iptables -A INPUT -j LOG --log-prefix "DROPPED: " --log-level 4
# Log before dropping
sudo iptables -A INPUT -p tcp --dport 23 -j LOG --log-prefix "TELNET_ATTEMPT: "
sudo iptables -A INPUT -p tcp --dport 23 -j DROP
# View logs
sudo tail -f /var/log/syslog | grep "DROPPED:"
常见防火墙配置
1. 基本桌面防火墙
#!/bin/bash# Clear existing rules
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
# Default policies
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# Allow loopback
sudo iptables -A INPUT -i lo -j ACCEPT
# Allow established connections
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow ping
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
2. 网络服务器防火墙
#!/bin/bash# Basic web server configuration
sudo iptables -F
# Default policies
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# Allow loopback and established connections
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow SSH (limit attempts)
sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 6/min -j ACCEPT
# Allow HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Allow ping
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
3. 路由器/网关配置
#!/bin/bash# Enable IP forwardingecho 1 > /proc/sys/net/ipv4/ip_forward
# NAT for internal network
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# Allow forwarding for established connections
sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow forwarding from internal network
sudo iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
持久性
1. 保存/恢复规则
# Save current rules
sudo iptables-save > /etc/iptables/rules.v4
# Restore rules
sudo iptables-restore < /etc/iptables/rules.v4
# Install persistence package (Ubuntu/Debian)
sudo apt install iptables-persistent
2. 自动加载
# Create systemd service
sudo vim /etc/systemd/system/iptables-restore.service
[Unit]
Description=Restore iptables firewall rules
Before=network-pre.target
[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4
[Install]
WantedBy=multi-user.target
# Enable service
sudo systemctl enable iptables-restore.service
故障排除
1. 测试规则
# Test connectivity
telnet target-ip port
nc -zv target-ip port
# Check if rule matches
sudo iptables -L -v -n | grep "rule-description"
# Monitor rule usage
watch "sudo iptables -L -v -n"
2. 调试
# Enable all logging temporarily
sudo iptables -A INPUT -j LOG --log-prefix "INPUT: "
sudo iptables -A OUTPUT -j LOG --log-prefix "OUTPUT: "
sudo iptables -A FORWARD -j LOG --log-prefix "FORWARD: "
# Monitor logs
sudo tail -f /var/log/syslog | grep "INPUT:\|OUTPUT:\|FORWARD:"
3. 紧急访问
# Temporary rule to allow all (emergency)
sudo iptables -I INPUT 1 -j ACCEPT
# Flush all rules (removes all protection)
sudo iptables -F
sudo iptables -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
安全最佳实践
1. 默认拒绝策略
# Always start with deny-all policy
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
# Keep OUTPUT as ACCEPT for normal operation
2. 顺序问题
# More specific rules should come first
sudo iptables -I INPUT 1 -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
3. 限制关键服务的速率
# Protect SSH from brute force
sudo iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH
sudo iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 3 --name SSH -j DROP
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
性能考虑
# Use connection tracking for better performance
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Place frequently matched rules first
sudo iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Use specific matches to reduce processing
sudo iptables -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT
重要注意事项
-
在使规则永久化之前始终测试规则
-
保持一种方法,以防规则阻止你访问系统
-
使用特定的协议和端口而不是泛洪规则
-
监控日志以了解流量模式
-
记录你的防火墙规则以供将来参考
-
定期备份工作配置
-
考虑使用 UFW 以简化防火墙管理
iptables 命令提供了全面的防火墙功能,但需要仔细规划和测试,以避免安全问题和系统锁定。
更多详细信息,请参阅手册:man iptables
netstat 命令
术语 netstat 代表网络统计。用通俗易懂的话来说,netstat 命令显示当前的网络连接、网络协议统计信息以及各种其他接口。
检查您的电脑上是否有 netstat:
netstat –v
如果您的电脑上没有安装 netstat,您可以使用以下命令进行安装:
sudo apt install net-tools
您可以使用以下 netstat 命令进行一些用例:
- 带有
-nr标志的Netstat命令在终端上显示路由表详情。
示例:
netstat -nr
- 带有
-i标志的Netstat命令显示当前配置的网络接口的统计信息。此命令将显示文件foo.txt的前 10 行。
示例:
netstat -i
- 带有
-tunlp标志的Netstat命令将列出网络、它们的当前状态以及它们关联的端口。
示例:
netstat -tunlp
- 您可以使用
-at与netstat一起使用来获取所有 TCP 端口连接列表。
netstat -at
- 您可以使用
-au与netstat一起使用来获取所有 UDP 端口连接列表。
netstat -au
- 您可以使用
-l与netstat一起使用来获取所有活动的连接列表。
netstat -l
lsof命令
lsof命令显示所有运行进程打开的文件信息。它的名字也来源于“列出打开文件 > lsof”的事实。
打开的文件可能是一个普通文件、一个目录、一个块特殊文件、一个字符特殊文件、一个执行中的文本引用、一个库、一个流或一个网络文件(互联网套接字、NFS 文件或 UNIX 域套接字)。可以通过路径选择特定的文件或文件系统中的所有文件。
语法:
lsof [-OPTION] [USER_NAME]
示例:
- 要显示所有活动进程打开的所有文件:
lsof
- 要显示特定用户打开的文件:
lsof -u [USER_NAME]
- 要列出指定目录下打开文件的进程:
lsof +d [PATH_TO_DIR]
选项及其功能:
| 选项 | 附加选项 | 描述 |
|---|---|---|
-i |
tcp/ udp/ :port |
列出所有正在运行的网络连接,另外,在 udp/tcp 或指定端口上。 |
-i4 |
- | 列出所有具有 ipv4 连接的进程。 |
-i6 |
- | 列出所有具有 ipv6 连接的进程。 |
-c |
[进程名称] |
列出具有给定名称的特定进程的所有文件。 |
-p |
[进程 ID] |
列出由指定进程 ID 打开的所有文件。 |
-p |
^[进程 ID] |
列出所有未由指定进程 ID 打开的文件。 |
+d |
[路径] |
列出指定目录下打开文件的进程 |
+R |
- | 列出父进程 ID 打开的文件。 |
帮助命令
运行以下命令以查看lsof命令的完整指南。
man lsof
bzip2 命令
bzip2 命令允许您压缩和解压缩文件,即它有助于将文件绑定成一个单独的文件,这样占用的存储空间比原始文件要少。
语法:
bzip2 [OPTIONS] filenames ...
注意:每个文件都会被替换成其压缩版本,文件名后跟扩展名 bz2。
选项及其功能:
| 选项 | 别名 | 描述 |
|---|---|---|
-d |
--decompress |
解压缩压缩文件 |
-f |
--force |
强制覆盖现有输出文件 |
-h |
--help |
显示帮助信息并退出 |
-k |
--keep |
启用文件压缩,不会删除原始输入文件 |
-L |
--license |
显示许可条款和条件 |
-q |
--quiet |
抑制非必要警告信息 |
-t |
--test |
检查指定 .bz2 文件的完整性,但不想解压缩它们 |
-v |
--verbose |
显示每个压缩操作的详细信息 |
-V |
--version |
显示软件版本 |
-z |
--compress |
启用文件压缩,但会删除原始输入文件 |
默认情况下,当 bzip2 压缩文件时,它会删除原始(或输入)文件。然而,如果您不希望发生这种情况,请使用 -k 命令行选项。
示例:
- 强制压缩:
bzip2 -z input.txt
注意:此选项也会删除原始文件
- 强制压缩并保留原始输入文件:
bzip2 -k input.txt
- 强制解压缩:
bzip2 -d input.txt.bz2
- 测试压缩文件的完整性:
bzip2 -t input.txt.bz2
- 显示每个处理的文件的压缩比率:
bzip2 -v input.txt
service 命令
Service 尽可能在尽可能可预测的环境中运行 System V init 脚本,移除大多数环境变量,并将当前工作目录设置为 /。
SCRIPT 参数指定一个位于 /etc/init.d/ 的 System V init 脚本。COMMAND 的支持值取决于调用的脚本,服务将未经修改地将 COMMAND 和 OPTIONS 传递给 init 脚本。所有脚本至少应支持启动和停止命令。作为一个特殊情况,如果 COMMAND 是 --full-restart,脚本将运行两次,首先使用停止命令,然后使用启动命令。
COMMAND 至少可以是 start、stop、status 和 restart。
service --status-all 运行所有 init 脚本,按字母顺序,使用 status 命令
示例:
- 检查所有运行服务的状态:
service --status-all
- 运行脚本
service SCRIPT-Name start
- 一个更通用的命令:
service [SCRIPT] [COMMAND] [OPTIONS]
vmstat 命令
vmstat 命令让您监控您系统的性能。它显示了有关您的内存、磁盘、进程、CPU 调度、分页和块 IO 的信息。此命令也被称为虚拟内存统计报告。
产生的第一个报告显示了自上次重启以来的平均详细信息,之后,其他报告会随着时间的推移而生成。
vmstat

如您所见,这是一个非常实用的命令。上面我们看到的最重要的事情是 free,它显示了未被使用的空闲空间,si 显示了每秒交换进来的内存量(以 KB 为单位),而 so 显示了每秒交换出去的内存量(以 KB 为单位)。
vmstat -a
如果我们运行 vmstat -a,它将显示正在运行的系统的活跃和空闲内存。

vmstat -d
vmstat -d 命令显示了所有磁盘统计信息。

如您所见,这是一个非常实用的命令,显示了有关您虚拟内存的不同统计信息
mpstat命令
mpstat命令用于报告处理器相关统计信息。它准确显示系统 CPU 使用率的统计信息以及 CPU 利用率和性能信息。
语法:
mpstat [options] [<interval> [<count>]]
注意:它将第一个处理器初始化为 CPU 0,第二个处理器为 CPU 1,依此类推。
选项及其功能:
| 选项 | 描述 |
|---|---|
-A |
显示所有详细统计信息 |
-h |
显示 mpstat 帮助信息 |
-I |
显示详细的中断统计信息 |
-n |
根据 NUMA 节点位置报告总结 CPU 统计信息 |
-N |
指定要报告统计信息的 NUMA 节点 |
-P |
指定要报告统计信息的处理器 |
-o |
以 JSON(JavaScript 对象表示法)格式显示统计信息 |
-T |
在 CPU 报告中显示拓扑元素 |
-u |
报告 CPU 利用率 |
-v |
在虚拟处理器级别显示利用率统计信息 |
-V |
显示 mpstat 版本 |
-ALL |
显示所有 CPU 的详细统计信息 |
示例:
- 显示处理器和 CPU 统计信息:
mpstat
- 显示所有 CPU 的处理器编号:
mpstat -P ALL
- 获取工具可能收集的所有信息:
mpstat -A
- 显示特定处理器的 CPU 利用率:
mpstat -P 0
- 以时间间隔显示 CPU 使用情况:
mpstat 1 5
注意:此命令将以 1 秒的时间间隔打印 5 个报告
ncdu 命令
ncdu(NCurses Disk Usage)是知名 du 命令的基于 curses 的版本。它提供了一种快速查看哪些目录正在占用磁盘空间的方法。
示例
- 静音模式
ncdu -q
- 忽略挂载的目录
ncdu -q -x
语法
ncdu [-hqvx] [--exclude PATTERN] [-X FILE] dir
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-h |
- | 打印简短的帮助信息 |
-q |
- | 静音模式。在计算磁盘空间时,ncdu 默认每秒更新屏幕 10 次,在静音模式下,这将减少到每 2 秒更新一次。使用此功能可以在远程连接上节省带宽。 |
-v |
- | 打印版本信息。 |
-x |
- | 仅计算指定目录所在文件系统上的文件和目录。 |
| - | --exclude PATTERN |
排除与 PATTERN 匹配的文件。此参数可以多次添加以添加更多模式。 |
-X FILE |
--exclude-from FILE |
排除与 FILE 中任何模式匹配的文件。模式应以换行符分隔。 |
uniq 命令
Linux 中的uniq命令是一个命令行实用工具,用于报告或过滤文件中的重复行。简单来说,uniq是帮助你检测相邻重复行并删除重复行的工具。它从输入文件(作为参数提供)中过滤出相邻匹配的行,并将过滤后的数据写入输出文件。
示例:
为了从文件中省略重复的行,语法如下:
uniq kt.txt
为了告诉一行重复了多少次,语法如下:
uniq -c kt.txt
为了打印重复的行,语法如下:
uniq -d kt.txt
为了打印唯一的行,语法如下:
uniq -u kt.txt
为了在比较行的唯一性时跳过 N 个字段,语法如下:
uniq -f 2 kt.txt
为了在比较行的唯一性时跳过 N 个字符,语法如下:
uniq -s 5 kt.txt
为了使比较不区分大小写,语法如下:
uniq -i kt.txt
语法:
uniq [OPTION] [INPUT[OUTPUT]]
可能的选项:
| 标志 | 描述 | 参数 |
|---|---|---|
-c |
它通过在行前显示一个数字作为前缀来告诉一行重复了多少次。 | - |
-d |
它只打印重复的行,而不是不重复的行。 | - |
-i |
默认情况下,比较是区分大小写的,但使用此选项可以进行不区分大小写的比较。 | - |
-f |
允许你在确定行的唯一性之前跳过 N 个字段(字段是一组由空白字符分隔的字符)。 | N |
-s |
在确定唯一性时,它不比较每行的前 N 个字符。这与-f 选项类似,但它跳过单个字符而不是字段。 | N |
-u |
允许你只打印唯一的行。 | - |
-z |
它将使行以 0 字节(NULL)结束,而不是换行符。 | - |
-w |
它只比较一行中的 N 个字符。 | N |
--help |
显示帮助信息并退出。 | - |
--version |
显示版本信息并退出。 | - |
RPM 命令
rpm - RPM 软件包管理器
rpm 是一个强大的 软件包管理器,可用于构建、安装、查询、验证、更新和擦除单个软件包。软件包由用于安装和擦除存档文件的文件存档和元数据组成。元数据包括辅助脚本、文件属性和有关软件包的描述性信息。软件包有两种类型:二进制软件包,用于封装要安装的软件,和源软件包,包含生成二进制软件包所需的源代码和配方。
必须选择以下基本模式之一:查询、验证、签名检查、安装/升级/刷新、卸载、初始化数据库、重建数据库、重新签名、添加签名、设置所有者/组、显示查询标签和显示配置。
通用选项
这些选项可以在所有不同的模式下使用。
| 短标志 | 长标志 | 描述 |
|---|---|---|
| -? | --help | 打印比正常更长的使用消息。 |
| - | --version | 打印使用中的 rpm 版本号的单行信息。 |
| - | --quiet | 尽可能少地打印信息 - 通常只显示错误消息。 |
| -v | - | 打印详细信息 - 通常显示常规进度消息。 |
| -vv | - | 打印大量丑陋的调试信息。 |
| - | --rcfile FILELIST | rpm 将按顺序读取冒号分隔的 FILELIST 中的每个文件以获取配置信息。列表中的第一个文件必须存在,波浪号将被展开为 $HOME 的值。默认的 FILELIST 是 /usr/lib/rpm/rpmrc:/usr/lib/rpm/redhat/rpmrc:/etc/rpmrc:~/.rpmrc。 |
| - | --pipe CMD | 将 rpm 的输出管道传输到命令 CMD。 |
| - | --dbpath DIRECTORY | 使用 DIRECTORY 中的数据库而不是默认路径 /var/lib/rpm |
| - | --root DIRECTORY | 使用根目录为 DIRECTORY 的文件系统树进行所有操作。请注意,这意味着 DIRECTORY 内的数据库将用于依赖性检查,并且任何脚本(例如,如果安装则运行 %post,如果构建则运行 %prep 的软件包)将在 chroot(2) 到 DIRECTORY 之后运行。 |
| -D | --define='MACRO EXPR' | 定义具有值 EXPR 的宏 MACRO。 |
| -E | --eval='EXPR' | 打印 EXPR 的宏展开。 |
概述
查询和验证软件包:
rpm {-q|--query} [select-options] [query-options]
rpm {-V|--verify} [select-options] [verify-options]
rpm --import PUBKEY ...
rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE ...
安装、升级和删除软件包:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
杂项:
rpm {--initdb|--rebuilddb}
rpm {--addsign|--resign} PACKAGE_FILE...
rpm {--querytags|--showrc}
rpm {--setperms|--setugids} PACKAGE_NAME .
查询选项
[--changelog] [-c,--configfiles] [-d,--docfiles] [--dump]
[--filesbypkg] [-i,--info] [--last] [-l,--list]
[--provides] [--qf,--queryformat QUERYFMT]
[-R,--requires] [--scripts] [-s,--state]
[--triggers,--triggerscripts]
验证选项
[--nodeps] [--nofiles] [--noscripts]
[--nodigest] [--nosignature]
[--nolinkto] [--nofiledigest] [--nosize] [--nouser]
[--nogroup] [--nomtime] [--nomode] [--nordev]
[--nocaps]
安装选项
[--aid] [--allfiles] [--badreloc] [--excludepath OLDPATH]
[--excludedocs] [--force] [-h,--hash]
[--ignoresize] [--ignorearch] [--ignoreos]
[--includedocs] [--justdb] [--nodeps]
[--nodigest] [--nosignature] [--nosuggest]
[--noorder] [--noscripts] [--notriggers]
[--oldpackage] [--percent] [--prefix NEWPATH]
[--relocate OLDPATH=NEWPATH]
[--replacefiles] [--replacepkgs]
[--test]
scp 命令
SCP(安全复制)是一个命令行实用程序,允许您在两个位置之间安全地复制文件和目录。
文件和密码都进行了加密,这样任何窃听流量的人都不会得到任何敏感信息。
复制文件或目录的不同方式:
-
从本地系统到远程系统。
-
从远程系统到本地系统。
-
从本地系统复制到两个远程系统。
示例:
- 要将文件从本地系统复制到远程系统:
scp /home/documents/local-file root@{remote-ip-address}:/home/
- 要将文件从远程系统复制到本地系统:
scp root@{remote-ip-address}:/home/remote-file /home/documents/
- 要在本地系统之间复制两个远程系统中的文件。
scp root@{remote1-ip-address}:/home/remote-file root@{remote2-ip-address}/home/
- 通过跳转主机服务器复制文件。
scp /home/documents/local-file -oProxyJump=<jump-host-ip> root@{remote-ip-address}/home/
在某些机器上较新版本的 scp 中,您可以使用上述命令并带有 -J 标志。
scp /home/documents/local-file -J <jump-host-ip> root@{remote-ip-address}/home/
语法:
scp [OPTION] [user@]SRC_HOST:]file1 [user@]DEST_HOST:]file2
-
OPTION- scp 选项,如加密、ssh 配置、ssh 端口、限制、递归复制等。 -
[用户@]源主机:]文件 1- 源文件 -
[用户@]目标主机:]文件 2- 目标文件
应使用绝对或相对路径指定本地文件,而远程文件名应包括用户和主机指定。
scp 提供了多种选项来控制其行为的各个方面。最常用的选项包括:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-P |
- | 指定远程主机的 ssh 端口。 |
-p |
- | 保留文件的修改时间和访问时间。 |
-q |
- | 如果您想抑制进度条和非错误消息,请使用此选项。 |
-C |
- | 此选项强制 scp 在发送到目标机器时压缩数据。 |
-r |
- | 这个选项告诉 scp 递归地复制目录。 |
在开始之前
scp 命令依赖于 ssh 进行数据传输,因此它需要在远程系统上进行 ssh 密钥 或 密码 认证。
冒号 (:) 是 scp 区分本地和远程位置的方式。
要能够复制文件,您必须在源文件上至少有读取权限,在目标系统上有写入权限。
在复制两个系统上具有相同名称和位置的文件时,请小心,scp 会无警告地覆盖文件。
在传输大文件时,建议在 screen 或 tmux 会话中运行 scp 命令。
sleep 命令
sleep 命令用于创建一个虚拟作业。虚拟作业有助于延迟执行。默认情况下,它以秒为单位计时,但可以在末尾添加一个小后缀(s, m, h, d)以将其转换为其他任何格式。此命令暂停执行,暂停时间由 NUMBER 定义。
注意:如果您使用 sleep 命令定义多个 NUMBER,则此命令将延迟的总时间为这些值的总和。
示例:
- 暂停 10 秒
sleep 10s
- 一个更通用的命令:
sleep NUMBER[SUFFIX]...
选项
它接受以下选项:
-
--help
显示此帮助信息并退出
-
--version
输出版本信息并退出
split命令
Linux 中的split命令用于将文件分割成更小的文件。
示例
- 使用文件名将文件分割成更小的文件。
split filename.txt
- 从前缀 file 开始将名为 filename 的文件分割成 200 行的段。
split -l 200 filename file
这将创建名为 fileaa、fileab、fileac、filead 等,每文件 200 行的文件。
- 使用前缀 file 将名为 filename 的文件分割成 40 字节的段。
split -b 40 filename file
这将创建名为 fileaa、fileab、fileac、filead 等,大小为 40 字节的文件。
- 使用
--verbose标志分割文件以查看正在创建的文件。
split filename.txt --verbose
语法:
split [options] filename [prefix]
其他标志及其功能
| 短标志 | 长标志 | 描述 |
|---|---|---|
-a |
--suffix-length=N |
生成长度为 N 的后缀(默认 2) |
--additional-suffix=SUFFIX |
将额外的 SUFFIX 附加到文件名上 | |
-b |
--bytes=SIZE |
每个输出文件放置 SIZE 字节 |
-C |
--line-bytes=SIZE |
每个输出文件放置最多 SIZE 字节的记录 |
-d |
使用从 0 开始的数字后缀,而不是字母 | |
--numeric-suffixes[=FROM] |
与-d 相同,但允许设置起始值 | |
-x |
使用从 0 开始的十六进制后缀,而不是字母 | |
--hex-suffixes[=FROM] |
与-x 相同,但允许设置起始值 | |
-e |
--elide-empty-files |
不要在'-n'时生成空输出文件 |
--filter=COMMAND |
将命令写入 shell;文件名为$FILE | |
-l |
--lines=NUMBER |
每个输出文件放置 NUMBER 行/记录 |
-n |
--number=CHUNKS |
生成 CHUNKS 个输出文件;见下文解释 |
-t |
--separator=SEP |
使用 SEP 代替换行符作为记录分隔符;'\0'(零)指定空字符 |
-u |
--unbuffered |
在'-n r/...'时立即将输入复制到输出 |
--verbose |
在每个输出文件打开前打印诊断信息 | |
--help |
显示此帮助信息并退出 | |
--version |
输出版本信息并退出 |
SIZE 参数是一个整数和可选的单位(例如:10K 是 10*1024)。单位是 K,M,G,T,P,E,Z,Y(1024 的幂)或 KB,MB,...(1000 的幂)。
CHUNKS 可以是:
| CHUNKS | 描述 |
|---|---|
N |
根据输入大小分割成 N 个文件 |
K/N |
输出 N 中的第 K 个到 stdout |
l/N |
不分割行/记录分割成 N 个文件 |
l/K/N |
输出 N 中的第 K 个到 stdout 而不分割行/记录 |
r/N |
类似于'l',但使用轮询分配 |
r/K/N |
同样,但只输出 N 中的第 K 个到 stdout |
stat 命令
stat 命令让您显示文件或文件系统的状态。它提供了关于您使用它的文件(或目录)的有用信息。
示例:
- 基本命令用法
stat file.txt
- 使用
-c(或--format)参数仅显示您想看到的信息(在此处,总大小,以字节为单位)
stat file.txt -c %s
语法:
stat [OPTION] [FILE]
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-L |
--dereference |
跟随链接 |
-f |
--file-system |
显示文件系统状态而不是文件状态 |
-c |
--format=FORMAT |
指定格式(见下文) |
-t |
--terse |
以简洁形式打印信息 |
| - | --cached=MODE |
指定如何使用缓存属性。可以是:always,never 或 default |
| - | --printf=FORMAT |
与 --format 类似,但解释反斜杠转义(\n, \t, ...) |
| - | --help |
显示帮助信息并退出 |
| - | --version |
输出版本信息并退出 |
文件的有效格式序列示例:
| 格式 | 描述 |
|---|---|
%a |
八进制权限位 |
%A |
以人类可读形式显示权限位和文件类型 |
%d |
十进制中的设备号 |
%D |
十六进制中的设备号 |
%F |
文件类型 |
%g |
所有者的组 ID |
%G |
所有者的组名 |
%h |
硬链接数 |
%i |
索引节点号 |
%m |
挂载点 |
%n |
文件名 |
%N |
如果是符号链接则取消引用的引号文件名 |
%s |
总大小,以字节为单位 |
%u |
所有者的用户 ID |
%U |
所有者的用户名 |
%w |
文件创建时间,可读格式;- 如果未知 |
%x |
最后访问时间,可读格式 |
%y |
最后数据修改时间,可读格式 |
%z |
最后状态更改时间,可读格式 |
useradd命令
useradd命令用于向系统添加或更新用户账户。
示例:
使用useradd命令添加新用户的语法如下:
useradd NewUser
使用useradd命令添加新用户并为该新用户指定家目录路径的语法如下:
useradd -d /home/NewUser NewUser
使用useradd命令添加新用户并为其指定特定 ID 的语法如下:
useradd -u 1234 NewUser
语法:
useradd [OPTIONS] NameOfUser
可能的选项:
| Flag | 描述 | 参数 |
|---|---|---|
-d |
新用户将使用/path/to/directory 作为用户登录目录的值创建 | /path/to/directory |
-u |
用户 ID 的数值 | ID |
-g |
使用特定组 ID 创建用户 | GroupID |
-M |
创建不带家目录的用户 | - |
-e |
使用到期日期创建用户 | DATE (格式:YYYY-MM-DD) |
-c |
使用注释创建用户 | COMMENT |
-s |
使用更改后的登录 shell 创建用户 | /path/to/shell |
-p |
为用户设置未加密的密码 | PASSWORD |
userdel 命令
userdel 命令用于删除用户账户及其相关文件
示例:
要使用 userdel 命令删除用户,语法如下:
userdel userName
要强制删除用户账户,即使用户仍然登录,使用 userdel 命令的语法如下:
userdel -f userName
要使用 userdel 命令删除用户及其主目录中的文件,语法如下:
userdel -r userName
语法:
userdel [OPTIONS] userName
可能的选项:
| 标志 | 描述 |
|---|---|
-f |
强制删除指定的用户账户,即使用户已登录 |
-r |
删除用户主目录中的文件以及主目录本身和用户的邮件队列 |
-Z |
删除用户登录的任何 SELinux(安全增强型 Linux)用户映射。 |
usermod 命令
usermod 命令允许您通过命令行更改 Linux 中用户的属性。在创建用户后,我们有时需要更改他们的属性,如密码或登录目录等。因此,为了做到这一点,我们使用 usermod 命令。
语法:
usermod [options] USER
注意:只有超级用户(root)可以执行 usermod 命令
选项及其功能:
| 选项 | 描述 |
|---|---|
-a |
将组中的任何人添加到次要组 |
-c |
为用户账户添加注释字段 |
-d |
修改任何现有用户账户的目录 |
-g |
更改用户的默认组 |
-G |
添加补充组 |
-l |
更改现有的用户登录名 |
-L |
锁定系统用户账户 |
-m |
将现有主目录的内容移动到新目录 |
-p |
创建一个未加密的密码 |
-s |
为新账户创建指定的 shell |
-u |
为用户账户分配 UID |
-U |
解锁任何被锁定的用户 |
示例:
- 要为用户添加注释/描述:
sudo usermod -c "This is test user" test_user
- 要更改用户的家目录:
sudo usermod -d /home/sam test_user
- 要更改用户的过期日期:
sudo usermod -e 2021-10-05 test_user
- 要更改用户的组:
sudo usermod -g sam test_user
- 要更改用户登录名:
sudo usermod -l test_account test_user
- 要锁定用户:
sudo usermod -L test_user
- 要解锁用户:
sudo usermod -U test_user
- 要为用户设置未加密的密码:
sudo usermod -p test_password test_user
- 要为用户创建一个 shell:
sudo usermod -s /bin/sh test_user
- 要更改用户的用户 ID:
sudo usermod -u 1234 test_user
ionice 命令
ionice 命令用于设置或获取进程 I/O 调度类和优先级。
如果没有给出参数,ionice 将查询该进程当前的 I/O 调度类和优先级。
用法
ionice [options] -p <pid>
ionice [options] -P <pgid>
ionice [options] -u <uid>
ionice [options] <command>
进程可以是三种调度类之一:
-
空闲
空闲 I/O 优先级的程序只有在没有其他程序在定义的宽限期请求磁盘 I/O 时才会获得磁盘时间。
空闲进程对正常系统活动的影响应该是“零”。
此调度类不接收优先级参数。
目前,此调度类允许普通用户(自内核 2.6.25 以来)使用。
-
尽力而为
这是一个适用于任何未请求特定 I/O 优先级的进程的有效调度类。
此类从 0-7 的优先级参数中获取优先级,数字越低优先级越高。
具有相同尽力而为优先级的程序将以轮询方式服务。
注意,在 2.6.26 之前的内核中,未请求 I/O 优先级的进程正式使用“None”作为调度类,但 I/O 调度器会将此类进程视为尽力而为类。
尽力而为类中的优先级将动态地从进程的 CPU nice 级别中推导出来:io_priority = ( cpu_nice + 20 ) / 5,对于 2.6.26 之后的内核以及 CFQ I/O 调度器的进程,未请求 sn io 优先级的进程将继承 CPU 调度类。
I/O 优先级来自进程的 CPU nice 级别(在 2.6.26 之前的内核中为 smr sd)。
-
实时
实时调度类将首先获得对磁盘的访问,无论系统中的其他操作如何。
因此,实时类需要谨慎使用,因为它可能会影响其他进程。
与尽力而为类一样,定义了 8 个优先级级别,表示每个调度窗口中给定进程将获得的时间片大小。
此调度类不允许普通用户(非 root)使用。
选项
| 选项 | 描述 |
|---|---|
| -c, --class |
调度类的名称或编号,0:无,1:实时,2:尽力而为,3:空闲 |
| -n, --classdata | 指定调度类中的优先级(0..7),仅适用于实时和尽力而为类 |
| -p, --pid |
对这些已运行的进程进行操作 |
| -P, --pgid |
对这些组中已运行的进程进行操作 |
| -t, --ignore | 忽略失败 |
| -u, --uid |
对这些用户拥有的已运行进程进行操作 |
| -h, --help | 显示此帮助 |
| -V, --version | 显示版本 |
更多详细信息请参阅 ionice(1)。
示例
| 命令 | 输出 | 说明 |
|---|---|---|
$ ionice |
无:优先级 4 | 单独运行 ionice 将给出当前进程的类和优先级 |
$ ionice -p 101 |
无:优先级 4 | 给出指定进程 ID 的进程的详细信息(类:优先级) |
$ ionice -p 2 |
none: prio 4 | 检查具有 pid 2 的进程的类和优先级,它是 none 和 4 相应地 |
$ ionice -c2 -n0 -p2 |
2 ( best-effort ) priority 0 process 2 | 现在让我们将进程(pid) 2 设置为具有最高优先级的 best-effort 程序 |
$ ionice -p 2 |
best-effort : prio 0 | 现在如果检查进程 2 的详细信息,你可以看到更新后的信息 |
$ ionice /bin/ls |
获取/bin/ls 的优先级和类信息 | |
$ ionice -n4 -p2 |
为进程 2 设置优先级 4 | |
$ ionice -p 2 |
best-effort: prio 4 | 现在观察上面运行的命令和这个命令之间的区别,我们将优先级从 0 改为 4 |
$ ionice -c0 -n4 -p2 |
ionice: ignoring given class data for none class | (注意,在内核 2.6.26 之前,未正式请求 I/O 优先级的进程使用“None”作为调度类, |
| 但 I/O 调度器将此类进程视为在 best-effort 类中。 ) | ||
| -t option : ignore failure | ||
$ ionice -c0 -n4 -p2 -t |
为了忽略上面显示的警告,我们可以使用-t 选项,这样它将忽略失败 |
结论
因此,我们已经成功学习了ionice命令。
du 命令
du 命令,即 disk usage 的缩写,允许你检索指定目录中磁盘空间使用情况的信息。为了根据你需要的信息自定义输出,这个命令可以与适当的选项或标志搭配使用。
示例:
- 要显示当前目录中子目录的估计大小:
du
- 要显示指定目录内子目录的估计大小:
du {PATH_TO_DIRECTORY}
语法:
du [OPTION]... [FILE]...
du [OPTION]... --files0-from=F
其他标志及其功能:
注意:此列表并非选项的完整列表。
| 短标志 | 长标志 | 描述 |
|---|---|---|
-a |
--all |
包括文件和目录的信息 |
-c |
--total |
在文件/目录列表的末尾提供总计数 |
-d |
--max-depth=N |
提供从执行命令的目录开始的最多 N 级别的信息 |
-h |
--human-readable |
以人类可读的单位显示文件大小,而不是字节 |
-s |
--summarize |
仅显示总文件大小,而不是文件/目录列表 |
ping 命令
ping(数据包互联网探索器)命令是一个网络工具,用于检查主机和服务器或另一个主机之间的网络连通性。它向指定的 IP 地址或 URL 发送 ICMP(互联网控制消息协议)回显请求,并测量接收响应所需的时间。这个时间延迟被称为“延迟”。Ping 是网络故障排除和监控的基本工具。
理解延迟
在网络环境中,延迟是指发送数据包和接收响应之间的时间延迟。
当您使用 ping 命令时,它通过向目标主机发送一系列数据包并计算每个数据包完成往返所需的时间来测量延迟。延迟通常以毫秒(ms)为单位。理解延迟至关重要,因为:
-
网络性能:较低的延迟意味着更快的数据传输和更响应的网络连接,这对于实时应用至关重要。
-
故障排除:高延迟可能表明网络拥塞、数据包丢失或需要关注的连接问题。
-
服务质量(QoS):服务提供商和网络管理员使用延迟指标来确保网络服务满足质量标准。
基本的 ping 语法包括 ping 后跟一个主机名、网站名称或确切的 IP 地址。
ping [option] [hostname] or [IP address]
示例:
- 在您的系统上安装 ping 版本。
sudo ping -v
- 要检查远程主机是否运行,在这个例子中是 google.com,请在您的终端中输入:
ping google.com
- 控制发送的数据包数量:以前我们没有通过使用 -c 选项定义发送到服务器/主机的数据包数量,现在我们可以这样做。
ping -c 5 google.com
- 控制数据包大小:以前我们向主机发送默认大小的数据包,但我们可以通过使用 -s 选项发送轻量级和重型数据包。
ping -s 40 -c 5 google.com
- 改变 ping 数据包之间的时间间隔:默认情况下,ping 等待 1 秒发送下一个数据包,我们可以通过使用 -i 选项来改变这个时间。
ping -i 2 google.com
rsync命令
rsync命令可能是最常用的命令之一。它用于通过 SSH 安全地从一台服务器复制文件到另一台服务器。
与执行类似任务的scp命令相比,rsync使传输速度更快,并且在传输中断的情况下,你可以恢复/继续传输过程。
在这个教程中,我将向你展示如何使用rsync命令,从一台服务器复制文件到另一台,并分享一些有用的技巧!
在开始之前,你需要拥有 2 台 Linux 服务器。我将使用 DigitalOcean 进行演示并部署 2 台 Ubuntu 服务器。
你可以使用我的推荐链接获得免费的$100 信用额度,你可以用它来部署虚拟机,并在几个 DigitalOcean 服务器上测试指南:
将本地服务器上的文件传输到远程
这是最常见的原因之一。本质上,这就是你从当前所在的服务器(源服务器)复制文件到远程/目标服务器的方式。
你需要做的是 SSH 到保存你文件的服务器,cd 到你想传输的目录:
cd /var/www/html
然后运行:
rsync -avz user@your-remote-server.com:/home/user/dir/
上述命令将复制服务器上当前文件夹中的所有文件和目录到你的远程服务器。
命令概述:
-
-a:用于指定你想要递归并保留文件权限等。 -
-v:是详细模式,它增加了在传输过程中你获得的信息量。 -
-z:此选项,在将文件发送到目标机器时,rsync会压缩文件数据,这减少了传输的数据量——这在慢速连接中非常有用。
我建议查看以下网站,它非常详细地解释了命令和参数:
explainshell.com/explain?cmd=rsync+-avz
如果远程服务器上的 SSH 服务没有运行在标准的22端口上,你可以使用带有特殊 SSH 端口的rsync:
rsync -avz -e 'ssh -p 1234' user@your-remote-server.com:/home/user/dir/
将远程服务器上的文件传输到本地
在某些情况下,你可能想从你的远程服务器传输文件到本地服务器,在这种情况下,你需要使用以下语法:
rsync -avz your-user@your-remote-server.com:/home/user/dir/ /home/user/local-dir/
再次提醒,如果你有一个非标准的 SSH 端口,你可以使用以下命令:
rsync -avz -e 'ssh -p 2510' your-user@your-remote-server.com:/home/user/dir/ /home/user/local-dir/
仅传输缺失的文件
如果你只想传输缺失的文件,可以使用--ignore-existing标志。
这对于确保网站或服务器迁移后没有缺失文件,进行最后的同步非常有用。
基本上,命令将是相同的,除了附加的--ignore-existing标志:
rsync -avz --ignore-existing user@your-remote-server.com:/home/user/dir/
结论
使用rsync是一种快速且安全地将一些文件从一个机器传输到另一个机器的好方法。
对于更多酷的 Linux 网络工具,我建议查看以下教程:
希望这能帮到您!
初始发布于此:如何使用 rsync 将文件从一个 Linux 服务器传输到另一个 Linux 服务器
dig 命令
dig - 域名系统查找实用工具
dig 是一个灵活的工具,用于查询 DNS 命名服务器。它执行 DNS 查找并显示从被查询的命名服务器返回的答案。
示例:
- Dig 是一个用于查询域名系统的网络管理命令行工具。
dig google.com
- 系统将列出它找到的所有 google.com 域名系统记录,以及相应的 IP 地址。
dig google.com ANY
语法:
dig [server] [name] [type] [q-type] [q-class] {q-opt}
{global-d-opt} host [@local-server] {local-d-opt}
[ host [@local-server] {local-d-opt} [...]]
其他标志及其功能:
domain is in the Domain Name System
q-class is one of (in,hs,ch,...) [default: in]
q-type is one of (a,any,mx,ns,soa,hinfo,axfr,txt,...) [default:a]
(Use ixfr=version for type ixfr)
q-opt is one of:
-4 (use IPv4 query transport only)
-6 (use IPv6 query transport only)
-b address[#port] (bind to source address/port)
-c class (specify query class)
-f filename (batch mode)
-k keyfile (specify tsig key file)
-m (enable memory usage debugging)
-p port (specify port number)
-q name (specify query name)
-r (do not read ~/.digrc)
-t type (specify query type)
-u (display times in usec instead of msec)
-x dot-notation (shortcut for reverse lookups)
-y [hmac:]name:key (specify named base64 tsig key)
d-opt is of the form +keyword[=value], where keyword is:
+[no]aaflag (Set AA flag in query (+[no]aaflag))
+[no]aaonly (Set AA flag in query (+[no]aaflag))
+[no]additional (Control display of additional section)
+[no]adflag (Set AD flag in query (default on))
+[no]all (Set or clear all display flags)
+[no]answer (Control display of answer section)
+[no]authority (Control display of authority section)
+[no]badcookie (Retry BADCOOKIE responses)
+[no]besteffort (Try to parse even illegal messages)
+bufsize[=###] (Set EDNS0 Max UDP packet size)
+[no]cdflag (Set checking disabled flag in query)
+[no]class (Control display of class in records)
+[no]cmd (Control display of command line -
global option)
+[no]comments (Control display of packet header
and section name comments)
+[no]cookie (Add a COOKIE option to the request)
+[no]crypto (Control display of cryptographic
fields in records)
+[no]defname (Use search list (+[no]search))
+[no]dnssec (Request DNSSEC records)
+domain=### (Set default domainname)
+[no]dscp[=###] (Set the DSCP value to ### [0..63])
+[no]edns[=###] (Set EDNS version) [0]
+ednsflags=### (Set EDNS flag bits)
+[no]ednsnegotiation (Set EDNS version negotiation)
+ednsopt=###[:value] (Send specified EDNS option)
+noednsopt (Clear list of +ednsopt options)
+[no]expandaaaa (Expand AAAA records)
+[no]expire (Request time to expire)
+[no]fail (Don't try next server on SERVFAIL)
+[no]header-only (Send query without a question section)
+[no]identify (ID responders in short answers)
+[no]idnin (Parse IDN names [default=on on tty])
+[no]idnout (Convert IDN response [default=on on tty])
+[no]ignore (Don't revert to TCP for TC responses.)
+[no]keepalive (Request EDNS TCP keepalive)
+[no]keepopen (Keep the TCP socket open between queries)
+[no]mapped (Allow mapped IPv4 over IPv6)
+[no]multiline (Print records in an expanded format)
+ndots=### (Set search NDOTS value)
+[no]nsid (Request Name Server ID)
+[no]nssearch (Search all authoritative nameservers)
+[no]onesoa (AXFR prints only one soa record)
+[no]opcode=### (Set the opcode of the request)
+padding=### (Set padding block size [0])
+[no]qr (Print question before sending)
+[no]question (Control display of question section)
+[no]raflag (Set RA flag in query (+[no]raflag))
+[no]rdflag (Recursive mode (+[no]recurse))
+[no]recurse (Recursive mode (+[no]rdflag))
+retry=### (Set number of UDP retries) [2]
+[no]rrcomments (Control display of per-record comments)
+[no]search (Set whether to use searchlist)
+[no]short (Display nothing except short
form of answers - global option)
+[no]showsearch (Search with intermediate results)
+[no]split=## (Split hex/base64 fields into chunks)
+[no]stats (Control display of statistics)
+subnet=addr (Set edns-client-subnet option)
+[no]tcflag (Set TC flag in query (+[no]tcflag))
+[no]tcp (TCP mode (+[no]vc))
+timeout=### (Set query timeout) [5]
+[no]trace (Trace delegation down from root [+dnssec])
+tries=### (Set number of UDP attempts) [3]
+[no]ttlid (Control display of ttls in records)
+[no]ttlunits (Display TTLs in human-readable units)
+[no]unexpected (Print replies from unexpected sources
default=off)
+[no]unknownformat (Print RDATA in RFC 3597 "unknown" format)
+[no]vc (TCP mode (+[no]tcp))
+[no]yaml (Present the results as YAML)
+[no]zflag (Set Z flag in query)
global d-opts and servers (before host name) affect all queries.
local d-opts and servers (after host name) affect only that lookup.
-h (print help and exit)
-v (print version and exit)
whois 命令
Linux 中的 whois 命令用于查找有关域的信息,例如域的所有者、所有者的联系信息和域使用的名称服务器。
示例:
- 执行对域名的 whois 查询:
whois {Domain_name}
-
- 使用
-H选项可以省略许多域名注册商与域名信息一起提供的冗长法律免责声明。
- 使用
whois -H {Domain_name}
语法:
whois [ -h HOST ] [ -p PORT ] [ -aCFHlLMmrRSVx ] [ -g SOURCE:FIRST-LAST ]
[ -i ATTR ] [ -S SOURCE ] [ -T TYPE ] object
whois -t TYPE
whois -v TYPE
whois -q keyword
其他标志及其功能:
| 标志 | 描述 |
|---|---|
-h HOST, --host HOST |
连接到主机(HOST)。 |
-H |
不显示一些注册商喜欢显示的法律免责声明。 |
-p, --port PORT |
连接到端口(PORT)。 |
--verbose |
详细输出。 |
--help |
显示在线帮助。 |
--version |
显示客户端版本信息。其他选项是 whois.ripe.net 和一些其他 RIPE 类似的服务器所理解的标志。 |
-a |
也搜索所有镜像数据库。 |
-b |
返回带有滥用联系人的简短 IP 地址范围。 |
-B |
禁用对象过滤(显示电子邮件地址)。 |
-c |
返回带有对 irt 对象引用的最小 IP 地址范围。 |
-d |
返回反向 DNS 委派对象。 |
-g SOURCE:FIRST-LAST |
在 FIRST 和 LAST 更新序列号之间搜索来自源数据库的更新。这对于获取近实时镜像流很有用。 |
-G |
禁用关联对象的分组。 |
-i ATTR[,ATTR]... |
搜索具有关联属性的对象。ATTR 是属性名称。属性值是位置对象参数。 |
-K |
仅返回主键属性。例外是集合对象的成员属性始终返回。其他例外是组织、人员和角色对象的所有属性永远不会返回。 |
-l |
返回一级不太具体对象。 |
-L |
返回所有级别的不太具体对象。 |
-m |
返回更具体一级的所有对象。 |
-M |
返回所有级别更具体对象。 |
-q KEYWORD |
返回服务器支持的键词列表。KEYWORD 可以是服务器版本,源数据库列表,或对象类型。 |
-r |
禁用联系信息的递归查找。 |
-R |
禁用引用跟随并强制显示服务器本地副本中的对象。 |
-s SOURCE[,SOURCE]... |
请求服务器搜索从源(SOURCES)镜像的对象。源由逗号分隔,顺序很重要。使用 -q 源选项以获取有效源列表。 |
-t TYPE |
返回 TYPE 类型的对象的模板。 |
-T TYPE[,TYPE]... |
限制搜索到 TYPE 类型的对象。多个类型由逗号分隔。 |
-v TYPE |
返回 TYPE 类型的对象的详细模板。 |
-x |
仅在网络地址前缀上搜索精确匹配。 |
ssh 命令
Linux 中的 ssh 命令代表“安全壳”。这是一个用于安全连接到远程服务器/系统的协议。与客户端之间以加密形式传输数据,因此 ssh 更安全。ssh 在 TCP/IP 端口 22 上运行。
示例:
- 使用不同的端口号进行 SSH 连接:
ssh test.server.com -p 3322
-
- 使用私钥连接到远程服务器
ssh?
- 使用私钥连接到远程服务器
ssh -i private.key user_name@host
-
- 使用
ssh指定不同的用户名
- 使用
ssh -l alternative-username sample.ssh.com
语法:
ssh user_name@host(IP/Domain_Name)
ssh -i private.key user_name@host
ssh sample.ssh.com ls /tmp/doc
其他标志及其功能:
| 标志 | 描述 |
|---|---|
-1 |
强制 ssh 只使用 SSH-1 协议。 |
-2 |
强制 ssh 只使用 SSH-2 协议。 |
-4 |
仅允许 IPv4 地址。 |
-A |
启用身份验证代理连接转发。 |
-a |
禁用身份验证代理连接转发。 |
-B bind_interface |
在尝试连接到目标主机之前绑定到 bind_interface 的地址。这在具有多个地址的系统上才有用。 |
-b bind_address |
在本地机器上使用 bind_address 作为连接的源地址。这在具有多个地址的系统上才有用。 |
-C |
对所有数据(包括 stdin、stdout、stderr 以及转发 X11 和 TCP 连接的数据)进行压缩,以加快数据传输。 |
-c cipher_spec |
选择用于加密会话的加密规范。 |
-D [bind_address:]port |
动态应用层端口转发。这为本地侧的端口分配一个套接字进行监听。当连接到此端口时,连接将通过安全通道进行转发,然后使用应用程序协议确定从远程机器连接到何处。 |
-E log_file |
将调试日志附加到标准错误。 |
-e escape_char |
设置与 pty 会话的转义字符(默认:‘~’)。转义字符仅在行首被识别。跟在点(‘.’)后面的转义字符关闭连接;跟在控制-Z 后挂起连接;跟在自己后面发送一次转义字符。将字符设置为“none”将禁用任何转义,并使会话完全透明。 |
-F configfile |
指定每个用户的配置文件。每个用户的默认配置文件是 ~/.ssh/config。 |
-f |
请求 ssh 在命令执行前进入后台。 |
-G |
导致 ssh 在评估 Host 和 Match 块后打印其配置并退出。 |
-g |
允许远程主机连接到本地转发端口。 |
-I pkcs11 |
指定 ssh 应用于与提供密钥的 PKCS#11 令牌通信的共享库。 |
-i identity_file |
从该文件读取用于公钥认证的标识密钥(私钥)。 |
-J [user@]host[:port] |
首先通过 ssh 连接到 pjump 主机[(/iam/jump-host)],然后从那里建立到最终目标的 TCP 转发连接以连接到目标主机。 |
-K |
启用基于 GSSAPI 的身份验证和转发(委派)GSSAPI 凭证到服务器。 |
-k |
禁用将 GSSAPI 凭证转发(委派)到服务器。 |
-L [bind_address:]port:host:hostport, -L [bind_address:]port:remote_socket, -L local_socket:host:hostport, -L local_socket:remote_socket |
指定到本地(客户端)主机上给定 TCP 端口或 Unix 套接字的连接应转发到远程端的主机和端口,或 Unix 套接字。这是通过在本地端分配一个套接字来监听 TCP 端口,可选地绑定到指定的 bind_address,或 Unix 套接字来实现的。每当连接到本地端口或套接字时,连接将通过安全通道转发,并从远程机器建立到主机端口 hostport 或 Unix 套接字 remote_socket 的连接。 |
-l login_name |
指定在远程机器上登录的用户。 |
-M |
将 ssh 客户端置于“主”模式以进行连接共享。多个-M 选项将 ssh 置于“主”模式,但在每个更改多路复用状态的操作(例如打开新会话)之前需要使用 ssh-askpass 进行确认。 |
-m mac_spec |
以逗号分隔的 MAC(消息认证代码)算法列表,按优先级指定。 |
-N |
不执行远程命令。这对于仅转发端口很有用。 |
-n |
防止从 stdin 读取。 |
-O ctl_cmd |
控制活动连接多路复用主进程。当指定-O 选项时,ctl_cmd 参数将被解释并传递给主进程。有效的命令有:“check”(检查主进程是否正在运行)、“forward”(请求转发而不执行命令)、“cancel”(取消转发)、“exit”(请求主进程退出)和“stop”(请求主进程停止接受进一步的多路复用请求)。 |
-o |
可以用于以配置文件中使用的格式给出选项。这对于指定没有单独命令行标志的选项很有用。 |
-p, --port PORT |
连接到远程主机的端口号。 |
-Q query_option |
对 ssh 进行查询,以获取指定版本 2 支持的计算法。可用的功能包括:cipher(支持的对称加密算法)、cipher-auth(支持认证加密的对称加密算法)、help(与-Q 标志一起使用的支持查询术语)、mac(支持的消息完整性代码)、kex(密钥交换算法)、kex-gss(GSSAPI 密钥交换算法)、key(密钥类型)、key-cert(证书密钥类型)、key-plain(非证书密钥类型)、key-sig(所有密钥类型和签名算法)、protocol-version(支持的 SSH 协议版本)和 sig(支持的签名算法)。或者,可以使用 ssh_config(5)或 sshd_config(5)中任何接受算法列表的关键字作为相应 query_option 的别名。 |
-q |
静音模式。导致大多数警告和诊断信息被抑制。 |
-R [bind_address:]port:host:hostport, -R [bind_address:]port:local_socket, -R remote_socket:host:hostport, -R remote_socket:local_socket, -R [bind_address:]port |
指定连接到远程(服务器)主机上的给定 TCP 端口或 Unix 套接字应转发到本地端。 |
-S ctl_path |
指定连接共享的控制套接字的位置,或字符串“none”以禁用连接共享。 |
-s |
可用于请求在远程系统上调用子系统。子系统便于将 SSH 作为其他应用程序(例如 sftp(1))的安全传输使用。子系统作为远程命令指定。 |
-T |
禁用伪终端分配。 |
-t |
强制分配伪终端。这可以用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制分配 tty,即使 ssh 没有本地 tty。 |
-V |
显示版本号。 |
-v |
详细模式。在建立连接时回显其正在执行的所有操作。在调试连接失败时非常有用。 |
-W host:port |
请求将客户端的标准输入和输出通过安全通道转发到主机上的端口。隐含 -N、-T、ExitOnForwardFailure 和 ClearAllForwardings,尽管这些可以在配置文件或使用 -o 命令行选项中覆盖。 |
-w local_tun[remote_tun] |
请求使用指定的 tun 设备在客户端(local_tun)和服务器(remote_tun)之间进行隧道设备转发。设备可以通过数字 ID 或关键字“any”指定,后者使用下一个可用的隧道设备。如果未指定 remote_tun,则默认为“any”。如果未设置隧道指令,则将其设置为默认隧道模式,即“点对点”。如果需要不同的隧道转发模式,则应在 -w 之前指定。 |
-X |
启用 X11 转发(GUI 转发)。 |
-x |
禁用 X11 转发(GUI 转发)。 |
-Y |
启用受信任的 X11 转发。 |
-y |
使用 syslog 系统模块发送日志信息。默认情况下,此信息发送到 stderr。 |
awk命令
Awk 是一种通用脚本语言,专为高级文本处理设计。它主要用作报告和分析工具。
我们可以用 AWK 做什么?
-
AWK 操作:(a) 逐行扫描文件 (b) 将每行输入分割成字段 (c) 将输入行/字段与模式比较 (d) 对匹配的行执行动作
-
适用于:(a) 转换数据文件 (b) 生成格式化报告
-
编程结构:(a) 格式化输出行 (b) 算术和字符串操作 (c) 条件和循环
语法
awk options 'selection _criteria {action }' input-file > output-file
示例
考虑以下文本文件作为以下示例的输入文件:
``
`
$cat > employee.txt
`
``
``
`
ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
`
``
- Awk 的默认行为:默认情况下,Awk 打印出指定文件中的每一行数据。
$ awk '{print}' employee.txt
ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
在上述示例中,没有给出模式。因此,这些操作适用于所有行。没有参数的动作默认打印整行,因此它默认打印出文件的所有行而不会失败。
- 打印出与给定模式匹配的行。
awk '/manager/ {print}' employee.txt
ajay manager account 45000
varun manager sales 50000
amit manager account 47000
在上述示例中,awk 命令打印出所有与“manager”匹配的行。
- 将行分割成字段:对于每个记录(即行),awk 命令默认通过空白字符分隔记录,并将其存储在$n 变量中。如果行有 4 个单词,它将分别存储在$1, $2, $3 和$4 中。此外,$0 代表整行。
$ awk '{print $1,$4}' employee.txt
ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
Awk 的内置变量
Awk 的内置变量包括字段变量—$1, $2, $3,等等($0 是整行)—它们将文本行分割成单独的单词或称为字段的片段。
NR:NR 命令保持当前输入记录数的计数。记住,记录通常是行。awk 命令对文件中的每一行记录执行一次模式/动作语句。NF:NF 命令保持当前输入记录中字段数的计数。FS:FS 命令包含字段分隔符字符,用于在输入行上分割字段。默认是“空白”,意味着空格和制表符字符。FS 可以被重新分配到另一个字符(通常在 BEGIN 中)以更改字段分隔符。RS:RS 命令存储当前记录分隔符字符。由于默认情况下,输入行是输入记录,默认记录分隔符字符是换行符。OFS:OFS 命令存储输出字段分隔符,当 Awk 打印时用于分隔字段。默认是一个空格。每当 print 有几个用逗号分隔的参数时,它将在每个参数之间打印 OFS 的值。ORS:ORS 命令存储输出记录分隔符,当 Awk 打印时用于分隔输出行。默认是换行符字符。print 自动在打印内容的末尾输出 ORS 的内容。
crontab 命令
crontab 用于维护个别用户的 crontab 文件(Vixie Cron)
crontab 是用于在 Vixie Cron 中驱动 cron(8) 守护进程所使用的表的安装、卸载或列出的程序。每个用户都可以有自己的 crontab,尽管这些文件位于 /var/spool/cron/crontabs 中,但它们并不是直接编辑的。
语法:
crontab [ -u user ] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
示例:
-l选项会导致当前 crontab 在标准输出上显示。
crontab -l
-r选项会导致当前 crontab 被移除。
crontab -r
-e选项用于使用由 VISUAL 或 EDITOR 环境变量指定的编辑器编辑当前 crontab。退出编辑器后,修改后的 crontab 将会自动安装。如果这两个环境变量都没有定义,则默认使用 /usr/bin/editor 编辑器。
crontab -e
- 您可以指定要编辑 crontab 的用户。每个用户都有自己的 crontab。假设您有一个
www-data用户,实际上这是 Apache 默认运行的用户。如果您想编辑此用户的 crontab,可以运行以下命令
crontab -u www-data -e
帮助命令
运行以下命令以查看 crontab 命令的完整指南。
man crontab
xargs 命令
xargs 用于从标准输入构建和执行命令行
一些命令,如 grep,可以接受作为参数的输入,但有些命令接受参数,这就是 xargs 出现的地方。
语法:
xargs [options] [command [initial-arguments]]
选项:
-0, --null
输入项以空字符终止,而不是以空白字符终止,引号和反斜杠不是特殊字符(每个字符都被当作字面意思)。禁用文件结束字符串,它被当作任何其他参数处理。当输入项可能包含空格、引号或反斜杠时很有用。
-a file, --arg-file=file
从文件读取项目而不是标准输入。如果你使用此选项,当运行命令时,stdin 保持不变。否则,stdin 将从 /dev/null 重定向。
-o, --open-tty
在执行命令之前,在子进程中重新打开 stdin 为 /dev/tty。如果你想让 xargs 运行交互式应用程序,这很有用。
--delimiter=delim, -d delim
输入项以指定的字符终止。指定的分隔符可以是一个字符,一个 C 风格的字符转义,如 \n,或一个八进制或十六进制转义代码。八进制和十六进制转义代码与 printf 命令相同。不支持多字节字符。在处理输入时,引号和反斜杠不是特殊字符;输入中的每个字符都被当作字面意思。-d 选项禁用任何文件结束字符串,它被当作任何其他参数处理。当输入仅由换行符分隔的项目组成时,可以使用此选项,尽管几乎总是更好的设计程序以使用 --null,如果可能的话。
-p, --interactive
提示用户是否运行每个命令行,并从终端读取一行。只有当响应以 y 或 Y 开头时才运行命令行。隐含 -t。
示例:
find /tmp -name core -type f -print | xargs /bin/rm -f
在目录 /tmp 中或其下方查找名为 core 的文件并删除它们。请注意,如果存在包含换行符或空格的文件名,这将无法正确工作。
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
在目录 /tmp 中或其下方查找名为 core 的文件并删除它们,以这种方式处理文件名,使得包含空格或换行符的文件名或目录名能够正确处理。
find /tmp -depth -name core -type f -delete
在目录 /tmp 中或其下方查找名为 core 的文件并删除它们,但比上一个示例更高效(因为我们避免了使用 fork(2) 和 exec(2) 来启动 rm 的需要,并且我们不需要额外的 xargs 进程)。
cut -d: -f1 < /etc/passwd | sort | xargs echo
生成系统上所有用户的紧凑列表。
帮助命令
运行以下命令以查看 xargs 命令的完整指南。
man xargs
nohup 命令
当 shell 退出(可能在退出 SSH 会话时),HUP(挂起)信号会被发送到其所有子进程,导致它们终止。如果你需要在退出 shell 后继续运行长时间运行的过程,你需要使用 nohup 命令。在任意命令前加上 nohup 会使得该命令对 HUP 信号具有 免疫性。此外,标准输入(STDIN)将被忽略,所有输出都会被重定向到本地文件 ./nohup.out。
示例:
- 将
nohup应用于长时间运行的 Debian 升级:
nohup apt-get -y upgrade
语法:
nohup COMMAND [ARG]...
nohup OPTION
pstree 命令
pstree 命令类似于 ps,但它不是列出运行进程,而是以树形结构显示它们。树形格式有时是显示进程层次结构的更合适方式,这是一种更简单的方式来可视化运行进程。树的根是 init 或给定 pid 的进程。
示例
- 要显示所有运行进程的分层树结构:
pstree
- 要显示以给定进程为根的树形结构:
pstree [pid]
- 要仅显示由用户启动的进程:
pstree [USER]
- 要显示给定进程的父进程:
pstree -s [PID]
- 要逐页查看输出,将其管道传输到
less命令:
pstree | less
语法
ps [选项] [用户或 PID]
其他标志及其功能
| 短标志 | 长标志 | 描述 |
|---|---|---|
-a |
--arguments |
显示命令行参数 |
-A |
--ascii |
使用 ASCII 行绘图字符 |
-c |
--compact |
不压缩相同的子树 |
-h |
--highlight-all |
高亮显示当前进程及其祖先 |
-H PID |
--highlight-pid=PID |
高亮显示此进程及其祖先 |
-g |
--show-pgids |
显示进程组 ID;隐含 -c |
-G |
--vt100 |
使用 VT100 行绘图字符 |
-l |
--long |
不截断长行 |
-n |
--numeric-sort |
按 PID 排序输出 |
-N type |
--ns-sort=type |
按命名空间类型(cgroup、ipc、mnt、net、pid、user、uts)排序 |
-p |
--show-pids |
显示 PIDs;隐含 -c |
-s |
--show-parents |
显示选定进程的父进程 |
-S |
--ns-changes |
显示命名空间转换 |
-t |
--thread-names |
显示完整的线程名称 |
-T |
--hide-threads |
隐藏线程,只显示进程 |
-u |
--uid-changes |
显示 uid 转换 |
-U |
--unicode |
使用 UTF-8(Unicode)行绘图字符 |
-V |
--version |
显示版本信息 |
-Z |
--security-context |
显示 SELinux 安全上下文 |
tree 命令
Linux 中的 tree 命令递归地以树状结构列出目录。每个列表根据其相对于树根的深度进行缩进。
示例:
- 显示当前目录的树表示。
tree
- -L NUMBER 限制递归深度以避免显示非常深的树。
tree -L 2 /
语法:
tree [-acdfghilnpqrstuvxACDFQNSUX] [-L level [-R]] [-H baseHREF] [-T title]
[-o filename] [--nolinks] [-P pattern] [-I pattern] [--inodes]
[--device] [--noreport] [--dirsfirst] [--version] [--help] [--filelimit #]
[--si] [--prune] [--du] [--timefmt format] [--matchdirs] [--from-file]
[--] [directory ...]
其他标志及其功能:
| 标志 | 描述 |
|---|---|
-a |
打印所有文件,包括隐藏文件。 |
-d |
只列出目录。 |
-l |
跟随符号链接进入目录。 |
-f |
打印每个列表的完整路径,而不仅仅是其基本名称。 |
-x |
不要跨越文件系统。 |
-L # |
限制递归深度为 #。 |
-P REGEX |
递归,但只列出与 REGEX 匹配的文件。 |
-I REGEX |
递归,但不列出与 REGEX 匹配的文件。 |
--ignore-case |
在模式匹配时忽略大小写。 |
--prune |
从输出中剪除空目录。 |
--filelimit # |
忽略包含超过 # 个文件的目录。 |
-o FILE |
将标准输出重定向到 FILE。 |
-i |
不输出缩进。 |
whereis命令
whereis命令用于在 Linux 系统中查找指定文件的源/二进制文件位置和手册部分。如果我们比较whereis命令和find命令,它们看起来很相似,因为两者都可以用于相同的目的,但whereis命令通过消耗更少的时间产生更准确的结果。
使用whereis命令时应注意的要点:
由于whereis命令使用chdir(更改目录 2V)以尽可能快的方式给出结果,因此使用-M、-S或-B选项提供的路径必须是完整且定义良好的,即它们必须以/开头,并且应该是系统中存在的有效路径,否则将不会输出任何有效结果。whereis命令有一个硬编码的路径(这种路径不是动态的,不会随着指定而改变),因此您可能并不总能找到您想要的东西。
语法
whereis [options] [filename]
选项
-b:当只想搜索二进制文件时使用此选项。-m:当只想搜索手册部分时使用此选项。-s:当只想搜索源文件时使用此选项。-u:此选项用于搜索不寻常的条目。如果一个源文件或二进制文件按照[-bmsu]描述的没有在系统中存在,那么它就被认为是“不寻常的”。因此,whereis -m -u *请求的是当前目录中具有不寻常条目的文件。
-B:此选项用于更改或限制whereis搜索二进制文件的位置。-M:此选项用于更改或限制whereis搜索手册部分的位置。-S:此选项用于更改或限制whereis搜索源文件的位置。
-f:此选项简单地终止最后一个目录列表并标志着文件名的开始。当使用任何-B、-M 或-S 选项时必须使用此选项。-V:显示版本信息并退出。-h:显示帮助信息并退出。
printf 命令
这个命令允许你通过使用规则格式化变量值来打印变量的值。它与 C 语言中的 printf 非常相似。
语法:
$printf [-v variable_name] format [arguments]
选项:
| OPTION | 描述 |
|---|---|
FORMAT |
FORMAT 控制输出,并定义了 ARGUMENTs 在输出中的表达方式 |
ARGUMENT |
ARGUMENT 将根据 FORMAT 的定义插入到格式化输出中 |
--help |
显示帮助并退出 |
--version |
输出版本信息并退出 |
格式:
FORMAT 字符串的解剖结构可以提取为三个不同的部分,
-
普通字符,它们被原封不动地复制到输出中。
-
解释字符序列,它们通过反斜杠 ("" ) 转义。
-
转换指定符,这个指定符将定义 ARGUMENTs 作为输出部分的表达方式。
你可以在这个例子中看到这些部分,
printf " %s is where over %d million developers shape \"the future of sofware.\" " Github 65
输出:
Github is where over 65 million developers shape "the future of sofware."
有两种转换指定符 %s 和 %d,以及两种转义字符,即包围着 软件未来 词语的开头和结尾的双引号。除此之外,还有普通字符。
转换指定符:
每个转换指定符以 % 开始,以 转换字符 结束。在 % 和 转换字符 之间,可能按顺序出现:
- |
一个减号。这告诉 printf 将参数转换左对齐 |
| 数字 | 一个整数,指定字段宽度;printf 在至少 number 个字符宽度的字段中打印 ARGUMENT 的转换。如果需要,它将在左侧(或右侧,如果需要左对齐)填充,以补足字段宽度。 |
. |
一个点,用于分隔字段宽度和精度 |
| 数字 | 一个整数,精度,指定从字符串中打印的最大字符数,或浮点值小数点后的位数,或整数的最小位数 |
h 或 l |
这些分别区分短整数和长整数,通常仅用于计算机编程 |
转换字符告诉 printf 要打印哪种类型的参数,如下所示:
| 转换字符 | 参数类型 |
|---|---|
s |
字符串 |
c |
一个整数,表示为字符对应 ASCII 码 |
d, i |
作为十进制数的整数 |
o |
作为无符号八进制数的整数 |
x, X |
作为无符号十六进制数的整数 |
u |
作为无符号十进制数的整数 |
f |
默认精度为 6 的浮点数 |
e, E |
以科学记数法表示的浮点数 |
p |
内存地址指针 |
% |
无转换 |
这里是 printf 输出 ARGUMENT 的例子列表。我们可以放任何单词,但在这个例子中我们放了一个 'linuxcommand' 单词,并用引号括起来,这样我们可以更容易地看到与空格相关的位置。
| 格式字符串 | ARGUMENT 字符串 | 输出字符串 |
|---|---|---|
"%s" |
"linuxcommand" |
"linuxcommand" |
"%5s" |
"linuxcommand" |
"linuxcommand" |
"%.5s" |
"linuxcommand" |
"linux" |
"%-8s" |
"linuxcommand" |
"linuxcommand" |
"%-15s" |
"linuxcommand" |
"linuxcommand " |
"%12.5s" |
"linuxcommand" |
" linux" |
"%-12.5" |
"linuxcommand" |
"linux " |
"%-12.4" |
"linuxcommand" |
"linu " |
注意事项:
-
printf需要转换字符串的数量与 ARGUMENT 的数量相匹配 -
printf将转换字符串一对一映射,并期望为每个转换字符串找到 exactly one ARGUMENT -
转换字符串始终从左到右解释。
这里是一个例子:
输入
printf "We know %f is %s %d" 12.07 "larger than" 12
输出:
We know 12.070000 is larger than 12
上面的例子显示了 3 个 ARGUMENT,12.07,larger than,和 12。它们都从左到右一对一与给定的 3 个转换字符串(%f,%d,%s)进行解释。
printf 解释为特殊字符的字符序列:
| 转义字符 | 描述 |
|---|---|
\a |
发出警报(播放铃声)。通常是 ASCII BEL 字符 |
\b |
打印一个退格符 |
\c |
指示 printf 不再产生输出 |
\e |
打印一个转义字符(ASCII 码 27) |
\f |
打印一个换页符 |
\n |
打印一个换行符 |
\r |
打印一个回车符 |
\t |
打印一个水平制表符 |
\v |
打印一个垂直制表符 |
\" |
打印一个双引号 (") |
\\ |
打印一个反斜杠 () |
\NNN |
打印八进制值为 NNN(1 到 3 位)的字节 |
\xHH |
打印十六进制值为 HH(1 到 2 位)的字节 |
\uHHHH |
打印十六进制值为 HHHH(4 位)的 unicode 字符 |
\UHHHHHHHH |
打印十六进制值为 HHHHHHHH(8 位)的 unicode 字符 |
%b |
以字符串形式打印 ARGUMENT,其中 "\ " 转义符的解释如上所述,但八进制转义符的形式为 \0 或 \0NN |
示例:
下面列出了与 printf 一起通常使用的格式说明符的例子:
- %s
$printf "%s\n" "Printf command documentation!"
这将在 shell 中打印 Printf 命令文档!
printf 命令的其他重要属性:
-
%b- 通过展开反斜杠转义序列来打印 ARGUMENT。 -
%q- 以 shell 引用格式打印 ARGUMENT,该格式可作为输入重复使用。 -
%d,%i- 以有符号十进制整数的格式打印 ARGUMENT。 -
%u- 以无符号十进制整数的格式打印 ARGUMENT。 -
%o- 以无符号八进制(基数为 8)整数的格式打印 ARGUMENT。 -
%x,%X- 以无符号十六进制(基数为 16)整数的格式打印 ARGUMENT。%x 打印小写字母,而 %X 打印大写字母。 -
%e,%E- 以指数记数法格式打印参数。%e 打印小写字母,%E 打印大写字母。 -
%a,%A- 以十六进制(基数为 16)分数记数法格式打印参数。%a 打印小写字母,%A 打印大写字母。 -
%g,%G- 以正常或指数记数法格式打印参数,根据给定值和精度选择更合适的形式。%g 打印小写字母,%G 打印大写字母。 -
%c- 将参数作为单个字符打印。 -
%f- 将参数作为浮点数打印。 -
%s- 将参数作为字符串打印。 -
%%- 打印一个 "%" 符号。
更多示例:
输入:
printf 'Hello\nyoung\nman!'
输出:
hello
young
man!
两个 \n 将句子分成三个单词部分。
输入:
printf "%f\n" 2.5 5.75
输出
2.500000
5.750000
%f 说明符与 \n 结合解释,将两个参数以浮点数的形式分别打印在新行上。
cut 命令
cut 命令让您可以从文件的每一行中删除部分内容。从每个文件中打印所选行的部分到标准输出。如果没有文件,或者当文件为 - 时,读取标准输入。
使用方法和示例:
- 在文件中选择特定字段
cut -d "delimiter" -f (field number) file.txt
- 选择特定字符:
cut -c [(k)-(n)/(k),(n)/(n)] filename
在这里,k 表示字符的起始位置,n 表示字符的结束位置,如果 k 和 n 由“-”分隔,否则它们仅表示文件输入中每行字符的位置。
- 选择特定字节:
cut -b 1,2,3 filename //select bytes 1,2 and 3
cut -b 1-4 filename //select bytes 1 through 4
cut -b 1- filename //select bytes 1 through the end of file
cut -b -4 filename //select bytes from the beginning till the 4th byte
制表符和退格符被视为 1 个字节的字符。
语法:
cut OPTION... [FILE]...
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-b |
--bytes=LIST |
仅选择这些字节 |
-c |
--characters=LIST |
仅选择这些字符 |
-d |
--delimiter=DELIM |
使用 DELIM 作为字段分隔符,而不是制表符 |
-f |
--fields |
仅选择这些字段;还打印任何不包含分隔符字符的行,除非指定了 -s 选项 |
-s |
--only-delimited |
不打印不包含分隔符的行 |
-z |
--zero-terminated |
行分隔符是 NUL,而不是换行符 |
sed 命令
sed 命令代表流编辑器。流编辑器用于对输入流(文件或来自管道的输入)执行基本的文本转换。例如,它可以对文件执行许多功能,如搜索、查找和替换、插入或删除。虽然它在某些方面与允许脚本编辑的编辑器(如 ed)类似,但 sed 通过仅对输入(s)进行一次遍历来工作,因此效率更高。但它过滤文本在管道中的能力特别区别于其他类型的编辑器。
sed 命令最常用的用途是用于替换或查找和替换。通过使用 sed,即使不打开文件也可以编辑文件,这是一种更快的方法来在文件中查找和替换内容。它支持基本和扩展的正则表达式,允许您匹配复杂的模式。大多数 Linux 发行版都预装了 GNU sed。
示例:
- 使用
sed查找和替换字符串
sed -i 's/{search_regex}/{replace_value}/g' input-file
- 对于递归查找和替换(与
find一起使用)
有时您可能想要递归地搜索目录以查找包含字符串的文件,并在所有文件中替换该字符串。这可以通过使用
find命令递归地查找目录中的文件并将文件名传递给sed来完成。以下命令将递归地搜索当前工作目录中的文件并将文件名传递给sed。它将递归地搜索当前工作目录中的文件并将文件名传递给sed。
find . -type f -exec sed -i 's/{search_regex}/{replace_value}/g' {} +
语法:
sed [OPTION]... {script-only-if-no-other-script} [INPUT-FILE]...
-
OPTION- 在原地、静默、跟随符号链接、行长度、null-data 等 sed 选项。 -
{script-only-if-no-other-script}- 如果可用,将脚本添加到命令中。 -
INPUT-FILE- 输入流,文件或来自管道的输入。
如果没有提供选项,则第一个非选项参数被视为要解释的 sed 脚本。所有剩余的参数都是输入文件名;如果没有指定输入文件,则读取标准输入。
GNU sed 主页:www.gnu.org/software/sed/
| 短标志 | 长标志 | 描述 |
|---|---|---|
-i[SUFFIX] |
--in-place[=SUFFIX] | 在原地编辑文件(如果提供后缀,则创建备份)。 |
-n |
--quiet, --silent | 抑制自动打印模式空间。 |
-e script |
--expression=script | 将脚本添加到要执行的命令中。 |
-f script-file |
--file=script-file | 将脚本文件的内容添加到要执行的命令中。 |
-l N |
--line-length=N | 为 l 命令指定所需的行换行长度。 |
-r |
--regexp-extended | 在脚本中使用扩展正则表达式。 |
-s |
--separate | 将文件视为单独的,而不是单个连续的长流。 |
-u |
--unbuffered | 从输入文件中加载最小量的数据,并更频繁地刷新输出缓冲区。 |
-z |
--null-data | 使用 NULL 字符分隔行。 |
在开始之前
最初可能看起来复杂且难以理解,但使用 sed 在文件中搜索和替换文本其实非常简单。
想要了解更多信息:www.gnu.org/software/sed/manual/sed.html
vim 命令
vim 是一个随 Linux、BSD 和 macOS 一起提供的 Unix 文本编辑器。它因其速度快、功能强大而闻名,部分原因是因为它是一个可以在终端中运行的(尽管它有一个图形界面)小型程序。vim 文本编辑器由 Bram Moolenaar 开发。它支持大多数文件类型,vim 编辑器也被称为程序员编辑器。这主要是因为它可以完全通过键盘进行管理,无需菜单或鼠标。
注意: 不要将 vim 与 vi 混淆。vi 代表“Visual”,是由 Bill Joy 在 1976 年开发的文本编辑器。vim 代表“Vi Improved”,是 vi 编辑器的改进克隆。
关于 vim 最常搜索的问题:
如何退出 vim 编辑器?
关于 vim 编辑器最常搜索的问题看起来非常有趣,但确实如此,新用户在使用 vim 编辑器时会在一开始就遇到困难。
保存文件并退出 vim 编辑器的命令::wq 或 :x
不保存文件退出 vim 编辑器的命令::q!
有趣的阅读:
这里有一个 调查 关于同样的问题,看看这个,不要想着退出 vim 编辑器。
安装:
首先检查 vim 是否已经安装,输入以下命令:
vim --version
如果它已经安装,它将显示其版本,否则我们可以运行以下命令进行安装:
在 Ubuntu/Debian 上:
sudo apt-get install vim
在 Arch 上:
sudo pacman -S vim
在 CentOS/Fedora 上:
sudo yum install vim
如果你想在 CentOS/Fedora 上使用高级功能,你需要安装增强的 vim 编辑器,为此请运行以下命令:
sudo yum install -y vim-enhanced
在 macOS 上:
brew install vim
语法:
vim [FILE_PATH/FILE_NAME]
示例:
- 要从当前目录打开名为 "demo.txt" 的文件:
vim demo.txt
- 要在特定目录中打开文件:
vim {File_Path/filename}
- 要在文件中从特定行打开文件:
vim {File_Path/filename} +LINE_NUMBER
vim 编辑器的模式:
关于 vim 有多少种模式的争论,但你最可能使用的模式是 命令模式 和 插入模式。这些 模式 将允许你完成几乎所有你需要做的事情,包括创建你的文档、保存你的文档,以及进行高级编辑,包括利用搜索和替换功能。
vim 编辑器的流程:
-
使用
vim filename打开新或现有文件。 -
输入
i以切换到插入模式,这样你就可以开始编辑文件。 -
进入或修改你的文件文本。
-
当你完成时,按
Esc键退出插入模式并返回命令模式。 -
输入 :w 或 :wq 以保存文件或分别保存并退出文件。
在 vim 中导航
一些常用命令:
-
j: 向下移动一行 -
k: 向上移动一行 -
h: 向左移动一个字符 -
l: 向右移动一个字符 -
w: 向前移动一个单词 -
b: 向后移动一个单词 -
e: 移动到单词末尾 -
0: 移动到行首 -
$: 移动到行尾 -
gg: 跳转到文件开头 -
G: 跳转到文件末尾 -
:linenumber: 跳转到特定的行号
复制、粘贴和删除
- 复制(剪切):在 vim 中,复制称为“剪切”:
-
yy: 复制(剪切)当前行 -
2yy: 复制 2 行 -
y$: 从光标处复制到行尾 -
y^: 从光标处复制到行开头 -
yw: 复制一个单词 -
y}: 复制到段落结尾
- 粘贴:
-
p: 在光标后粘贴 -
P: 在光标前粘贴
- 删除:
-
x: 删除一个字符 -
dd: 删除整行 -
2dd: 删除 2 行(或使用任何数字n dd) -
d$: 从光标处删除到行尾 -
d^: 从光标处删除到行开头 -
dG: 从光标处删除到文件结尾 -
dgg: 从光标处删除到文件开头 -
dw: 从光标处删除到单词结尾 -
di": 删除双引号内的内容 -
diw: 删除内部单词(无空格) -
dip: 删除内部段落(无换行符)
选择(视觉模式)
-
v: 开始字符选择 -
V: 开始行选择 -
ctrl + v: 开始块选择
交互式训练
在这个交互式教程中,您将学习使用 vim 命令的不同方法:
其他标志及其功能:
| 标志/选项 | 描述 |
|---|---|
-e |
以 Ex 模式启动(见 Ex 模式) |
-R |
以只读模式启动 |
-R |
以只读模式启动 |
-g |
以 GUI 模式启动 |
-eg |
以 Ex 模式启动 GUI |
-Z |
类似于 "vim",但在受限模式下 |
-d |
以 diff 模式启动 diff 模式 |
-h |
显示用法(帮助)信息并退出 |
+NUMBER |
打开文件并将光标置于由 NUMBER 指定的行号上 |
有关 vim 的更多信息:
vim 不能在一天内学会,将其用于日常任务以在实际的 vim 编辑器中练习。
要了解更多关于 vim 的信息,请参考以下文章:
chown 命令
chown 命令使得更改文件或目录的所有权成为可能。在 Linux 中,用户和组是基础元素,使用 chown 命令可以更改文件或目录的所有者。也可以递归地更改文件夹的所有权
示例:
- 更改文件的所有者
chown user file.txt
- 更改文件所属组
chown :group file.txt
- 在一行中更改用户和组
chown user:group file.txt
- 递归更改文件夹的所有权
chown -R user:group folder
语法:
chown [-OPTION] [DIRECTORY_PATH]
find 命令
find 命令是 Linux 中最强大的实用工具之一,它允许您根据名称、大小、修改时间、权限等多种条件搜索文件和目录。
基本语法
find [path] [options] [expression]
简单来说:
“从
[path]开始搜索,应用[options or filters],然后对结果执行[action]。”
示例:
find /home/user -name "*.log"
这将在 /home/user 下搜索所有 .log 文件。
常见用例
1. 通过精确名称搜索文件
find ./directory1 -name sample.txt
在 directory1 和其所有子目录中查找 sample.txt。
不区分大小写的搜索:
find ./directory1 -iname "sample.txt"
2. 通过模式(通配符)搜索文件
查找 directory1 下的所有 .txt 文件。
find ./directory1 -name "*.txt"
更多示例:
find /var/log -name "*.log"
find /etc -name "conf*"
3. 通过名称查找目录
find / -type d -name test
列出从根目录 / 开始的所有名为 test 的目录。
4. 查找空文件和目录
find . -empty
在当前文件夹中查找空文件和目录。
仅查找空文件:
find . -type f -empty
5. 通过修改或访问时间查找文件
| 选项 | 描述 |
|---|---|
-mtime n |
n 天前修改 |
-atime n |
n 天前访问 |
-ctime n |
n 天前更改 |
-mmin n |
n 分钟前修改 |
示例:
查找过去两天内修改的文件。
find /var/log -mtime -2
查找过去一小时内修改的文件。
find . -mmin -60
6. 通过大小查找文件
| 表达式 | 含义 |
|---|---|
+n |
大于 n |
-n |
小于 n |
n |
精确等于 n |
示例:
查找大于 100 MB 的文件。
find / -size +100M
查找小于 10 KB 的文件。
find . -size -10k
7. 查找比另一个文件修改时间更近的文件
find . -newer reference.txt
列出在 reference.txt 之后修改的文件。
8. 通过类型查找文件
| 类型 | 描述 |
|---|---|
f |
普通文件 |
d |
目录 |
l |
符号链接 |
b |
块设备 |
c |
字符设备 |
示例:
查找所有块设备。
find /dev -type b
9. 通过权限查找文件
查找权限精确为 644 的文件。
find /var/www -type f -perm 644
查找任何人可执行的文件。
find /usr -type f -perm /111
10. 执行找到的文件上的命令
您可以使用 -exec 选项对每个找到的文件运行命令:
find . -type f -name "*.log" -exec rm -f {} \;
删除当前目录下的所有 .log 文件。
替代方案(更快):
find . -type f -name "*.log" | xargs rm -f
11. 对找到的文件执行命令
您可以将过滤器组合在一起:
find /var/log -name "*.log" -size +50M -mtime -2
查找大于 50 MB 且在过去两天内修改的 .log 文件。
12. 仅打印文件名(静默输出)
find /etc -type f -name "*.conf" -print
-print 标志确保输出显示(在大多数系统中是默认设置)。
快速参考表
| 任务 | 命令 |
|---|---|
| 查找具有特定名称的文件 | find . -name filename.txt |
| 不区分大小写的搜索 | find . -iname filename.txt |
| 仅查找目录 | find . -type d |
| 查找空文件 | find . -type f -empty |
| 查找大于 1 GB 的文件 | find . -size +1G |
| 查找昨天修改的文件 | find . -mtime -1 |
删除 .tmp 文件 |
find . -name "*.tmp" -delete |
| 搜索并执行 | find . -name "*.log" -exec gzip {} \; |
获取帮助
要查看 find 命令的完整指南,请运行:
man find
rmdir 命令
rmdir 命令用于从 Linux 文件系统中删除空目录。只有当指定的目录为空时,rmdir 命令才会删除命令行中指定的每个目录。
使用方法和示例:
- 删除目录及其父目录
rmdir -p a/b/c // is similar to 'rmdir a/b/c a/b a'
- 删除多个目录
rmdir a b c // removes empty directories a,b and c
语法:
rmdir [OPTION]... DIRECTORY...
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
- |
--ignore-fail-on-non-empty |
忽略仅因为目录非空而导致的每个失败 |
-p |
--parents |
删除目录及其父目录 |
-d |
--delimiter=DELIM |
使用 DELIM 代替 TAB 作为字段分隔符 |
-v |
--verbose |
对每个处理的目录输出诊断信息 |
lsblk 命令
概述
lsblk 命令显示系统上的块和循环设备。当您想要格式化磁盘、写入文件系统、检查文件系统以及了解设备的挂载点时,它特别有用。
示例
- 基本用法相当简单 - 只需执行 'lsblk' 而不使用任何选项。
lsblk
- 使
lsblk显示空设备
lsblk -a
- 使
lsblk以字节为单位打印大小信息
lsblk -b
- 使
lsblk打印每个设备的地域模型
lsblk -z
- 使
lsblk跳过从属设备的条目
lsblk -d
- 使
lsblk在树格式化中使用 ASCII 字符
lsblk -i
- 使
lsblk显示设备所有者、组和模式信息
lsblk -m
- 使
lsblk输出选择列
lsblk -o NAME,SIZE
语法
lsblk [options] [<device> ...]
读取 lsblk 提供的信息
在不使用标志或命令行参数运行 lsblk 时,它将通用磁盘信息写入 STDOUT。以下是一个解释该信息的表格:
| 列表名称 | 含义 | 解释 |
|---|---|---|
| NAME | 设备的名称。 | 显示设备的名称。 |
| RM | 可移动。 | 如果设备是可移动的显示 1,如果不是则显示 0。 |
| SIZE | 设备的大小。 | 显示设备的大小。 |
| RO | 只读。 | 如果为只读显示 1,如果不是则显示 0。 |
| TYPE | 块或循环设备的类型。 | 显示整个磁盘为 disk,分区为 part。 |
| MOUNTPOINTS | 设备挂载的位置。 | 显示设备挂载的位置。如果没有挂载则为空。 |
读取特定设备的信息
当将设备的绝对路径传递给 lsblk 时,lsblk 可以显示特定设备的信息。例如,显示 sda 磁盘信息的 lsblk 命令是:
lsblk /dev/sda
lsblk 的有用标志
以下是一个表格,展示了可以与 lsblk 一起使用的某些有用标志:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-a |
--all |
lsblk 默认不列出空设备。此选项禁用此限制。 |
-b |
--bytes |
以字节为单位打印 SIZE 列,而不是以可读格式。 |
-d |
--nodeps |
不打印设备持有者或从属设备。 |
-D |
--discard |
打印每个设备的 discard(TRIM、UNMAP)功能信息。 |
-E |
--dedup column |
将列用作去重键以去重输出树。如果设备没有此键,或者设备是分区且父整个磁盘设备提供与设备相同的键,则设备始终被打印。 |
-e |
--exclude list |
排除由逗号分隔的设备主设备号列表指定的设备。请注意,RAM 磁盘(主设备号=1)默认排除。此过滤器仅应用于顶级设备。 |
-f |
--fs |
显示有关文件系统的信息。 |
-h |
--help |
打印帮助文本并退出。 |
-l |
--include list |
以列表格式显示所有信息。 |
-J |
--json |
以 JSON 格式显示所有信息。 |
-l |
--list |
以列表格式显示所有信息。 |
-m |
--perms |
显示设备所有者、组和模式的信息。 |
-M |
--merge |
将子树的父节点分组,以提供更易于阅读的输出,用于 RAID 和多路径设备。需要树形输出。 |
-n |
--noheadings |
不打印标题行。 |
-o |
--output 列 |
指定要打印的输出列。使用 --help 获取所有受支持列的列表。 |
-O |
--output-all |
显示所有可用的列。 |
-p |
--paths |
显示绝对设备路径。 |
-P |
--pairs |
使用 key="value" 输出格式。所有潜在的不安全字符都使用十六进制转义(\x`)表示。 |
-r |
--raw |
使用原始输出格式。在 NAME、KNAME、LABEL、PARTLABEL 和 MOUNTPOINT 列中,所有潜在的不安全字符都使用十六进制转义(\x`)表示。 |
-S |
--scsi |
仅输出关于 SCSI 设备的信息。所有分区、从属设备和持有设备都被忽略。 |
-s |
--inverse |
以相反的顺序打印依赖关系。 |
-t |
--topology |
输出关于块设备拓扑的信息。此选项等同于 "-o NAME,ALIGNMENT,MIN-IO,OPT-IO,PHY-SEC,LOG-SEC,ROTA,SCHED,RQ-SIZE"。 |
-T |
--tree[=列] |
以树形格式显示所有信息。 |
-V |
--version |
输出版本信息并退出。 |
-w |
--width |
指定输出宽度为字符数。默认值是终端列数,如果没有在终端上执行,则默认不限制输出宽度。 |
-x |
--sort [列] |
按列排序输出行。此选项默认启用 --list 输出格式。可以使用 --tree 选项强制以树形输出,然后树分支按列排序。 |
-z |
--zoned |
为每个设备打印区域模型。 |
- |
--sysroot 目录 |
收集除发出 lsblk 命令的实例之外的 Linux 实例的数据。指定的目录是要检查的 Linux 实例的系统根目录。 |
退出码
与每个 Unix / Linux 程序一样,lslbk 会向环境返回一个退出码。以下是所有退出码的表格。
| 退出码 | 含义 |
|---|---|
| 0 | 成功退出。 |
| 1 | 失败退出。 |
| 32 | 指定的设备(们)未找到。 |
| 64 | 找到了一些指定的设备,但也有一些没有找到。 |
cmatrix命令
这个命令在 Linux 中不是默认安装的。它需要安装,如第五十二章中所述,我们需要运行以下命令:
sudo apt-get install cmatrix
安装完所有东西后,你就变成了一个“合法的黑客”。为了使用这个命令,只需输入cmatrix并按回车键:
cmatrix
这就是你应该看到的内容:

如你所见,你现在可以访问矩阵了。嗯,其实并不是。
实际上这只是个好玩的小命令,可以用来恶作剧。实际上有几个选项你可以使用。例如,你可以更改文本颜色。你可以选择绿色、红色、蓝色、白色、黄色、青色、品红色和黑色。
cmatrix -C red

下落的人物将会是红色的。这个命令其实并不是什么能帮助你工作或什么的工具,但知道你可以在 Linux 中找点乐子还是挺有趣的。
chmod 命令
chmod 命令允许您使用符号、数字或参考文件的方式更改文件的权限。
示例:
- 使用符号模式更改文件的权限:
chmod u=rwx,g=rx,o=r myfile
上述命令表示:
-
用户可以读取、写入、执行
myfile -
组可以读取、执行
myfile -
其他用户可以读取
myfile
- 使用数字模式更改文件的权限
chmod 754 myfile user:group file.txt
上述命令表示:
-
用户可以读取、写入、执行
myfile -
组可以读取、执行
myfile -
其他用户可以读取
myfile
- 递归更改文件夹的权限
chmod -R 754 folder
语法:
chmod [OPTIONS] MODE FILE(s)
-
[OPTIONS]:-R: 递归,表示目录中的所有文件 -
MODE: 设置权限的不同方式: -
符号权限模式解释:
-
u: 用户
-
g: 组
-
o: 其它用户
-
=: 设置权限
-
r: 读取
-
w: 写入
-
x: 执行
-
例如
u=rwx表示用户可以读取、写入和执行
-
-
数字权限模式解释:
数字权限模式基于用户、组和其它权限的二进制表示,更多信息请参阅 Digital Ocean 社区部分提供的解释:
-
4 代表 "读取",
-
2 代表 "写入",
-
1 代表 "执行",并且
-
0 代表 "无权限。"
-
例如 7 表示读取 + 写入 + 执行
grep 命令
grep 过滤器在文件中搜索特定的字符模式,并显示所有包含该模式的行。grep 代表全局搜索正则表达式并打印出来。在文件中搜索的模式被称为正则表达式。
示例:
- 为了在 destination.txt 文件的内容中搜索字符串("KeY")而不区分大小写。
grep -i "KeY" destination.txt
- 显示匹配项的数量
grep -c "key" destination.txt
- 我们可以搜索多个文件,并且只显示包含给定字符串/模式的文件。
grep -l "key" destination1.txt destination2.txt destination3.xt destination4.txt
- 显示包含匹配行的文件的行号。
grep -n "key" destination.txt
- 如果你想搜索监控的日志文件,可以添加
--line-buffered来实时搜索它们。
tail -f destination.txt | grep --line-buffered "key"
语法:
grep 命令的一般语法如下:
grep [options] pattern [files]
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-c |
--count |
为每个输入文件打印匹配行的计数 |
-h |
--no-filename |
显示匹配行,但不显示文件名 |
-i |
--ignore-case |
忽略大小写进行匹配 |
-l |
--files-with-matches |
仅显示文件名列表。 |
-n |
--line-number |
显示匹配行及其行号。 |
-v |
--invert-match |
此选项将打印出所有不匹配模式的行 |
-e |
--regexp= |
使用此选项指定表达式。可以多次使用 |
-f |
--file= |
从文件中读取模式,每行一个。 |
-F |
--fixed-strings= |
将模式解释为固定字符串,而不是正则表达式。 |
-E |
--extended-regexp |
将模式视为扩展正则表达式(ERE) |
-w |
--word-regexp |
匹配整个单词 |
-o |
--only-matching |
仅打印匹配行的匹配部分,每个部分单独一行输出。 |
--line-buffered |
强制输出为行缓冲。 |
其他实用示例:
- 在目录中的所有文件中进行递归搜索
grep -r "pattern" /path/to/directory
- 仅搜索整个单词(不匹配部分单词)
grep -w "key" destination.txt
- 显示不包含该模式的行(反向匹配)
grep -v "unwanted" destination.txt
- 使用扩展正则表达式搜索多个模式
grep -E "pattern1|pattern2" destination.txt
- 搜索并显示匹配的前后文行(匹配前后的行)
# Show 2 lines before and 2 lines after each match
grep -C 2 "error" logfile.txt
# Show only 3 lines before each match
grep -B 3 "error" logfile.txt
# Show only 3 lines after each match
grep -A 3 "error" logfile.txt
- 在行的开始或结束处搜索模式
# Lines starting with "Error"
grep "^Error" logfile.txt
# Lines ending with ".txt"
grep "\.txt$" filelist.txt
- 在多个文件中计算总匹配数
grep -c "pattern" file1.txt file2.txt file3.txt
- 查找包含模式的文件并将结果传递给其他命令
# Find all Python files containing "import numpy"
grep -r "import numpy" --include="*.py" .
# Search in compressed log files
zgrep "error" /var/log/syslog.*.gz
```|
screen 命令
screen - 使用 screen,你可以启动一个屏幕会话,并在该会话中打开任意数量的窗口(虚拟终端)。在 Screen 中运行的进程,即使窗口不可见,也会继续运行,即使你断开连接。这对于运行长时间会话,如运行时间非常长的 bash 脚本等,非常有用。
要启动屏幕会话,请输入 screen,这将打开一个新的屏幕会话,并打开一个虚拟终端。
以下是管理 Linux Screen 窗口的一些最常用命令:
| 命令 | 描述 |
|---|---|
Ctrl+a+ c |
创建一个新的窗口(带有 shell)。 |
Ctrl+a+ " |
列出所有窗口。 |
Ctrl+a+ 0 |
切换到窗口 0(按数字)。 |
Ctrl+a+ A |
重命名当前窗口。 |
Ctrl+a+ S |
将当前区域水平分割成两个区域。 |
Ctrl+a+ ' |
将当前区域垂直分割成两个区域。 |
Ctrl+a+ tab |
切换输入焦点到下一个区域。 |
Ctrl+a+ Ctrl+a |
在当前窗口和上一个窗口之间切换 |
Ctrl+a+ Q |
关闭除当前区域外的所有区域。 |
Ctrl+a+ X |
关闭当前区域。 |
恢复 Linux Screen
要恢复到屏幕会话,请输入 screen -r,如果你有多个打开的屏幕会话,你必须将会话 ID 添加到命令中,以连接到正确的会话。
列出所有打开的屏幕会话
要查找会话 ID,你可以使用以下命令列出当前运行的屏幕会话:
screen -ls
在以下位置有屏幕:
18787.pts-0.your-server (Detached)
15454.pts-0.your-server (Detached)
2 Sockets in /run/screens/S-yourserver.
如果你想要恢复屏幕 18787.pts-0,请输入以下命令:
screen -r 18787
nc命令
nc(或 netcat)命令用于执行涉及 TCP(传输控制协议,面向连接)、UDP(用户数据报协议,无连接,不保证数据传输)或 UNIX 域套接字的任何操作。它可以被视为通信协议工具的瑞士军刀。
语法:
nc [options] [ip] [port]
示例:
1. 使用源端口 1337 和 5 秒超时打开到主机 80 端口的 TCP 连接:
$ nc -p 1337 -w 5 host.ip 80
2. 打开到主机 80 端口的 UDP 连接:
$ nc -u host.ip 80
3. 创建并监听 UNIX 域流套接字:
$ nc -lU /var/tmp/dsocket
4. 创建基本的客户端/服务器模型:
这将在建立连接后创建一个连接,nc 没有特定的服务器/客户端端,一旦连接建立。
$ nc -l 1234 # in one console
$ nc 127.0.0.1 1234 # in another console
5. 构建基本的数据传输模型:
文件传输完成后,连接将自动按顺序关闭
$ nc -l 1234 > filename.out # to start listening in one console and collect data
$ nc host.ip 1234 < filename.in
6. 与服务器通信:
获取主机主页的基本示例,包括头部信息。
$ printf "GET / HTTP/1.0\r\n\r\n" | nc host.ip 80
7. 端口扫描:
检查目标机器上哪些端口开放并运行服务。使用-z标志命令来通知这些信息,而不是发起连接。
$ nc -zv host.ip 20-2000 # range of ports to check for
标志及其功能:
| 短标志 | 描述 |
|---|---|
-4 |
强制 nc 使用 IPv4 地址 |
-6 |
强制 nc 使用 IPv6 地址 |
-b |
允许广播 |
-D |
在套接字上启用调试 |
-i |
指定发送和接收行之间的时间间隔延迟 |
-k |
在当前连接结束后继续监听另一个连接 |
-l |
监听传入连接而不是向远程发起连接 |
-T |
指定 TCP 的长度 |
-p |
指定要使用的源端口 |
-r |
随机指定源端口和/或目标端口 |
-s |
指定用于发送数据包的接口的 IP 地址 |
-U |
使用 UNIX 域套接字 |
-u |
使用 UDP 而不是 TCP 作为协议 |
-w |
声明空闲或未建立的连接的超时阈值 |
-x |
与代理服务器通信时使用指定的协议 |
-z |
指定扫描监听守护进程,但不发送任何数据 |
make 命令
make 命令用于在特定目录结构中自动化多个命令的重用。
例如,在需要更改不同的 Azure 订阅时使用 terraform init、terraform plan 和 terraform validate。这通常按照以下步骤进行:
az account set --subscription "Subscription - Name"
terraform init
make 命令如何帮助我们,就是它可以一次性自动化所有这些操作:make tf-init
语法:
make [ -f makefile ] [ options ] ... [ targets ] ...
示例使用(指南):
1. 在您的指南目录中创建 Makefile
2. 在您的 Makefile 中包含以下内容:
hello-world:
echo "Hello, World!"
hello-bobby:
echo "Hello, Bobby!"
touch-letter:
echo "This is a text that is being inputted into our letter!" > letter.txt
clean-letter:
rm letter.txt
3. 执行 make hello-world - 这将在我们的终端中输出 "Hello, World"。
4. 执行 make hello-bobby - 这将在我们的终端中输出 "Hello, Bobby!"。
5. 执行 make touch-letter - 这将创建一个名为 letter.txt 的文本文件并在其中添加一行。
6. 执行 make clean-letter
参考更详细和内容丰富的教程:
(linoxide - Linux make 命令示例)(makefiletutorial.com - 名称本身就说明了这一点)
basename 命令
basename 是一个命令行工具,用于从给定的文件名中移除目录。可选地,它还可以移除任何尾随的后缀。这是一个简单的命令,只接受少数几个选项。
示例
最基本的示例是打印移除前导目录后的文件名:
basename /etc/bar/foo.txt
输出将包括文件名:
foo.txt
如果您在指向目录的路径字符串上运行 basename,您将获得路径的最后一个部分。在这个例子中,/etc/bar 是一个目录。
basename /etc/bar
输出
bar
basename 命令会移除任何尾随的 / 字符:
basename /etc/bar/foo.txt/
输出
foo.txt
选项
- 默认情况下,每行输出以换行符结束。要使用 NUL 结束行,请使用
-z(--zero) 选项。
$ basename -z /etc/bar/foo.txt
foo.txt$
basename命令可以接受多个名称作为参数。要这样做,请使用-a(--multiple) 选项调用命令,后跟由空格分隔的文件列表。例如,要获取/etc/bar/foo.txt和/etc/spam/eggs.docx的文件名,您将运行:
basename -a /etc/bar/foo.txt /etc/spam/eggs.docx
foo.txt
eggs.docx
语法
basename 命令支持两种语法格式:
basename NAME [SUFFIX]
basename OPTION... NAME...
额外功能
移除尾随后缀:要从文件名中移除任何尾随后缀,请将后缀作为第二个参数传递:
basename /etc/hostname name
host
通常,此功能用于去除文件扩展名
帮助命令
运行以下命令以查看 basename 命令的完整指南。
man basename
banner 命令
banner 命令将 ASCII 字符串以大写字母的形式写入标准输出。输出中的每一行可以包含最多 10 个大写或小写字符。在输出时,所有字符都显示为大写,小写输入字符看起来比大写输入字符小。
注意:如果你使用 sleep 命令定义了多个数字,那么此命令将延迟为这些值的总和。
示例:
- 要在工作站上显示 banner,请输入:
banner LINUX!
- 要在一行上显示多个单词,请将文本用引号括起来,如下所示:
banner "Intro to" Linux
这将在一行上显示 Intro to,并在下一行显示 Linux
- 以大写字母打印“101LinuxCommands”。
banner 101LinuxCommands
它只会打印 101LinuxCo,因为 banner 的默认容量为 10
alias命令
alias命令让您可以为命令创建快捷键或定义自己的命令。
这通常用于避免输入长命令。
示例:
- 要以可重用的形式
alias NAME=VALUE显示所有定义的别名的列表:
alias -p
- 要创建
ls -A快捷键:
alias la='ls -A'
语法:
alias [-p] [name[=value]]
设置持久选项:
与大多数 Linux 终端的自定义设置一样,您定义的任何别名仅应用于当前打开的终端会话。
要使任何别名对所有新会话都有效,您需要将该命令添加到您的 rc 文件中,以便在每次新终端启动时执行。该文件可以如下所示:
-
Bash: ~/.bashrc
-
ZSH: ~/.zshrc
-
鱼 – ~/.config/fish/config.fish
您可以使用以下方式使用您喜欢的编辑器打开该文件:
vim ~/.bashrc
每行输入一个命令,然后保存文件并退出。命令将在下一个会话中自动应用。
如果你想在当前会话中应用它,请运行以下命令:
source ~/.bashrc
相反的命令:
要删除预定义的别名,可以使用以下unalias命令:
unalias alias_name
要删除所有别名
unalias -a
which 命令
which 命令识别当你向 shell 发出命令时启动的可执行二进制文件。如果你在计算机上安装了同一程序的不同版本,你可以使用 which 来找出 shell 将使用哪个版本。
它有 3 种返回状态如下:
0 : If all specified commands are found and executable.
1 : If one or more specified commands is nonexistent or not executable.
2 : If an invalid option is specified.
示例
- 要查找 ls 命令的完整路径,请输入以下内容:
which ls
- 我们可以向
which命令提供多个参数:
which netcat uptime ping
which 命令从左到右搜索,如果在 PATH 环境变量中列出的目录中找到多个匹配项,它将只打印第一个。
- 要显示指定命令的所有路径:
which [filename] -a
- 要显示 node 可执行文件的路径,执行以下命令:
which node
- 要显示 Java 可执行文件的路径,执行:
which java
语法
which [filename1] [filename2] ...
你可以向 which 传递多个程序和命令,并且它会按顺序检查它们。
例如:
which ping cat uptime date head
选项
-a : 列出找到的所有可执行实例(而不是每个实例的第一个)。
-s : 如果找到所有可执行文件,则无输出,只返回 0;如果某些文件未找到,则返回 1。
date 命令
使用 date 命令来打印系统当前日期和时间。
date 命令也用于设置系统的日期和时间,但您需要是超级用户 (root) 才能这样做。
示例:
- 要显示当前日期和时间:
date
- 您可以使用 -u 选项来显示 UTC (协调世界时) 时区的日期和时间
date -u
- 要显示任何给定的日期字符串的格式化日期:
date --date="2/02/2010"
date --date="2 years ago"
语法:
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-d |
--date=STRING |
将提供的字符串转换为格式化日期 |
-f |
--file=DATEFILE |
与 --date 类似,但用于文件 |
-I[FMT] |
--iso-8601[=FMT] |
以 ISO 8601 格式显示日期和时间 |
-r |
--reference=FILE |
显示 FILE 的最后修改时间 |
-s |
--set=STRING |
将时间设置为 STRING 描述的时间 |
-u |
--universal |
以 UTC (协调世界时) 时区显示日期和时间 |
-R |
--rfc-email |
以 ISO 8601 格式显示日期和时间示例:(Fri, 22 Oct 2021 05:18:42 +0200) |
| - | rfc-3339=FMT |
以 RFC 3339 格式显示日期和时间 |
| - | --debug |
通常与 --date 一起使用,用于注释解析的日期并警告关于可疑使用的 stderr |
控制输出:
您可以使用格式指定符来控制输出日期和时间。
示例:
| 命令 | 输出 |
|---|---|
$ date "+%D" |
10/22/21 |
$ date "+%D %T" |
10/22/21 05:33:51 |
$ date "+%A %B %d %T %y" |
Friday October 22 05:34:47 21 |
语法:
date "+%[format-options ...]"
控制输出格式的格式指定符列表:
| 指定符 | 描述 |
|---|---|
%a |
缩写的星期名称 (例如,Sun) |
%A |
完整的星期名称 (例如,Sunday) |
%b |
缩写月份名称 (例如,Jan) |
%B |
完整的月份名称 (例如,January) |
%c |
日期和时间 (例如,Thu Mar 3 23:05:25 2005) |
%C |
世纪;与 %Y 相同,但省略最后两位数字 (例如,20) |
%d |
月份中的天数 (例如,01) |
%D |
日期;与 %m/%d/%y 相同 |
%e |
月份中的天数,空格填充;与 %_d 相同 |
%F |
完整日期;与 %Y-%m-%d 相同 |
%g |
ISO 周数年份的最后两位数字 (见 %G) |
%G |
ISO 周数年份 (见 %V);通常只有与 %V 一起使用时才有用 |
%h |
与 %b 相同 |
%H |
小时 (00..23) |
%I |
小时 (01..12) |
%j |
年中的天数 (001..366) |
%k |
小时,空格填充 ( 0..23);与 %_H 相同 |
%l |
小时,空格填充 ( 1..12);与 %_I 相同 |
%m |
月份 (01..12) |
%M |
分钟 (00..59) |
%n |
一个换行符 |
%N |
纳秒 (000000000..999999999) |
%p |
本地 AM 或 PM 的等效值;如果不知道则为空格 |
%P |
类似 %p,但为小写 |
%q |
年度的季度 (1..4) |
%r |
本地 12 小时制时间 (例如,11:11:04 PM) |
%R |
24 小时小时和分钟;与 %H:%M 相同 |
%s |
自 1970-01-01 00:00:00 UTC 以来经过的秒数 |
%S |
秒 (00..60) |
%t |
一个制表符 |
%T |
时间;与 %H:%M 相同 |
%u |
星期中的天数(1..7);1 是星期一 |
%U |
一年中的周数,以星期日为一周的第一天(00..53) |
%V |
ISO 周数,以星期一为一周的第一天(01..53) |
%w |
星期中的天数(0..6);0 是星期日 |
%W |
一年中的周数,以星期一为一周的第一天(00..53) |
%x |
语言的日期表示(例如,12/31/99) |
%X |
语言的日期表示(例如,23:13:48) |
%y |
年份的最后两位数字(00..99) |
%Y |
年份 |
%z |
+hhmm 数值时区(例如,-0400) |
%:z |
+hh:mm 数值时区(例如,-04:00) |
%::z |
+hh:mm:ss 数值时区(例如,-04:00:00) |
%:::z |
以 : 表示的数值时区,精确到必要的精度(例如,-04,+05:30) |
%Z |
字母时区缩写(例如,EDT) |
mount 命令
mount 命令用于挂载一个文件系统并将其“附加”到一个现有的目录结构树中,使其可访问。
示例:
- 显示版本信息:
mount -V
- 在设备上找到的文件系统类型为 type,挂载到目录 dir:
mount -t type device dir
语法形式:
mount [-lhV]
mount -a [-fFnrsvw] [-t vfstype] [-O optlist]
mount [-fnrsvw] [-t fstype] [-o options] device dir
其他选项及其功能:
| 短选项 | 长选项 | 描述 |
|---|---|---|
-h |
--help |
显示帮助信息并退出 |
-n |
--no-mtab |
不写入 /etc/mtab 挂载 |
-a |
--all |
挂载 fstab 中提到的所有(给定类型的)文件系统 |
-r |
--read-only |
以只读方式挂载文件系统 |
-w |
--rw |
以读写方式挂载文件系统。 |
-M |
--move |
将子树移动到其他位置。 |
-B |
--bind |
在其他位置重新挂载子树(这样其内容在两个地方都可用)。 |
nice/renice 命令
nice/renice 命令用于修改将要执行的程序的优先级。优先级范围在 -20 到 19 之间,其中 19 是最低优先级。
示例:
- 在后台以低于默认优先级(较慢)运行 cc 命令:
nice -n 15 cc -c *.c &
- 将优先级提升到属于“test”组的所有进程:
renice --20 -g test
语法:
nice [ -Increment| -n Increment ] Command [ Argument ... ]
标志:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-增量 |
- | 增量是你想要分配的优先级值。 |
-n 增量 |
- | 与 -增量 相同 |
wc 命令
wc 命令代表单词计数。它用于计算文件或标准输入中的行数、单词数和字节数(字符),然后将结果打印到标准输出。
示例:
- 按顺序计算文件中的行数、单词数和字符数:
wc file.txt
- 要计算目录中的目录数量:
ls -F | grep / | wc -l
语法:
wc [OPTION]... [FILE]...
其他标志及其功能:
| 短标志 | 长标志 | 描述 |
|---|---|---|
-c |
--bytes |
打印字节数 |
-m |
--chars |
打印字符计数 |
-l |
--lines |
打印换行符计数 |
| - | --files0-from=F |
从文件 F 中读取由 NUL 结尾的名称指定的输入文件。如果 F 是 -,则从标准输入读取名称 |
-L |
--max-line-length |
打印最大显示宽度 |
-w |
--words |
打印单词计数 |
补充说明:
-
向
wc命令传递多个文件将打印每个文件的计数以及它们的总数。 -
您可以将多个标志组合起来,以按您想要的方式打印结果。
tr 命令
UNIX 中的 tr 命令是一个用于翻译或删除字符的命令行实用程序。它支持一系列转换,包括大小写转换、压缩重复字符、删除特定字符以及基本的查找和替换。它可以与 UNIX 管道一起使用以支持更复杂的转换。tr 代表翻译。
示例:
- 将文件 1 中的所有小写字母转换为大写。
$ cat file1
foo
bar
baz
tr a-z A-Z < file1
FOO
BAR
BAZ
- 将连续的换行符合并为一个。
$ cat file1
foo
bar
baz
$ tr -s "\n" < file1
foo
bar
baz
- 删除换行符。
$ cat file1
foo
bar
baz
$ tr -d "\n" < file1
foobarbaz%
语法:
tr 命令的一般语法如下:
tr [options] string1 [string2]
其他选项及其功能:
| 短选项 | 长选项 | 描述 |
|---|---|---|
-C |
补充字符串 1 中的字符集,即 -C ab 包括除了 a 和 b 以外的所有字符。 |
|
-c |
与 -C 相同。 | |
-d |
从输入中删除字符串 1 中的字符。 | |
-s |
如果字符串 1 中有字符序列,则将它们合并为一个。 |
fdisk 命令
fdisk 命令用于控制磁盘分区表并对它进行修改,以下是一些它提供的选项列表:
-
为新驱动器组织空间。
-
修改旧驱动器。
-
为新分区创建空间。
-
将数据移动到新分区。
示例:
- 要查看系统上所有可用分区的详细信息:
fdisk -l
- 要显示分区的大小:
fdisk -s /dev/sda
- 要查看帮助信息和命令的所有选项:
fdisk -h
语法:
fdisk [options] device
一些命令选项:
在写入以下命令
fdisk /dev/sdb
窗口如下所示:
,然后你输入 m,这将显示你需要的所有选项,例如创建新分区和删除分区,如下图所示:
Wait命令
wait 命令是一个 shell 内建命令,它会在特定的后台进程或所有正在运行的后台子进程完成之前暂停脚本执行。
它的主要目的是同步任务,确保脚本在所有先决条件后台作业完成之前不会继续到下一步。后台进程是一个以与号(&)结尾运行的命令,这告诉 shell 在不等待它完成的情况下运行它。
语法
$ wait [PID]
[PID] - 可选的等待进程 ID。如果没有提供 PID,wait 将等待所有活动的子进程完成。
示例
1. 等待特定进程
本例展示了如何启动单个后台进程并等待其完成。
脚本:
#!/bin/bashecho "This process will run in the background..." &
process_id=$!
echo "Script is now waiting for process ID: $process_id"
wait $process_id
echo "Process $process_id has finished."
echo "The script exited with status: $?"
解释:
-
&: 与号运行 echo 命令在后台,允许脚本立即继续到下一行。
-
$!: 这是一个特殊的 shell 变量,它保存了最近执行的后台命令的进程 ID(PID)。我们将其保存到 process_id 变量中。
-
wait $process_id: 这是关键命令。脚本在这里暂停,直到具有该特定 ID 的进程完成。
-
$?: 这个变量保存了最后一个完成的命令的退出状态。退出状态为 0 表示成功。
输出:
$ bash wait_example.sh
Script is now waiting for process ID: 12345
This process will run in the background...
Process 12345 has finished.
The script exited with status: 0
2. 等待所有后台进程
这是最常见的使用场景。在这里,我们启动几个后台任务,然后使用单个 wait 命令暂停,直到它们全部完成。
脚本:
#!/bin/bash echo "Starting multiple background jobs..."
sleep 3 &
sleep 1 &
sleep 2 &
echo "Waiting for all sleep commands to finish."
wait
echo "All jobs are done. Continuing with the rest of the script."
输出:
$ bash wait_all_example.sh
Starting multiple background jobs...
Waiting for all sleep commands to finish.
(after about 3 seconds)
All jobs are done. Continuing with the rest of the script.
zcat 命令
zcat 允许您查看一个压缩文件。
示例:
- 要查看压缩文件的内容:
~$ zcat test.txt.gz
Hello World
- 它也可以与多个文件一起工作:
~$ zcat test2.txt.gz test.txt.gz
hello
Hello world
语法:
zcat 命令的一般语法如下:
zcat [ -n ] [ -V ] [ File ... ]
fold命令
Linux 中的fold命令将输入文件的每一行包裹到指定的宽度,并将其打印到标准输出。
默认情况下,它将行包裹在最大宽度为 80 列,但这是可配置的。
要使用fold命令折叠输入,请将文件或标准输入传递给命令。
语法:
fold [OPTION]... [FILE]...
选项
-w:在fold命令中使用此选项,我们可以通过列数来限制宽度。
通过使用此命令,我们更改了列宽,从默认的 80 列宽度。语法:
fold -w[n] [FILE]
示例:将 file1.txt 的行包裹到 60 列宽
fold -w60 file1.txt
-b:折叠命令的此选项用于通过字节数而不是列数来限制输出宽度。
通过使用此选项,我们可以强制输出宽度为字节数。
fold -b[n] [FILE]
示例:将文件输出宽度限制为 40 字节,命令在 40 字节处断行。
fold -b40 file1.txt
-s:此选项用于在空格处断行,以确保单词不被分割。
如果行的某一段在第一个宽度列位置内包含空格字符,则在满足宽度约束的最后一个此类空格字符之后断行。
fold -w[n] -s [FILE]
quota 命令
quota 命令用于显示磁盘使用情况和限制。
安装:
您可以直接运行以下命令在 ubuntu 系统上安装 quota:
sudo apt-get install quota
对于 Debian 系统,您可以使用不带 sudo 的安装命令:
apt-get install quota
语法:
quota 命令的一般语法如下:
quota [ -u [ User ] ] [ -g [ Group ] ] [ -v | -q ]
aplay命令
aplay是用于 ALSA(高级 Linux 声音架构)声卡驱动程序的命令行音频播放器。它支持多种文件格式和多个声卡的多设备。它基本上用于在命令行界面播放音频。aplay与arecord非常相似,只是它播放而不是录制。对于支持的声音文件格式,采样率、比特深度等可以从声音文件头中自动确定。
语法:
$ aplay [flags] [filename [filename]] ...
选项:
-h, –help : Show the help information.
-d, –duration=# : Interrupt after # seconds.
-r, –rate=# : Sampling rate in Hertz. The default rate is 8000 Hertz.
–version : Print current version.
-l, –list-devices : List all soundcards and digital audio devices.
-L, –list-pcms : List all PCMs(Pulse Code Modulation) defined.
-D, –device=NAME : Select PCM by name.
注意:此命令包含我们通常不需要的各种其他选项。如果您想了解更多,只需在您的终端上运行以下命令即可。
aplay --help
示例:
-
以 2500hz 频率播放音频仅 10 秒。
$ aplay -d 10 -r 2500hz sample.mp3以 2500hz 的频率播放 sample.mp3 文件仅 10 秒。
-
以 2500hz 频率播放完整的音频剪辑。
$ aplay -r 2500hz sample.mp3以 2500hz 频率播放 sample.mp3 文件。
-
显示版本信息。
$ aplay --version显示版本信息。对我来说,它显示为 aplay: 版本 1.1.0
spd-say 命令
spd-say 向处理语音的 speech-dispatcher 进程发送文本到语音的输出请求,该进程处理请求并在理想情况下将结果输出到音频系统。
语法:
$ spd-say [options] "some text"
选项:
-r, --rate
Set the rate of the speech (between -100 and +100, default: 0)
-p, --pitch
Set the pitch of the speech (between -100 and +100, default: 0)
-i, --volume
Set the volume (intensity) of the speech (between -100 and +100, default: 0)
-o, --output-module
Set the output module
-l, --language
Set the language (iso code)
-t, --voice-type
Set the preferred voice type (male1, male2, male3, female1, female2, female3,
child_male, child_female)
-m, --punctuation-mode
Set the punctuation mode (none, some, all)
-s, --spelling
Spell the message
-x, --ssml
Set SSML mode on (default: off)
-e, --pipe-mode
Pipe from stdin to stdout plus Speech Dispatcher
-P, --priority
Set priority of the message (important, message, text, notification, progress;
default: text)
-N, --application-name
Set the application name used to establish the connection to specified string value
(default: spd-say)
-n, --connection-name
Set the connection name used to establish the connection to specified string value
(default: main)
-w, --wait
Wait till the message is spoken or discarded
-S, --stop
Stop speaking the message being spoken in Speech Dispatcher
-C, --cancel
Cancel all messages in Speech Dispatcher
-v, --version
Print version and copyright info
-h, --help
Print this info
示例:
- 播放给定的文本作为声音。
$ spd-say "Hello"
播放“你好”声音。
xeyes 命令
Xeyes 是一个图形用户界面程序,它在桌面上创建一组跟随鼠标光标移动的眼睛。它看起来更像是一个有趣的命令,而不是任何有用的用途。有趣本身也是一种用途。
语法:
xeyes
xeyes 的目的是什么?
xeyes 并非仅为了娱乐,至少不只是为了娱乐。这个程序的目的在于让你跟随鼠标指针,有时鼠标指针很难看到。在多显示器电脑上,显示器之间相隔一定距离时,它非常有用,如果有人(比如学校的老师)想在屏幕上展示某些内容,其他人在他们的显示器上就可以很容易地通过 xeyes 跟随鼠标。
parted 命令
parted 命令用于管理 Linux 上的硬盘分区。它可以用来添加、删除、缩小和扩展硬盘分区以及它们上所在的文件系统。运行 parted 命令需要系统管理员权限。
注意:parted 会立即将更改写入您的磁盘,在修改磁盘分区时要小心。
示例:
- 显示所有块设备的分区布局:
sudo parted -l
- 显示特定
disk的分区表
sudo parted disk print
disk 的例子有 /dev/sda, /dev/sdb
- 为特定磁盘创建
label-type的新磁盘标签
sudo parted mklabel disk label-type
label-type 可以取值 "aix", "amiga", "bsd", "dvh", "gpt", "loop", "mac", "msdos", "pc98", 或 "sun"
- 在特定
disk的part-time类型的磁盘上创建一个新的分区,文件系统为fs-type,大小为sizeMb。
sudo parted disk mkpart part-time fs-type 1 size
part-time 可以取值 "primary", "logical", "extended"。
fs-type 是可选的。它可以取值 "btrfs", "ext2", "ext3", "ext4", "fat16", "fat32", "hfs", "hfs+", "linux-swap", "ntfs", "reiserfs", "udf", 或 "xfs"
size 必须小于指定磁盘的总大小。要创建大小为 50Mb 的分区,
parted也可以以交互式格式运行。可以通过在交互会话中输入适当的命令来执行管理磁盘分区的操作。交互会话中的help命令会显示可以执行的所有可能的磁盘管理操作的列表。
$ sudo parted
GNU Parted 3.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print # prints the partition table of the default selected disk - /dev/sda
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 53.7GB 53.7GB primary ext4 boot
(parted) select /dev/sdb # change the current disk on which operations have to be performed
Using /dev/sdb
(parted) quit # exit the interactive session
语法形式:
parted [options] [device [command [options...]...]]
选项:
| 短标志 | 长标志 | 描述 |
|---|---|---|
| -h | --help | 显示帮助信息,列出所有可能的 commands [options] |
| -l | --list | 列出所有块设备上的分区布局 |
| -m | --machine | 显示机器可解析的输出 |
| -v | --version | 显示版本 |
| -a | --align | 为新创建的分区设置对齐类型。它可以取以下值:none:使用磁盘类型允许的最小对齐
cylinder:将分区对齐到磁柱
minimal:使用磁盘拓扑信息给出的最小对齐
optimal:使用磁盘拓扑信息给出的最佳对齐 |
nl命令
“nl”命令用于对文件中的行进行编号。以不同的方式查看文件内容,“nl”命令对于许多任务非常有用。
语法
nl [ -b Type ] [ -f Type ] [ -h Type ] [ -l Number ] [ -d Delimiter ] [ -i Number ] [ -n Format ] [ -v Number ] [ -w Number ] [ -p ] [ -s Separator ] [ File ]
示例:
- 要对所有行进行编号:
nl -ba chap1
- 显示所有文本行:
[server@ssh ~]$ nl states
1 Alabama
2 Alaska
3 Arizona
4 Arkansas
5 California
6 Colorado
7 Connecticut.
8 Delaware
- 指定不同的行号格式
nl -i10 -nrz -s:: -v10 -w4 chap1
在命令行中只能指定一个文件。你可以按任何顺序列出标志和文件名。
pidof 命令
pidof 是一个命令行实用程序,允许您查找正在运行的程序的进程 ID。
语法
pidof [OPTIONS] PROGRAM_NAME
要查看命令的帮助信息和所有选项:
[user@home ~]$ pidof -h
-c Return PIDs with the same root directory
-d <sep> Use the provided character as output separator
-h Display this help text
-n Avoid using stat system function on network shares
-o <pid> Omit results with a given PID
-q Quiet mode. Do not display output
-s Only return one PID
-x Return PIDs of shells running scripts with a matching name
-z List zombie and I/O waiting processes. May cause pidof to hang.
示例:
要查找 SSH 服务器进程的 PID,您将运行:
pidof sshd
如果有与 sshd 名称匹配的正在运行的进程,它们的 PID 将显示在屏幕上。如果没有找到匹配项,输出将为空。
# Output4382 4368 811
pidof 命令在至少有一个正在运行的程序与请求的名称匹配时返回 0。否则,退出代码为 1。这在编写 shell 脚本时可能很有用。
要确保仅显示您正在搜索的程序 PID,请使用程序的完整路径作为参数。例如,如果您有两个在不同目录中运行的具有相同名称的正在运行的程序,pidof 将显示两个正在运行的程序的 PID。
默认情况下,所有匹配的正在运行的程序的 PID 都会显示。使用 -s 选项强制 pidof 仅显示一个 PID:
pidof -s program_name
-o 选项允许您从命令输出中排除具有给定 PID 的进程:
pidof -o pid program_name
当 pidof 使用 -o 选项调用时,您可以使用一个特殊的 PID,即 %PPID,它代表调用 shell 或 shell 脚本。
要仅返回具有相同根目录运行的进程的 PID,请使用 -c 选项。此选项仅在 pidof 以 root 或 sudo 用户运行时才有效:
pidof -c pid program_name
结论
pidof 命令用于查找特定正在运行的程序的 PID。
pidof 是一个简单的命令,没有很多选项。通常,您只会用您正在搜索的程序名称调用 pidof。
shuf 命令
Linux 中的 shuf 命令将输入行的随机排列写入标准输出。它以与洗牌相同的方式伪随机化输入。它是 GNU Coreutils 的一部分,不是 POSIX 的一部分。此命令从文件或 bash 的标准输入读取,随机化这些输入行并显示输出。
语法
# file shuf
shuf [OPTION] [FILE]
# list shuf
shuf -e [OPTION]... [ARG]
# range shuf
shuf -i LO-HI [OPTION]
与其他 Linux 命令一样,shuf 命令带有 -–help 选项:
[user@home ~]$ shuf --help
Usage: shuf [OPTION]... [FILE]
or: shuf -e [OPTION]... [ARG]...
or: shuf -i LO-HI [OPTION]...
Write a random permutation of the input lines to standard output.
With no FILE, or when FILE is -, read standard input.
Mandatory arguments to long options are mandatory for short options too.
-e, --echo treat each ARG as an input line
-i, --input-range=LO-HI treat each number LO through HI as an input line
-n, --head-count=COUNT output at most COUNT lines
-o, --output=FILE write result to FILE instead of standard output
--random-source=FILE get random bytes from FILE
-r, --repeat output lines can be repeated
-z, --zero-terminated line delimiter is NUL, not newline
示例:
无选项或参数的 shuf 命令。
shuf
当 shuf 命令在命令行中没有任何参数时,它会从用户那里获取输入,直到输入 CTRL-D 以终止输入集。它以打乱的形式显示输入行。如果输入行是 1, 2, 3, 4 和 5,那么它将在输出中以随机顺序生成 1, 2, 3, 4 和 5,如下面的插图所示:
[user@home ~]$ shuf
1
2
3
4
5
4
5
1
2
3
考虑一个从管道获取输入的例子:
{
seq 5 | shuf
}
seq 5 返回从 1 到 5 的连续整数,而 shuf 命令将其作为输入并打乱内容,即从 1 到 5 的整数。因此,以随机顺序显示 1 到 5 作为输出。
[user@home ~]$ {
> seq 5 | shuf
> }
5
4
2
3
1
文件 shuf
当 shuf 命令使用时没有 -e 或 -i 选项,那么它作为文件 shuf 运行,即它打乱文件的内容。<file_name> 是 shuf 命令的最后一个参数,如果没有提供,则必须从 shell 或管道提供输入。
考虑一个从文件获取输入的例子:
shuf file.txt
假设 file.txt 包含 6 行,那么 shuf 命令会以随机顺序显示输入行作为输出。
[user@home ~]$ cat file.txt
line-1
line-2
line-3
line-4
line-5
[user@home ~]$ shuf file.txt
line-5
line-4
line-1
line-3
line-2
可以使用 -n 选项随机化任意数量的行。
shuf -n 2 file.txt
这将显示文件中的任意两行。
line-5
line-2
列出 shuf 命令
当使用 -e 选项与 shuf 命令一起时,它作为列表 shuf 运行。命令的参数被视为 shuf 的输入行。
考虑一个例子:
shuf -e A B C D E
它将 A, B, C, D, E 作为输入行,并将它们打乱以显示输出。
A
C
B
D
E
可以使用 -n 选项与 -e 选项一起显示任意数量的输入行。
shuf -e -n 2 A B C D E
这将显示任意两个输入。
E
A
范围 shuf
当与 shuf 命令一起使用 -i 选项时,它作为 range shuf 运行。它需要一个输入范围作为输入,其中 L0 是下限,而 HI 是上限。它以打乱的形式显示从 L0-HI 的整数。
[user@home ~]$ shuf -i 1-5
4
1
3
2
5
结论
shuf 命令可以帮助您随机化输入行。并且有功能来限制输出行的数量、重复行甚至生成随机正整数。一旦您完成了在这里讨论的练习,请转到工具的 man 页面 以了解更多信息。
less 命令
less 命令是一个 Linux 终端分页器,它一次显示一个文件的内容。当处理大型文本文件时非常有用,因为它不会一次性加载整个文件,而是逐页访问,从而实现快速加载速度。
语法
less [options] file_path
选项
一些流行的选项标志包括:
-E less automatically exits upon reaching the end of file.
-f Forces less to open non-regular files (a directory or a device-special file).
-F Exit less if the entire file can be displayed on the first screen.
-g Highlights the string last found using search. By default, less highlights all strings matching the last search command.
-G Removes all highlights from strings found using search.
要获取完整的选项列表,请通过运行 less 帮助文件进行参考:
less --help
几个示例:
- 打开文本文件
less /etc/updatedb.conf
- 显示行号
less -N /etc/init/mysql.conf
- 使用模式搜索打开文件
less -pERROR /etc/init/mysql.conf
- 删除多个空白行
less welcome.txt
在这里,我向您展示了如何在 Linux 中使用 less 命令。尽管还有其他终端分页器,例如 most 和 more,但 less 可能是一个更好的选择,因为它几乎存在于每个系统中,是一个功能强大的工具。
nslookup 命令
nslookup 命令是一个网络管理命令行工具,用于查询域名系统(DNS),以获取域名或 IP 地址映射或任何其他特定 DNS 记录。
语法
nslookup [options] [host]
选项
一些流行的选项标志包括:
-domain=[domain-name] Change the default DNS name.
-debug Show debugging information.
-port=[port-number] Specify the port for queries. The default port number is 53.
-timeout=[seconds] Specify the time allowed for the server to respond.
-type=a View information about the DNS A address records.
-type=any View all available records.
-type=hinfo View hardware-related information about the host.
-type=mx View Mail Exchange server information.
-type=ns View Name Server records.
-type=ptr View Pointer records. Used in reverse DNS lookups.
-type=soa View Start of Authority records.
几个示例:
- 查询 DNS 服务器
nslookup www.google.com
- 指定要查询的端口
nslookup -port=53 www.google.com
- 获取 MX 记录
nslookup -type=mx google.com
在这里,我向您展示了如何在 Linux 中使用 nslookup 命令。尽管有其他 DNS 查询工具,例如 dig,但 nslookup 可能是一个更好的选择,因为它几乎存在于每个系统中,是一个强大的工具。
更多详情:Nslookup 维基百科
cmp 命令
cmp 命令是一个简单的实用工具,用于逐字节比较两个文件。
如果文件相同,cmp 不会产生输出并返回成功的退出状态。如果文件不同,它会报告第一个差异发生的字节和行号。
语法
$ cmp [OPTION]... FILE1 [FILE2]
示例:
在以下示例中,让我们假设我们有三个文件:
file1.txt:
hello world
file2.txt:
hello world
file3.txt:
hello World
1. 比较两个相同的文件
当文件相同,cmp 不会产生输出。这是确认两个文件相同的标准方式。
$ cmp file1.txt file2.txt
(无输出显示)
2. 比较两个不同的文件
当发现差异时,cmp 会报告第一个不同字节的地址。
$ cmp file1.txt file3.txt
file1.txt file3.txt differ: byte 7, line 1
3. 显示所有不同的字节 (--verbose 或 -l)
-l(小写 L)标志非常强大。它为文件中的每个差异打印字节编号(十进制)和不同字节的值(八进制)。
$ cmp -l file1.txt file3.txt
7 167 127
说明:
这个输出意味着在字节位置 7,file1.txt 有八进制值 167(字母 'w'),而 file3.txt 有八进制值 127(字母 'W')。
4. 仅比较前 "n" 个字节 (--bytes 或 -n)
您可以将比较限制在特定数量的字节。在这里,我们只比较前 5 个字节。由于 "hello" 在两个文件中都是相同的,cmp 没有找到差异。
$ cmp -n 5 file1.txt file3.txt
(无输出显示)
5. 忽略初始 "n" 个字节 (--ignore-initial 或 -i)
您可以告诉 cmp 在开始比较之前跳过文件开头的特定数量的字节。在这里,我们跳过了前 6 个字节,因此比较从字母 'w' 开始。
$ cmp -i 6 file1.txt file3.txt
file1.txt file3.txt differ: byte 1, line 1
说明:
输出现在显示差异在 "字节 1",因为比较是在忽略最初的 6 个字节之后开始的。
常用选项
| 短标志 | 长标志 | 描述 |
|---|---|---|
| -b | --print-bytes | 打印不同的字节。 |
| -i SKIP | --ignore-initial=SKIP | 跳过两个文件开头的 SKIP 个字节。 |
| -l | --verbose | 输出字节编号和所有不同字节的值。 |
| -n LIMIT | --bytes=LIMIT | 比较最多 LIMIT 字节。 |
| -s | --quiet, --silent | 抑制所有输出。仅返回退出状态。 |
expr 命令
expr 命令评估给定的表达式并显示其相应的输出。它用于对整数执行基本的操作,如加法、减法、乘法、除法和取模,以及评估正则表达式,字符串操作,如子字符串、字符串长度等。
语法
expr expression
少量示例:
-
使用 expr 命令执行基本的算术运算
expr 7 + 14
expr 7 * 8
-
比较两个表达式
x=10
y=20
res=`expr $x = $y`
echo $res
-
匹配两个字符串中的字符数
expr alphabet : alpha
-
查找模数值
expr 20 % 30
-
提取子字符串
a=HelloWorld
b=`expr substr $a 6 10`
echo $b
其他标志及其功能
| 标志 | 描述 |
|---|---|
--version |
输出版本信息并退出 |
--help |
显示此帮助信息并退出 |
更多详情:Expr 在维基百科上的介绍
wall命令
wall命令(简称write all)用于向 Linux 系统上所有已登录用户发送消息。它通常由系统管理员用于广播重要信息,例如计划维护或紧急公告。
语法
$wall [options] [message]
如果命令行上未提供[消息],wall 将从标准输入读取,直到接收到文件结束字符(Ctrl+D)。
选项
| 选项 | 描述 |
|---|---|
| -n | 抑制显示发送者信息的横幅(显示谁发送了消息),只显示消息文本。 |
| -t [秒数] | 设置超时时间(秒)。wall将尝试在此期间向用户的终端写入,如果失败则放弃。 |
示例:
1. 向所有用户广播消息
此命令直接向所有已登录用户发送消息。
$ wall "The system will shut down in 10 minutes. Please save your work."
输出(在其他用户的终端上):
Broadcast message from your_username@hostname (pts/0) (Sat Oct 4 19:50:00 2025):
The system will shut down in 10 minutes. Please save your work.
2. 从文本文件广播消息
你可以将文件内容重定向到用作消息的内容。
消息.txt 的内容:
System maintenance will begin shortly.
Connections may be temporarily unstable.
命令:
$ wall < message.txt
3. 从标准输入发送多行消息
如果你运行 wall 命令而不带消息,你可以在终端中直接输入多行消息。完成输入后按 Ctrl+D 发送。
$ wall
The server is now back online.
All services are running normally.
<Ctrl+D>
输出(在其他用户的终端上):
Broadcast message from your_username@hostname (pts/0) (Sat Oct 4 19:52:00 2025):
The server is now back online.
All services are running normally.
ln 命令
ln 命令用于在 Linux 中创建文件之间的链接。它可以创建硬链接和符号(软)链接,这对于文件系统的管理和组织至关重要。
语法
ln [options] target linkname
ln [options] target... directory
链接类型
硬链接
-
直接指向文件的 inode
-
不能跨越不同的文件系统
-
不能链接到目录
-
如果原始文件被删除,硬链接仍然包含数据
符号(软)链接
-
指向文件路径(如快捷方式)
-
可以跨越不同的文件系统
-
可以链接到目录
-
如果原始文件被删除,符号链接会损坏
选项
一些流行的选项标志包括:
-s Create symbolic (soft) links instead of hard links
-f Force creation by removing existing destination files
-v Verbose output, show what's being linked
-n Treat destination as normal file if it's a symlink to a directory
-r Create relative symbolic links
-t Specify target directory for links
示例
- 创建硬链接
ln file.txt hardlink.txt
- 创建符号链接
ln -s /path/to/original/file.txt symlink.txt
- 创建指向目录的符号链接
ln -s /var/log logs
- 在目录中创建多个符号链接
ln -s /usr/bin/python3 /usr/bin/gcc /usr/local/bin/
- 创建相对符号链接
ln -sr ../config/app.conf current_config
- 强制创建链接(覆盖现有)
ln -sf /new/target existing_link
- 创建带有详细输出的链接
ln -sv /source/file /destination/link
用例
-
创建对常用文件或目录的快捷方式
-
维护配置文件的多个版本
-
组织文件而不重复存储空间
-
创建对重要文件的备份引用
-
使用共享库设置开发环境
重要注意事项
-
使用
ls -l查看文件是否为符号链接(由->表示) -
使用
ls -i查看硬链接的 inode 编号 -
在处理符号链接时要小心,以避免创建循环引用
-
硬链接共享相同的 inode 和磁盘空间
-
符号链接占用最小的磁盘空间(仅路径信息)
ln 命令对于高效的文件系统组织至关重要,在系统管理和开发工作流程中得到广泛应用。
更多详细信息,请查看手册:man ln
systemctl 命令
systemctl 命令用于控制和管理工作系统中的 systemd 服务以及 systemd 系统和服务管理器。它是现代 Linux 发行版中管理服务的主要工具。
语法
systemctl [options] command [service-name]
常用命令
服务管理
start [service] Start a service
stop [service] Stop a service
restart [service] Restart a service
reload [service] Reload service configuration
status [service] Show service status
enable [service] Enable service to start at boot
disable [service] Disable service from starting at boot
系统命令
reboot Restart the system
poweroff Shutdown the system
suspend Suspend the system
hibernate Hibernate the system
选项
一些流行的选项标志包括:
-l Show full output (don't truncate)
--no-pager Don't pipe output into a pager
--failed Show only failed units
--all Show all units, including inactive ones
-q Quiet mode, suppress output
-t Specify unit type (service, socket, etc.)
示例
- 启动一个服务
systemctl start nginx
- 停止一个服务
systemctl stop apache2
- 检查服务状态
systemctl status ssh
- 启用服务以便在启动时启动
systemctl enable mysql
- 禁用服务以便在启动时启动
systemctl disable bluetooth
- 重新启动一个服务
systemctl restart networking
- 不停止服务的情况下重新加载服务配置
systemctl reload nginx
- 列出所有活跃的服务
systemctl list-units --type=service
- 列出所有服务(活跃和不活跃)
systemctl list-units --type=service --all
- 列出失败的服务
systemctl --failed
- 显示服务依赖关系
systemctl list-dependencies nginx
- 检查服务是否已启用
systemctl is-enabled ssh
- 检查服务是否活跃
systemctl is-active mysql
- 重新启动系统
systemctl reboot
- 关闭系统
systemctl poweroff
服务状态信息
检查状态时,您将看到:
-
活跃(运行):服务目前正在运行
-
活跃(兴奋):服务完成成功
-
不活跃(死亡):服务未运行
-
失败:服务启动失败
用例
-
管理网络服务器(nginx、apache)
-
控制数据库服务(mysql、postgresql)
-
管理系统服务(ssh、网络)
-
故障排除服务问题
-
在脚本中自动化服务管理
-
系统管理和维护
重要注意事项
-
大多数操作需要 root 权限(使用
sudo) -
在 systemd 术语中,服务被称为“units”
-
配置文件位于
/etc/systemd/system/ -
在进行更改后始终检查服务状态
-
使用
journalctl查看详细的服务日志
systemctl 命令对于现代 Linux 系统管理和服务管理至关重要。
更多详细信息,请查看手册:man systemctl
journalctl 命令
journalctl 命令用于查看和查询 systemd 日志,它以结构化和索引化的格式收集和存储系统日志。它是现代 Linux 发行版中查看系统日志的主要工具。
语法
journalctl [options] [matches]
选项
一些流行的选项标志包括:
-f Follow journal (like tail -f)
-u [unit] Show logs for specific unit/service
-p [level] Filter by priority level (0-7)
-S [time] Show entries since specified time
-U [time] Show entries until specified time
-b Show logs from current boot
-k Show kernel messages only
-r Reverse output (newest first)
-n [lines] Show last N lines
--no-pager Don't pipe output to pager
-x Add explanatory help texts
-o [format] Output format (json, short, verbose, etc.)
--disk-usage Show current disk usage
--vacuum-size=[size] Remove logs to reduce size
--vacuum-time=[time] Remove logs older than time
优先级
0 Emergency (emerg)
1 Alert (alert)
2 Critical (crit)
3 Error (err)
4 Warning (warning)
5 Notice (notice)
6 Informational (info)
7 Debug (debug)
示例
- 查看所有日志条目
journalctl
- 跟踪实时日志条目
journalctl -f
- 显示特定服务的日志
journalctl -u nginx
- 显示上次启动以来的日志
journalctl -b
- 显示上次启动以来的日志
journalctl -b -1
- 显示内核消息
journalctl -k
- 显示特定时间的日志
journalctl --since "2024-01-01 00:00:00"
- 显示上小时的日志
journalctl --since "1 hour ago"
- 显示时间间隔内的日志
journalctl --since "2024-01-01" --until "2024-01-02"
- 仅显示错误和关键消息
journalctl -p err
- 显示最后 50 行
journalctl -n 50
- 跟踪特定服务的日志
journalctl -u ssh -f
- 以 JSON 格式显示日志
journalctl -o json
- 显示磁盘使用情况
journalctl --disk-usage
- 删除旧日志以释放空间
journalctl --vacuum-size=100M
- 删除 2 周前的旧日志
journalctl --vacuum-time=2weeks
- 显示带解释的日志
journalctl -x
- 显示特定进程 ID 的日志
journalctl _PID=1234
- 显示特定用户的日志
journalctl _UID=1000
- 以倒序显示
journalctl -r
时间指定
您可以使用各种时间格式:
-
"2024-01-01 12:00:00" -
"昨天" -
"今天" -
"1 小时前" -
"30 分钟前" -
"2 天前"
输出格式
short Default format
verbose All available fields
json JSON format
json-pretty Pretty-printed JSON
export Binary export format
cat Very short format
用例
-
故障排除系统问题
-
监控服务行为
-
安全审计
-
性能分析
-
调试系统问题
-
跟踪用户活动
重要注意事项
-
日志文件存储在
/var/log/journal/或/run/log/journal/ -
需要适当的权限来查看系统日志
-
随着时间的推移可能会消耗大量的磁盘空间
-
使用真空选项来管理日志大小
-
持久化日志需要适当的配置
journalctl 命令对于基于 systemd 的 Linux 发行版的系统管理和故障排除至关重要。
想要更多详细信息,请查看手册:man journalctl
watch命令
watch命令用于定期重复执行命令并显示输出。它特别适用于监视系统状态、文件内容或命令输出随时间的变化。
语法
watch [options] command
选项
一些流行的选项标志包括:
-n [seconds] Set update interval (default is 2 seconds)
-d Highlight differences between updates
-t Turn off header showing interval and command
-b Beep if command has non-zero exit status
-e Exit on error (non-zero exit status)
-g Exit when output changes
-c Interpret ANSI color sequences
-x Pass command to shell with exec
-p Precise timing mode
示例
- 每隔 2 秒监视系统运行时间(默认)
watch uptime
- 使用自定义间隔监视磁盘空间
watch -n 5 df -h
- 使用突出显示的差异监视内存使用
watch -d free -h
- 监视网络连接
watch -n 1 'netstat -tuln'
- 监视特定目录内容
watch 'ls -la /var/log'
- 监视 CPU 信息
watch -n 2 'cat /proc/cpuinfo | grep "cpu MHz"'
- 监视活动进程
watch -d 'ps aux | head -20'
- 监视文件大小变化
watch -n 1 'ls -lh /var/log/syslog'
- 监视系统负载
watch -n 3 'cat /proc/loadavg'
- 精确时间监视
watch -p -n 0.5 date
- 监视服务状态
watch 'systemctl status nginx'
- 支持颜色的监视
watch -c 'ls --color=always'
- 输出变化时退出
watch -g 'cat /tmp/status.txt'
- 错误时发出蜂鸣声进行监视
watch -b 'ping -c 1 google.com'
- 监视日志文件大小
watch 'wc -l /var/log/messages'
- 监视 docker 容器
watch 'docker ps'
- 监视温度传感器
watch -n 2 sensors
- 监视 git 状态
watch -d 'git status --porcelain'
- 监视带宽使用
watch -n 1 'cat /proc/net/dev'
- 无头部监视
watch -t 'date'
用例
-
系统监控和性能分析
-
监视日志文件变化
-
监视网络连接性
-
跟踪文件系统变化
-
观察进程行为
-
调试系统问题
-
自动化和脚本
-
实时状态监控
关键特性
-
实时更新: 持续刷新输出
-
差异突出显示: 显示更新之间的变化
-
灵活的间隔: 自定义更新频率
-
退出条件: 可在变化或错误时退出
-
头部信息: 显示命令和更新间隔
重要注意事项
-
按
Ctrl+C退出监视 -
在包含管道或重定向的复杂命令周围使用引号
-
每次命令都在子 shell 中运行
-
小心使用资源密集型命令和短间隔
-
屏幕将在每次更新时清除并刷新
-
头部显示最后更新时间和间隔
小贴士
-
使用
-d轻松查看变化 -
与
grep结合以过滤输出 -
对于不太关键的监控,使用较长的间隔
-
设置非常短的间隔时,请考虑系统负载
watch命令是系统管理员和需要实时监控变化的开发人员的必备工具。
更多详细信息,请查看手册:man watch
jobs 命令
jobs 命令用于显示当前 shell 会话中活动作业的信息。作业是从 shell 启动的进程,可以使用作业控制命令进行管理。
语法
jobs [options] [job_spec]
选项
一些流行的选项标志包括:
-l List process IDs along with job information
-p List only process IDs
-n List only jobs that have changed status since last notification
-r List only running jobs
-s List only stopped jobs
-x Replace job specifications with process IDs in command
作业状态
作业可以处于不同的状态:
-
运行中:作业目前正在执行
-
已停止:作业已挂起(暂停)
-
完成:作业已成功完成
-
已终止:作业被杀死或异常结束
示例
- 列出所有当前作业
jobs
- 按进程 ID 列出作业
jobs -l
- 仅列出进程 ID
jobs -p
- 仅列出正在运行的作业
jobs -r
- 仅列出已停止的作业
jobs -s
- 显示特定作业的状态
jobs %1
作业控制示例
- 启动后台作业
sleep 100 &
- 启动多个后台作业
find / -name "*.log" > /tmp/logs.txt 2>/dev/null &
ping google.com > /tmp/ping.txt &
- 查看所有作业
jobs
输出可能如下所示:
[1]- Running find / -name "*.log" > /tmp/logs.txt 2>/dev/null &
[2]+ Running ping google.com > /tmp/ping.txt &
- 停止正在运行的作业(Ctrl+Z)
# Start a command
vim myfile.txt
# Press Ctrl+Z to stop it
# Then check jobs
jobs
- 将作业带到前台
fg %1
- 将作业发送到后台
bg %1
- 杀死特定作业
kill %2
作业规范
您可以使用不同的格式引用作业:
-
%1- 第 1 个作业号 -
%+或%%- 当前作业(最新) -
%-- 前一个作业 -
%string- 命令行以字符串开头的作业 -
%?string- 命令行包含字符串的作业
作业控制示例
- 启动和管理多个作业
# Start some background jobs
sleep 300 &
ping localhost > /dev/null &
find /usr -name "*.conf" > /tmp/configs.txt 2>/dev/null &
# List all jobs
jobs -l
# Bring first job to foreground
fg %1
# Put it back to background (after stopping with Ctrl+Z)
bg %1
# Kill second job
kill %2
# Check remaining jobs
jobs
- 与已停止作业一起工作
# Start a text editor
nano myfile.txt
# Stop it with Ctrl+Z
# Check jobs
jobs
# Resume in background
bg
# Resume in foreground
fg
用例
-
多任务处理:同时运行多个命令
-
长时间运行的过程:管理需要时间才能完成的任务
-
后台处理:在处理其他事情的同时运行任务
-
作业监控:跟踪运行中的进程
-
进程管理:控制和组织 shell 进程
相关命令
-
fg- 将作业带到前台 -
bg- 将作业发送到后台 -
nohup- 运行不受挂起的命令 -
disown- 从作业表中删除作业 -
kill- 终止作业或进程
重要注意事项
-
作业特定于当前 shell 会话
-
作业号是按顺序分配的
-
作业在完成或退出 shell 时消失
-
在命令末尾使用
&以在后台运行它 -
按
Ctrl+Z停止(挂起)正在运行的作业 -
使用
Ctrl+C终止正在运行的作业
高级示例
- 在后台运行并取消作业的所有权
long_running_script.sh &
disown %1
- 检查完成的作业
jobs -n
- 杀死所有作业
kill $(jobs -p)
jobs 命令对于管理多个进程和在 shell 中实施有效的流程管理至关重要。
更多详细信息,请查看手册:man jobs 或 help jobs
bg 命令
使用 bg 命令可以将停止的作业放入后台,允许它们在您使用终端进行其他任务时继续运行。这是类 Unix shell 中的作业控制功能的一部分。
语法
bg [job_spec]
如果没有提供作业说明,bg 将作用于当前作业(最近的作业)。
职位说明
您可以使用不同的格式引用作业:
-
%1- 第 1 个作业号 -
%+或%%- 当前作业(最近的) -
%-- 前一个作业 -
%string- 命令行以字符串开头的作业 -
%?string- 包含字符串的命令行作业
示例
- 将当前停止的作业放入后台
bg
- 将特定作业放入后台
bg %1
- 将多个作业放入后台
bg %1 %2 %3
完整的作业控制工作流程
这里是一个典型的流程,展示了 bg 的使用:
- 启动长时间运行的命令
find / -name "*.log" > /tmp/findlogs.txt 2>/dev/null
- 使用 Ctrl+Z 停止作业
^Z
[1]+ Stopped find / -name "*.log" > /tmp/findlogs.txt 2>/dev/null
- 检查作业
jobs
输出:
[1]+ Stopped find / -name "*.log" > /tmp/findlogs.txt 2>/dev/null
- 将停止的作业放入后台
bg %1
输出:
[1]+ find / -name "*.log" > /tmp/findlogs.txt 2>/dev/null &
- 验证作业是否在后台运行
jobs
输出:
[1]+ Running find / -name "*.log" > /tmp/findlogs.txt 2>/dev/null &
实际示例
- 使用文本编辑器工作
# Start editing a file
vim myfile.txt
# Stop with Ctrl+Z
# Put it in background
bg
# Now you can run other commands while vim runs in background
ls -la
# Bring vim back to foreground when needed
fg %1
- 管理多个后台任务
# Start several tasks and stop them
ping google.com > /tmp/ping1.txt
# Ctrl+Z
sleep 300
# Ctrl+Z
tar czf backup.tar.gz /home/user/documents
# Ctrl+Z
# Check all stopped jobs
jobs
# Put all in background
bg %1
bg %2
bg %3
# Or put specific ones
bg %ping # Job starting with "ping"
- 直接在后台启动命令与使用 bg
# Method 1: Start directly in background
find /usr -name "*.conf" > /tmp/configs.txt &
# Method 2: Start normally, stop, then background
find /usr -name "*.conf" > /tmp/configs.txt
# Ctrl+Z
bg
相关命令
-
fg- 将作业带到前台 -
jobs- 列出活动作业 -
kill- 终止作业 -
nohup- 运行不受挂起影响的命令 -
disown- 从作业表中删除作业
用例
-
多任务处理:同时运行多个任务
-
长时间进程:在处理其他事情的同时运行耗时任务
-
交互式程序:暂时将编辑器或交互式工具放入后台
-
开发:编码时的后台编译
-
系统管理:在执行其他任务的同时进行后台监控
重要提示
-
使用
bg放入后台的作业仍然连接到终端 -
如果您关闭终端,后台作业可能会被终止
-
使用
nohup或disown进行持久后台进程 -
后台作业无法从 stdin(键盘输入)读取
-
您可以使用
fg将后台作业恢复到前台 -
后台作业将继续写入 stdout/stderr,除非重定向
错误处理
如果 bg 失败,常见原因包括:
-
作业不存在
-
作业已经在运行
-
作业无法放入后台(某些交互式程序)
小贴士
-
在使用
bg之前和之后,始终使用jobs检查作业状态 -
将后台作业的输出重定向以避免终端混乱
-
负责任地使用作业控制以避免系统资源问题
-
考虑使用
screen或tmux等终端多路复用器进行持久会话
bg 命令对于在 shell 环境中有效地进行多任务处理和作业管理至关重要。
更多详细信息,请查看手册:help bg
fg 命令
fg 命令用于将后台或停止的作业带到前台,使其成为终端中的活动进程。它是类 Unix shell 中作业控制的一个基本部分。
语法
fg [job_spec]
如果没有提供作业指定,fg 将操作当前作业(最近的作业)。
作业指定
您可以使用不同的格式引用作业:
-
%1- 第 1 个作业 -
%+或%%- 当前作业(最近的) -
%-- 前一个作业 -
%string- 命令行以字符串开头的作业 -
%?string- 命令行包含字符串的作业
示例
- 将当前作业带到前台
fg
- 将特定作业带到前台
fg %1
- 通过部分命令名来调用作业
fg %vim
- 调用包含特定文本的作业
fg %?backup
完整的作业控制工作流程
这里是一个展示 fg 命令使用的典型工作流程:
- 启动一个后台作业
ping google.com > /tmp/ping.txt &
- 启动另一个作业并停止它
vim myfile.txt
# Press Ctrl+Z to stop
- 检查当前作业
jobs
输出:
[1]- Running ping google.com > /tmp/ping.txt &
[2]+ Stopped vim myfile.txt
- 将 vim 带到前台
fg %2
- 在 vim 中工作,然后再次停止(Ctrl+Z)并将 ping 带到前台
fg %1
实际示例
- 与编辑器一起工作
# Start editing
nano config.txt
# Stop with Ctrl+Z
# Do other work
ls -la
# Return to editor
fg
- 管理多个开发任务
# Start compilation in background
make all > build.log 2>&1 &
# Start editing source code
vim main.c
# Stop editor (Ctrl+Z)
# Check build progress
fg %make
# Stop build monitoring (Ctrl+Z)
# Return to editing
fg %vim
- 交互式调试会话
# Start debugger
gdb ./myprogram
# Stop debugger (Ctrl+Z)
# Check core dumps or logs
ls -la core.*
# Return to debugger
fg %gdb
- 与多个终端/会话一起工作
# Start SSH session
ssh user@remote-server
# Stop SSH (Ctrl+Z)
# Do local work
ps aux | grep myprocess
# Return to SSH session
fg %ssh
高级用法
- 在多个停止的作业之间切换
# Start several editors
vim file1.txt
# Ctrl+Z
vim file2.txt
# Ctrl+Z
nano file3.txt
# Ctrl+Z
# Check all jobs
jobs
# Switch between them
fg %1 # vim file1.txt
# Ctrl+Z
fg %2 # vim file2.txt
# Ctrl+Z
fg %3 # nano file3.txt
- 在脚本中使用作业控制
#!/bin/bash# Start background monitoring
tail -f /var/log/syslog &
MONITOR_PID=$!
# Do main work
./main_script.sh
# Bring monitor to foreground for review
fg %tail
# Or kill it
kill $MONITOR_PID
相关命令
-
bg- 将作业放入后台 -
jobs- 列出活动作业 -
kill- 终止作业 -
Ctrl+Z- 停止(挂起)当前作业 -
Ctrl+C- 终止当前作业
用例
-
代码编辑:在多个打开的编辑器之间切换
-
开发:在编译和编辑之间交替
-
系统监控:在监控工具之间切换
-
远程会话:恢复 SSH 或其他远程连接
-
交互程序:返回暂停的交互式应用程序
-
调试:恢复调试会话
重要提示
-
当作业被带到前台时,它成为活动进程
-
您一次只能有一个前台作业
-
前台作业可以接收键盘输入
-
使用 Ctrl+Z 停止(挂起)前台作业
-
使用 Ctrl+C 终止前台作业
-
后台作业即使在不在前台时也会继续运行
错误处理
fg 的常见问题:
-
作业不存在:
fg: %3: no such job -
没有可用的作业:
fg: no current job -
作业已在前台
有效使用技巧
-
使用作业编号:比部分名称更可靠
-
首先检查作业:始终运行
jobs来查看当前状态 -
一致的流程:为作业切换制定常规
-
重定向输出:后台作业应重定向输出以避免干扰
# Good practice
tail -f /var/log/messages > monitor.out 2>&1 &
vim script.sh
# Ctrl+Z
fg %tail # Review logs
# Ctrl+Z
fg %vim # Continue editing
与其他工具的集成
fg 与以下工具配合使用:
-
终端多路复用器:
screen、tmux -
开发环境:IDE、编辑器
-
系统监控:
top、htop、tail -
网络工具:
ssh、ping、netstat
fg 命令对于高效的终端多任务处理至关重要,并提供了在不同任务之间无缝切换的能力。
更多详细信息,请查看手册:help fg
time 命令
time 命令用于测量程序和命令的执行时间。它提供了关于命令运行所需时间的详细信息,包括用户时间、系统时间和真实(墙钟)时间。
语法
time [options] command [arguments]
时间测量类型
实时(墙钟时间)
-
从开始到结束的总耗时
-
包括等待 I/O、其他进程等所花费的时间
用户时间
-
执行用户级代码花费的时间
-
进程本身使用的 CPU 时间
系统时间
-
在内核模式中花费的时间
-
系统调用使用的 CPU 时间
输出格式
标准输出显示三个测量值:
real 0m2.345s
user 0m1.234s
sys 0m0.567s
选项
一些流行的选项标志包括:
-p Use POSIX format output
-f format Use custom format string
-o file Write output to file instead of stderr
-a Append to output file instead of overwriting
-v Verbose output with detailed statistics
示例
- 计时一个简单命令
time ls -la
- 计时脚本执行
time ./my_script.sh
- 计时编译过程
time make all
- 使用 POSIX 格式计时
time -p find /usr -name "*.txt"
- 将计时信息保存到文件
time -o timing.log -a make clean && make
- 详细计时信息
time -v python large_calculation.py
高级用法
- 计时多个命令
time (command1 && command2 && command3)
- 使用自定义格式计时
/usr/bin/time -f "Time: %E, Memory: %M KB" ./memory_intensive_program
- 计时并重定向输出
time (find /usr -name "*.log" > found_logs.txt 2>&1)
- 比较执行时间
echo "Method 1:"
time method1_script.sh
echo "Method 2:"
time method2_script.sh
使用 GNU time(高级)
GNU 版本的 time(通常位于 /usr/bin/time)提供更详细的信息:
/usr/bin/time -v command
这显示了额外的统计数据,如:
-
最大常驻集大小(内存使用)
-
页面错误
-
上下文切换
-
文件系统输入/输出
GNU time 的格式说明符
%E Elapsed real time (wall clock time)
%U User CPU time
%S System CPU time
%M Maximum resident set size (KB)
%P Percentage of CPU used
%X Average size of shared text (KB)
%D Average size of unshared data (KB)
%c Number of voluntary context switches
%w Number of involuntary context switches
%I Number of file system inputs
%O Number of file system outputs
实际示例
- 分析 Python 脚本
time python -c "
import time
for i in range(1000000):
str(i)
"
- 比较不同的算法
echo "Bubble sort:"
time ./bubble_sort < large_dataset.txt
echo "Quick sort:"
time ./quick_sort < large_dataset.txt
- 计时数据库操作
time mysql -u user -p database < complex_query.sql
- 计时网络操作
time wget https://large-file.example.com/bigfile.zip
- 时间压缩操作
echo "gzip compression:"
time gzip -c large_file.txt > large_file.gz
echo "bzip2 compression:"
time bzip2 -c large_file.txt > large_file.bz2
- 分析构建过程
echo "Clean build timing:"
time (make clean && make -j4)
理解输出
示例输出解释:
real 0m5.234s # Total elapsed time (5.234 seconds)
user 0m3.456s # CPU time in user mode (3.456 seconds)
sys 0m0.789s # CPU time in system mode (0.789 seconds)
分析:
-
如果
real>user+sys:进程是 I/O 密集型或等待 -
如果
real≈user+sys:进程是 CPU 密集型 -
如果
user>>sys:进程大部分时间在用户代码中 -
如果
sys>>user:进程进行了许多系统调用
基准测试最佳实践
- 多次运行:多次运行并平均结果
for i in {1..5}; do
echo "Run $i:"
time ./program
done
- 预热运行:进行几次运行以预热缓存
# Warm-up
./program > /dev/null 2>&1
# Actual timing
time ./program
- 一致的环境:控制变量
# Clear caches
sync && echo 3 > /proc/sys/vm/drop_caches
# Run with consistent priority
nice -n 0 time ./program
用例
-
性能优化:识别慢操作
-
基准测试:比较不同的实现
-
系统分析:了解资源使用模式
-
构建优化:计时编译过程
-
脚本分析:查找 shell 脚本中的瓶颈
-
开发:测量算法效率
重要提示
-
内置
time与/usr/bin/time可能具有不同的功能 -
由于系统负载,运行结果可能有所不同
-
I/O 操作可以显著影响时间
-
使用多次测量进行准确的基准测试
-
在计时文件操作时考虑系统缓存
结合其他工具
- 使用
nice进行优先级控制
time nice -n 10 ./cpu_intensive_task
- 使用
timeout进行最大运行时间
time timeout 30s ./potentially_slow_command
- 使用
strace进行系统调用分析
time strace -c ./program 2> syscalls.log
time 命令对于性能分析、优化和理解 Linux 系统中的程序行为至关重要。
更多详细信息,请查看手册:man time
export 命令
export 命令用于设置对子进程可用的环境变量。它使变量对从当前 shell 会话启动的所有进程可用。
语法
export [options] [variable[=value]]
export [options] [name[=value] ...]
环境变量是如何工作的
-
局部变量:仅在当前 shell 中可用
-
环境变量:对当前 shell 和所有子进程可用
-
export将局部变量转换为环境变量
选项
一些流行的选项标志包括:
-f Export functions instead of variables
-n Remove variable from environment (unexport)
-p Display all exported variables
示例
- 导出一个简单变量
export MY_VAR="Hello World"
- 一次性导出多个变量
export VAR1="value1" VAR2="value2" VAR3="value3"
- 导出现有的局部变量
LOCAL_VAR="test"
export LOCAL_VAR
- 显示所有导出的变量
export -p
- 导出 PATH 修改
export PATH="$PATH:/usr/local/bin"
- 使用命令替换导出
export CURRENT_DATE=$(date)
export HOSTNAME=$(hostname)
- 取消导出一个变量(从环境中移除)
export -n MY_VAR
- 导出函数
my_function() {
echo "Hello from function"
}
export -f my_function
常见环境变量
- PATH - 可执行搜索路径
export PATH="/usr/local/bin:$PATH"
- HOME - 用户的主目录
export HOME="/home/username"
- EDITOR - 默认文本编辑器
export EDITOR="vim"
export VISUAL="code"
- LANG - 系统语言和区域设置
export LANG="en_US.UTF-8"
- PS1 - 主要提示字符串
export PS1="\u@\h:\w\$ "
- JAVA_HOME - Java 安装目录
export JAVA_HOME="/usr/lib/jvm/java-11-openjdk"
- NODE_ENV - Node.js 环境
export NODE_ENV="production"
开发环境示例
- Python 开发
export PYTHONPATH="$PYTHONPATH:/path/to/modules"
export VIRTUAL_ENV="/path/to/venv"
- Node.js 开发
export NODE_PATH="/usr/local/lib/node_modules"
export NPM_CONFIG_PREFIX="$HOME/.npm-global"
- Go 开发
export GOPATH="$HOME/go"
export GOROOT="/usr/local/go"
export PATH="$PATH:$GOROOT/bin:$GOPATH/bin"
- 数据库配置
export DB_HOST="localhost"
export DB_PORT="5432"
export DB_NAME="myapp"
export DB_USER="dbuser"
Shell 配置文件
通过将它们添加到配置文件中使导出永久化:
- Bash -
~/.bashrc或~/.bash_profile
echo 'export MY_VAR="permanent_value"' >> ~/.bashrc
- Zsh -
~/.zshrc
echo 'export MY_VAR="permanent_value"' >> ~/.zshrc
- 系统范围 -
/etc/environment或/etc/profile
# /etc/environment
MY_GLOBAL_VAR="system_wide_value"
检查变量
- 检查变量是否已导出
env | grep MY_VAR
printenv MY_VAR
echo $MY_VAR
- 检查变量作用域
# Local variable
MY_LOCAL="test"
bash -c 'echo $MY_LOCAL' # Empty output
# Exported variable
export MY_EXPORTED="test"
bash -c 'echo $MY_EXPORTED' # Shows "test"
高级用法
- 条件导出
if [ -d "/opt/myapp" ]; then
export MYAPP_HOME="/opt/myapp"
fi
- 使用默认值导出
export EDITOR="${EDITOR:-vim}"
export PORT="${PORT:-3000}"
- 导出数组(Bash 4+)
declare -a my_array=("item1" "item2" "item3")
export my_array
- 使用验证导出
validate_and_export() {
if [ -n "$1" ] && [ -n "$2" ]; then
export "$1"="$2"
echo "Exported $1=$2"
else
echo "Error: Invalid arguments"
fi
}
validate_and_export "API_KEY" "your-secret-key"
用例
-
开发环境:设置特定语言的路径
-
应用程序配置:数据库 URL、API 密钥、功能标志
-
系统管理:自定义 PATH 修改,代理设置
-
CI/CD 管道:构建配置,部署目标
-
安全:不应在脚本中包含的敏感数据
重要提示
-
导出的变量会被子进程继承
-
子进程中导出变量的更改不会影响父进程
-
对于包含空格或特殊字符的值,请使用引号
-
按惯例,环境变量通常是大写
-
在环境变量中处理敏感数据时要小心
-
一些变量(如 PATH)应该追加,而不是替换
安全考虑
- 避免在导出中包含敏感数据
# Badexport PASSWORD="secret123"
# Better - read from secure file or prompt
read -s -p "Enter password: " PASSWORD
export PASSWORD
- 使用临时导出进行敏感操作
# Export temporarilyexport TEMP_TOKEN="secret"
my_command_that_needs_token
unset TEMP_TOKEN # Clean up
export 命令对于 shell 脚本和系统管理至关重要,它使应用程序和进程能够进行适当的环境配置。
更多详细信息,请查看手册:help export 或 man bash
ufw 命令
UFW(简化防火墙)是 Ubuntu 和其他基于 Debian 的系统上管理 iptables 防火墙规则的友好命令行前端。它提供了一种简单的方式来配置防火墙规则,无需处理复杂的 iptables 语法。
语法
ufw [options] command [parameters]
安装
# Ubuntu/Debian
sudo apt update && sudo apt install ufw
# Check if UFW is installed
which ufw
基本命令
启用/禁用 UFW
# Enable UFW
sudo ufw enable
# Disable UFW
sudo ufw disable
# Check UFW status
sudo ufw status
sudo ufw status verbose
sudo ufw status numbered
基本规则
允许/拒绝流量
- 允许特定端口
# Allow SSH (port 22)
sudo ufw allow 22
sudo ufw allow ssh
# Allow HTTP (port 80)
sudo ufw allow 80
sudo ufw allow http
# Allow HTTPS (port 443)
sudo ufw allow 443
sudo ufw allow https
# Allow custom port
sudo ufw allow 8080
- 拒绝特定端口
# Deny port 80
sudo ufw deny 80
# Deny SSH from specific IP
sudo ufw deny from 192.168.1.100 to any port 22
- 通过服务名称允许/拒绝
# Allow common services
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw allow ftp
sudo ufw allow smtp
高级规则
端口范围
# Allow port range
sudo ufw allow 1000:2000/tcp
sudo ufw allow 1000:2000/udp
# Allow specific protocol
sudo ufw allow 53/udp # DNS
sudo ufw allow 53/tcp # DNS over TCP
IP 地址规则
- 允许/拒绝特定 IP 地址
# Allow from specific IP
sudo ufw allow from 192.168.1.100
# Deny from specific IP
sudo ufw deny from 192.168.1.50
# Allow subnet
sudo ufw allow from 192.168.1.0/24
- 允许 IP 到特定端口
# Allow specific IP to SSH
sudo ufw allow from 192.168.1.100 to any port 22
# Allow subnet to web server
sudo ufw allow from 10.0.0.0/8 to any port 80
接口特定规则
# Allow on specific interface
sudo ufw allow in on eth0 to any port 80
# Allow out on specific interface
sudo ufw allow out on eth1 to any port 443
规则管理
列出规则
# Show status and rules
sudo ufw status
# Show numbered rules
sudo ufw status numbered
# Show verbose status
sudo ufw status verbose
删除规则
# Delete by rule number
sudo ufw delete 3
# Delete by specifying the rule
sudo ufw delete allow 80
sudo ufw delete allow from 192.168.1.100
插入规则
# Insert rule at specific position
sudo ufw insert 1 allow from 192.168.1.0/24
默认策略
# Set default policies
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw default deny forward
# Check current defaults
sudo ufw status verbose
应用程序配置文件
列出可用配置文件
# List application profiles
sudo ufw app list
# Show profile info
sudo ufw app info OpenSSH
sudo ufw app info "Apache Full"
使用应用程序配置文件
# Allow application
sudo ufw allow OpenSSH
sudo ufw allow "Apache Full"
sudo ufw allow "Nginx Full"
# Common application profiles
sudo ufw allow "OpenSSH"
sudo ufw allow "Apache"
sudo ufw allow "Apache Secure"
sudo ufw allow "Nginx HTTP"
sudo ufw allow "Nginx HTTPS"
sudo ufw allow "Nginx Full"
日志记录
# Enable logging
sudo ufw logging on
# Set log level
sudo ufw logging low
sudo ufw logging medium
sudo ufw logging high
# Disable logging
sudo ufw logging off
# View logs
sudo tail -f /var/log/ufw.log
重置和重新加载
# Reset all rules to default
sudo ufw --force reset
# Reload UFW
sudo ufw reload
常见用例
1. 基本网络服务器设置
# Allow SSH, HTTP, and HTTPS
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
2. 数据库服务器(MySQL)
# Allow MySQL only from application servers
sudo ufw allow from 192.168.1.10 to any port 3306
sudo ufw allow from 192.168.1.11 to any port 3306
3. 开发服务器
# Allow common development ports
sudo ufw allow 3000 # Node.js
sudo ufw allow 8000 # Django
sudo ufw allow 5000 # Flask
sudo ufw allow 4200 # Angular
4. 邮件服务器
# Allow mail server ports
sudo ufw allow smtp # Port 25
sudo ufw allow 587/tcp # SMTP submission
sudo ufw allow 993/tcp # IMAPS
sudo ufw allow 995/tcp # POP3S
5. DNS 服务器
# Allow DNS traffic
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
安全最佳实践
1. 最小权限原则
# Start with deny all
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Only allow what's needed
sudo ufw allow ssh
sudo ufw allow from 192.168.1.0/24 to any port 80
2. 限制 SSH 访问
# Limit SSH attempts (6 attempts in 30 seconds)
sudo ufw limit ssh
# Allow SSH only from specific networks
sudo ufw allow from 192.168.1.0/24 to any port 22
sudo ufw deny ssh
3. 监控和日志
# Enable logging
sudo ufw logging medium
# Monitor logs
sudo tail -f /var/log/ufw.log | grep DPT
故障排除
1. 检查当前规则
sudo ufw status numbered
sudo iptables -L -n
2. 测试连接
# Test if port is accessible
telnet your-server-ip 80
nc -zv your-server-ip 22
3. 调试 UFW
# Dry run (show what would happen)
sudo ufw --dry-run allow 80
# Check UFW version
ufw --version
高级配置
1. 自定义规则文件
# Edit UFW rules directly
sudo vim /etc/ufw/user.rules
sudo vim /etc/ufw/user6.rules
2. 速率限制
# Limit connections per IP
sudo ufw limit ssh
sudo ufw limit 80/tcp
3. 端口转发
# Enable IP forwardingecho 'net.ipv4.ip_forward=1' | sudo tee -a /etc/ufw/sysctl.conf
# Add NAT rules to /etc/ufw/before.rules
服务集成
1. Docker 集成
# Allow Docker containers
sudo ufw allow from 172.17.0.0/16
# Block Docker bypass (in /etc/ufw/after.rules)
2. Fail2ban 集成
# UFW works with fail2ban
sudo apt install fail2ban
# Configure fail2ban to use UFW actions
重要注意事项
-
UFW 是 iptables 的前端,而不是替代品
-
规则按顺序处理(先匹配者胜出)
-
当没有特定规则匹配时,应用默认策略
-
默认情况下,UFW 不会干扰现有的 iptables 规则
-
在生产环境中启用规则之前,始终测试规则
-
在远程启用 UFW 之前,保留 SSH 访问规则
快速参考
# Essential commands
sudo ufw enable # Enable firewall
sudo ufw status # Check status
sudo ufw allow 22 # Allow SSH
sudo ufw allow from 192.168.1.0/24 # Allow subnet
sudo ufw delete 3 # Delete rule #3
sudo ufw reset # Reset all rules
sudo ufw reload # Reload configuration
UFW 在简单性和功能之间提供了极佳的平衡,使其成为需要有效防火墙管理而不必处理 iptables 复杂性的系统管理员的理想选择。
更多详细信息,请查看手册:man ufw
traceroute 命令
traceroute 命令用于跟踪数据包从您的计算机到网络中目标主机的路径。它显示了路径上的每个跳(路由器)并测量到达每个跳的时间。
语法
traceroute [options] destination
安装
# Ubuntu/Debian
sudo apt update && sudo apt install traceroute
# CentOS/RHEL/Fedora
sudo yum install traceroute
# or
sudo dnf install traceroute
# macOS (usually pre-installed)
traceroute
# Check if installed
which traceroute
基本用法
- 跟踪路由到网站
traceroute google.com
traceroute github.com
traceroute 8.8.8.8
- 跟踪路由到 IP 地址
traceroute 192.168.1.1
traceroute 208.67.222.222
选项
一些流行的选项标志包括:
-n Don't resolve hostnames (show IP addresses only)
-w [sec] Set timeout for responses (default 5 seconds)
-q [num] Set number of probe packets per hop (default 3)
-m [hops] Set maximum number of hops (default 30)
-p [port] Set destination port (default 33434)
-f [ttl] Set first TTL value (starting hop)
-g [addr] Use loose source route gateway
-I Use ICMP ECHO instead of UDP
-T Use TCP SYN instead of UDP
-U Use UDP (default)
-4 Force IPv4
-6 Force IPv6
-s [addr] Set source address
-i [iface] Set network interface
示例
- 基本跟踪路由
traceroute google.com
- 仅显示 IP 地址(不进行 DNS 解析)
traceroute -n google.com
- 设置自定义超时
traceroute -w 10 google.com
- 使用 ICMP 而不是 UDP
traceroute -I google.com
- 使用 TCP 跟踪路由
traceroute -T google.com
- 设置最大跳数
traceroute -m 15 google.com
- 设置每个跳数的探测次数
traceroute -q 1 google.com
- 强制使用 IPv6
traceroute -6 ipv6.google.com
- 设置自定义端口
traceroute -p 80 google.com
- 从特定的 TTL 开始
traceroute -f 5 google.com
理解输出
跟踪路由输出示例:
traceroute to google.com (172.217.164.174), 30 hops max, 60 byte packets
1 router.local (192.168.1.1) 1.234 ms 1.123 ms 1.045 ms
2 10.0.0.1 (10.0.0.1) 12.345 ms 11.234 ms 10.123 ms
3 isp-gateway.net (203.0.113.1) 25.678 ms 24.567 ms 23.456 ms
4 * * *
5 google-router.net (172.217.164.174) 45.123 ms 44.234 ms 43.345 ms
输出说明:
-
跳数:每个路由器的顺序编号
-
主机名/IP:路由器的名称和 IP 地址
-
三次:三个探测数据包的往返时间
-
*****:表示超时或过滤响应
常见用例
1. 网络故障排除
# Check where packets are being dropped
traceroute -n problematic-server.com
# Compare paths to different destinations
traceroute server1.com
traceroute server2.com
2. 性能分析
# Identify slow hops
traceroute -w 10 slow-website.com
# Check latency to different regions
traceroute eu-server.com
traceroute us-server.com
traceroute asia-server.com
3. 网络安全分析
# Check if traffic goes through unexpected countries
traceroute -n suspicious-site.com
# Verify VPN routing
traceroute -n whatismyip.com
4. ISP 路由分析
# Check ISP routing decisions
traceroute -n 8.8.8.8
traceroute -n 1.1.1.1
traceroute -n 208.67.222.222
高级技巧
1. TCP 跟踪路由(tcptraceroute)
# Install tcptraceroute
sudo apt install tcptraceroute
# Trace TCP path to web server
sudo tcptraceroute google.com 80
sudo tcptraceroute -n github.com 443
2. MTR(我的跟踪路由)
# Install mtr
sudo apt install mtr
# Continuous traceroute with statistics
mtr google.com
mtr -n google.com # No DNS resolution
mtr -r google.com # Report mode
3. 巴黎跟踪路由
# More accurate for load-balanced networks
sudo apt install paris-traceroute
paris-traceroute google.com
跟踪路由变体
1. IPv6 跟踪路由
# IPv6 traceroute
traceroute6 ipv6.google.com
traceroute -6 ipv6.google.com
2. 可视化跟踪路由工具
# Web-based visual traceroute# Visit: traceroute-online.com# or use: mtr with GUI# Install mtr-gtk for GUI
sudo apt install mtr-gtk
mtr-gtk
分析结果
1. 识别问题
# High latency at specific hop
# Look for sudden jumps in response times
# Packet loss
# Look for * * * responses
# Asymmetric routing
# Different paths for different packets
2. 地理分析
# Use whois to identify hop locations
whois 203.0.113.1
# Use online IP geolocation services
# to map the route geographically
故障排除常见问题
1. 超时和星号
# Try different protocols
traceroute -I google.com # ICMP
traceroute -T google.com # TCP
traceroute -U google.com # UDP (default)
# Increase timeout
traceroute -w 10 google.com
2. 权限问题
# UDP traceroute might need privileges
sudo traceroute google.com
# ICMP definitely needs privileges
sudo traceroute -I google.com
3. 防火墙干扰
# Some firewalls block traceroute# Try different ports
traceroute -p 53 google.com # DNS port
traceroute -p 80 google.com # HTTP port
安全考虑
1. 信息披露
# Traceroute reveals network topology# Be careful when sharing results publicly# Use -n to avoid revealing internal hostnames
traceroute -n destination
2. 防火墙规避
# Try different protocols if blocked
traceroute -T -p 443 target.com
traceroute -I target.com
自动化和脚本
1. 批量跟踪路由
#!/bin/bash# Trace routes to multiple destinations
destinations=("google.com" "github.com" "stackoverflow.com")
for dest in "${destinations[@]}"; do
echo "Tracing route to $dest"
traceroute -n "$dest" > "traceroute_$dest.txt"
done
2. 监控脚本
#!/bin/bash# Monitor route changeswhile true; do
traceroute -n google.com > "/tmp/trace_$(date +%s).txt"
sleep 3600 # Check every hour
done
3. 路由比较
#!/bin/bash# Compare routes from different locationsecho "Route from current location:"
traceroute -n $1
echo "Route from VPN:"
# Connect to VPN and run again
替代命令
1. pathping(Windows 等效)
# On Windows systems
pathping google.com
2. mtr(更好的替代品)
# Continuous monitoring
mtr --report google.com
mtr --report-cycles 10 google.com
3. hping3(高级探测)
sudo apt install hping3
sudo hping3 -T -p 80 -c 3 google.com
性能优化
1. 更快的跟踪路由
# Reduce probes per hop
traceroute -q 1 google.com
# Reduce max hops
traceroute -m 15 google.com
# Skip DNS resolution
traceroute -n google.com
2. 详细分析
# More probes for accuracy
traceroute -q 5 google.com
# Longer timeout for slow links
traceroute -w 15 google.com
重要注意事项
-
跟踪路由可能无法显示负载均衡网络中的实际路径
-
一些路由器不会对跟踪路由探测做出响应
-
由于路由变化,运行结果可能不同
-
ICMP 跟踪路由通常比 UDP 更有效
-
现代网络可能使用 ECMP(等成本多路径)路由
-
VPN 和代理会改变明显的路由
traceroute 命令对于网络诊断至关重要,有助于识别路由问题、网络性能问题和理解网络拓扑。
想要更多细节,请查看手册:man traceroute
nmcli 命令
nmcli 命令通过控制 NetworkManager(一个处理网络的后台守护进程)来管理网络连接,该命令代表网络管理器命令行界面。
安装:
nmcli 命令默认已安装在大多数 Linux 发行版中。要检查它是否已安装在您的系统上,请输入:
nmcli --version
如果您没有安装 nmcli,您可以使用包管理器进行安装:
Ubuntu 或 Debian:
sudo apt install network manager
这将在您的系统中安装 NetworkManager。现在我们必须启动网络管理服务。
sudo systemctl start NetworkManager
基于 Red Hat 的系统(如 Fedora、CentOS、REHL):
sudo dnf install NetworkManager
这将在您的系统中安装 NetworkManager。现在我们必须启动网络管理服务。
sudo systemctl start NetworkManager
Arch Linux:
sudo pacman -S networkmanager
这将在您的系统中安装 NetworkManager。现在我们必须启动网络管理服务。
sudo systemctl start NetworkManager
示例:
- 列出所有可用的 Wi-Fi 网络
nmcli device wifi list
- 查看网络状态
nmcli device status
- 连接到 Wi-Fi 网络
nmcli device wifi connect "SSID_NAME" password "YOUR_PASSWORD"
- 从 Wi-Fi 网络断开连接
nmcli connection down "CONNECTION_NAME"
- 打开/关闭 Wi-Fi
nmcli radio wifi on
nmcli radio wifi off
,分别。
- 打开/关闭蓝牙
nmcli radio bluetooth on
nmcli radio bluetooth off
,分别。
- 显示所有连接
nmcli connection show
- 显示特定连接的详细信息
nmcli connection show "CONNECTION_NAME"
语法:
nmcli 命令的一般语法如下:
nmcli [OPTIONS...] { help | general | networking | radio | connection | device | agent | monitor } [COMMAND] [ARGUMENTS...]
其他标志及其功能:
选项
| 短标志 | 长标志 | 描述 |
|---|---|---|
-a |
--ask |
nmcli 将停止并请求任何缺少的必需参数(不要用于非交互式选项) |
-c |
--color |
它控制颜色输出。yes 启用颜色,而 no 禁用颜色 |
-h |
--help |
打印帮助信息 |
-p |
--pretty |
这将导致 nmcli 生成更用户友好的输出,例如带有标题,并且值对齐 |
-v |
--version |
显示 nmcli 版本 |
-f |
--fields |
此选项用于指定应打印哪些字段。有效字段名称因特定命令而异。 |
-g |
--get-value |
此选项用于打印特定字段的值。它是 --mode tabular --terse --fields 的快捷方式 |
通用命令
| 命令 | 描述 |
|---|---|
nmcli general status |
显示 NetworkManager 的总体状态 |
nmcli general hostname |
显示当前主机名 |
网络命令
| 命令 | 描述 |
|---|---|
nmcli networking on |
启用所有网络 |
nmcli networking off |
禁用所有网络 |
nmcli networking connectivity |
检查网络连接状态 |
无线电命令
| 命令 | 描述 |
|---|---|
nmcli radio wifi on |
启用 Wi-Fi 无线电 |
nmcli radio wifi off |
禁用 Wi-Fi 无线电 |
nmcli radio all |
显示所有无线电开关的状态 |
nmcli radio wifi |
显示 Wi-Fi 无线电状态 |
连接管理命令
| 命令 | 描述 |
|---|---|
nmcli connection show |
列出所有已保存的连接配置文件 |
nmcli connection show --active |
仅列出活动连接 |
nmcli connection show "名称" |
显示特定连接的详细信息 |
nmcli connection up "名称" |
激活连接 |
nmcli connection down "名称" |
使连接失效 |
nmcli connection modify "名称" [选项] |
修改连接设置 |
nmcli connection delete "名称" |
删除连接配置文件 |
nmcli connection reload |
从磁盘重新加载所有连接文件 |
设备管理命令
| 命令 | 描述 |
|---|---|
nmcli device status |
显示所有设备的状态 |
nmcli device show "设备名称" |
显示特定设备的详细信息 |
nmcli device disconnect "设备名称" |
从设备断开连接 |
nmcli device wifi list |
列出所有可用的 Wi-Fi 网络 |
nmcli device wifi connect "SSID" password "密码" |
连接到受密码保护的 Wi-Fi |
badblocks命令
badblocks命令用于在存储设备上搜索坏块。它可以扫描硬盘驱动器、SSD、USB 驱动器和其它存储媒体,以识别无法可靠存储数据的扇区。这对于维护数据完整性和系统可靠性至关重要。
语法
badblocks [options] device [last-block] [first-block]
关键特性
-
非破坏性测试:默认为只读测试
-
破坏性测试:进行彻底检查的写测试
-
模式测试:使用特定模式来检测错误
-
进度报告:显示扫描进度和结果
-
输出选项:针对不同用例的多种格式
基本用法
简单读测试
# Basic read test (non-destructive)
sudo badblocks /dev/sdb
# Test specific partition
sudo badblocks /dev/sdb1
# Verbose output
sudo badblocks -v /dev/sdb
显示进度
# Show progress during scan
sudo badblocks -s /dev/sdb
# Show progress with verbose output
sudo badblocks -sv /dev/sdb
测试模式
1. 只读测试(默认)
# Non-destructive read test
sudo badblocks /dev/sdb
# Read test with verbose output
sudo badblocks -v /dev/sdb
# Read test showing progress
sudo badblocks -sv /dev/sdb
2. 非破坏性读写测试
# Non-destructive read-write test
sudo badblocks -n /dev/sdb
# Backup original data, test, then restore
sudo badblocks -nv /dev/sdb
3. 破坏性写测试
# WARNING: This will destroy all data!
sudo badblocks -w /dev/sdb
# Destructive test with verbose output
sudo badblocks -wv /dev/sdb
# Write test with progress
sudo badblocks -wsv /dev/sdb
常用选项
基本选项
# -v: Verbose output
sudo badblocks -v /dev/sdb
# -s: Show progress
sudo badblocks -s /dev/sdb
# -o: Output bad blocks to file
sudo badblocks -o badblocks.txt /dev/sdb
# -b: Specify block size (default 1024)
sudo badblocks -b 4096 /dev/sdb
高级选项
# -c: Number of blocks to test at once
sudo badblocks -c 65536 /dev/sdb
# -p: Number of passes (for write tests)
sudo badblocks -w -p 2 /dev/sdb
# -t: Test pattern for write tests
sudo badblocks -w -t 0xaa /dev/sdb
# -f: Force operation even if mounted
sudo badblocks -f /dev/sdb
实际示例
1. 基本驱动器健康检查
# Unmount the device first
sudo umount /dev/sdb1
# Run basic read test
sudo badblocks -sv /dev/sdb
# Save results to file
sudo badblocks -sv -o badblocks_sdb.txt /dev/sdb
2. 详尽的驱动器测试
# Full destructive test (destroys data!)# Make sure to backup first!
sudo badblocks -wsv /dev/sdb
# Multiple pass destructive test
sudo badblocks -wsv -p 3 /dev/sdb
3. 测试特定范围
# Test blocks 1000 to 2000
sudo badblocks -sv /dev/sdb 2000 1000
# Test first 1GB (assuming 4K blocks)
sudo badblocks -sv -b 4096 /dev/sdb 262144 0
4. 与 fsck 的集成
# Create bad blocks file
sudo badblocks -sv -o /tmp/badblocks /dev/sdb1
# Use with fsck to mark bad blocks
sudo fsck.ext4 -l /tmp/badblocks /dev/sdb1
# For new filesystem
sudo mke2fs -l /tmp/badblocks /dev/sdb1
不同的块大小
选择块大小
# 1KB blocks (default)
sudo badblocks -b 1024 /dev/sdb
# 4KB blocks (common for modern drives)
sudo badblocks -b 4096 /dev/sdb
# 512 byte blocks (traditional sector size)
sudo badblocks -b 512 /dev/sdb
# Match filesystem block size
sudo tune2fs -l /dev/sdb1 | grep "Block size"
sudo badblocks -b 4096 /dev/sdb1
测试模式
写测试模式
# Alternating pattern (0xaa = 10101010)
sudo badblocks -w -t 0xaa /dev/sdb
# All ones pattern
sudo badblocks -w -t 0xff /dev/sdb
# All zeros pattern
sudo badblocks -w -t 0x00 /dev/sdb
# Random pattern
sudo badblocks -w -t random /dev/sdb
多种模式
# Test with multiple patterns
sudo badblocks -w -t 0xaa -t 0x55 -t 0xff -t 0x00 /dev/sdb
# Four-pass test with different patterns
sudo badblocks -wsv -p 4 -t 0xaa -t 0x55 -t 0xff -t 0x00 /dev/sdb
输出和报告
标准输出
# Basic output (just bad block numbers)
sudo badblocks /dev/sdb
# Verbose output with details
sudo badblocks -v /dev/sdb
# Progress indicator
sudo badblocks -s /dev/sdb
将结果保存到文件
# Save bad blocks list
sudo badblocks -o badblocks.txt /dev/sdb
# Append to existing file
sudo badblocks -o badblocks.txt /dev/sdb >> all_badblocks.txt
# Save with verbose output to different files
sudo badblocks -v -o badblocks.txt /dev/sdb 2> scan_log.txt
与不同存储类型一起工作
1. 传统硬盘
# Standard test for HDDs
sudo badblocks -sv /dev/sda
# Thorough test with multiple passes
sudo badblocks -wsv -p 4 /dev/sda
2. 固态硬盘
# Read-only test (preferred for SSDs)
sudo badblocks -sv /dev/sdb
# Non-destructive test
sudo badblocks -nsv /dev/sdb
# Avoid excessive write tests on SSDs
3. USB 驱动器
# Test USB drive
sudo badblocks -sv /dev/sdc
# Fast test for quick verification
sudo badblocks -sv -c 65536 /dev/sdc
4. SD 卡
# Test SD card
sudo badblocks -sv /dev/mmcblk0
# Write test for fake capacity detection
sudo badblocks -wsv /dev/mmcblk0
与文件系统的集成
1. ext2/ext3/ext4
# Create filesystem with bad block check
sudo mke2fs -c /dev/sdb1
# Check existing filesystem
sudo fsck.ext4 -c /dev/sdb1
# Thorough check
sudo fsck.ext4 -cc /dev/sdb1
2. 与 e2fsck 一起使用
# Create bad blocks list
sudo badblocks -sv -o /tmp/badblocks /dev/sdb1
# Apply to filesystem
sudo e2fsck -l /tmp/badblocks /dev/sdb1
监控和自动化
1. 定期检查
# Create script for regular checking#!/bin/bash
DEVICE="/dev/sdb"
LOGFILE="/var/log/badblocks_$(date +%Y%m%d).log"
sudo badblocks -sv -o /tmp/badblocks "$DEVICE" > "$LOGFILE" 2>&1
if [ -s /tmp/badblocks ]; then
echo "Bad blocks found on $DEVICE!" | mail -s "Bad Blocks Alert" admin@domain.com
fi
2. SMART 集成
# Check SMART status first
sudo smartctl -a /dev/sdb
# Run badblocks if SMART shows issues
sudo smartctl -t short /dev/sdb
sleep 300
sudo smartctl -a /dev/sdb
sudo badblocks -sv /dev/sdb
性能考虑
1. 速度优化
# Increase block count for faster scanning
sudo badblocks -c 65536 /dev/sdb
# Use larger block size
sudo badblocks -b 4096 -c 16384 /dev/sdb
# Combine options for maximum speed
sudo badblocks -sv -b 4096 -c 65536 /dev/sdb
2. 系统影响
# Run with lower priority
sudo nice -n 19 badblocks -sv /dev/sdb
# Limit I/O impact
sudo ionice -c 3 badblocks -sv /dev/sdb
# Combine nice and ionice
sudo nice -n 19 ionice -c 3 badblocks -sv /dev/sdb
结果解读
1. 无坏块
# Output: "Pass completed, 0 bad blocks found."
# This indicates a healthy drive
2. 发现坏块
# Output shows block numbers of bad sectors
# Example:
# Pass completed, 5 bad blocks found. (0/0/5 errors)
# 1024
# 2048
# 4096
# 8192
# 16384
3. 理解块号
# Convert block numbers to byte offsets
# Block 1024 with 4KB block size = 1024 * 4096 = 4,194,304 bytes
# This helps locate physical position on drive
故障排除
1. 权限拒绝
# Must run as root
sudo badblocks /dev/sdb
# Check device permissions
ls -l /dev/sdb
2. 设备忙碌
# Unmount all partitions first
sudo umount /dev/sdb1
sudo umount /dev/sdb2
# Check for active processes
lsof /dev/sdb*
# Use force option if necessary
sudo badblocks -f /dev/sdb
3. 慢速性能
# Increase block count
sudo badblocks -c 65536 /dev/sdb
# Use appropriate block size
sudo badblocks -b 4096 /dev/sdb
# Check system load
iostat 1
安全考虑
1. 数据备份
# Always backup before destructive tests
sudo dd if=/dev/sdb of=/backup/sdb_backup.img bs=1M
# Or use filesystem-level backup
sudo rsync -av /mount/point/ /backup/location/
2. 驱动器健康评估
# Check SMART data first
sudo smartctl -a /dev/sdb
# Look for reallocated sectors
sudo smartctl -A /dev/sdb | grep Reallocated
3. 何时更换驱动器
# Replace if:
# - Many bad blocks found (>50-100)
# - Bad blocks increasing over time
# - SMART indicates drive failure
# - Critical system drive affected
替代工具
1. SMART 工具
# Use smartctl for health monitoring
sudo smartctl -t long /dev/sdb
sudo smartctl -a /dev/sdb
2. 厂商工具
# Many manufacturers provide specific tools
# - Western Digital: WD Data Lifeguard
# - Seagate: SeaTools
# - Samsung: Samsung Magician
重要注意事项
-
读测试是安全且非破坏性的
-
写测试会破坏设备上的所有数据
-
在测试前始终卸载设备
-
应将测试结果与其他健康指标一起解读
-
定期测试有助于防止数据丢失
-
如果发现许多坏块,应考虑更换驱动器
-
现代驱动器有备用扇区用于坏块管理
badblocks命令是维护存储设备健康和防止数据丢失的必备工具。
更多详细信息,请查看手册:man badblocks
fsck 命令
fsck(文件系统检查)命令用于检查和修复 Linux 文件系统。它可以检测和修复各种文件系统不一致性、损坏问题和结构问题。它是维护文件系统完整性和从系统崩溃中恢复的必备工具。
语法
fsck [options] [filesystem...]
关键特性
-
多种文件系统支持:支持 ext2, ext3, ext4, XFS 等
-
自动检测:可以自动检测文件系统类型
-
交互式修复:在修复前提示确认
-
批处理模式:可以在没有用户交互的情况下自动运行
-
只读模式:检查而不做更改
基本用法
简单文件系统检查
# Check specific partition
sudo fsck /dev/sdb1
# Check by mount point
sudo fsck /home
# Check with verbose output
sudo fsck -v /dev/sdb1
检查所有文件系统
# Check all file systems in /etc/fstab
sudo fsck -A
# Check all except root
sudo fsck -AR
# Check all with progress
sudo fsck -AV
常见选项
基本选项
# -y: Answer "yes" to all questions
sudo fsck -y /dev/sdb1
# -n: Answer "no" to all questions (read-only)
sudo fsck -n /dev/sdb1
# -f: Force check even if file system seems clean
sudo fsck -f /dev/sdb1
# -v: Verbose output
sudo fsck -v /dev/sdb1
高级选项
# -p: Automatically repair (preen mode)
sudo fsck -p /dev/sdb1
# -r: Interactive repair mode
sudo fsck -r /dev/sdb1
# -t: Specify file system type
sudo fsck -t ext4 /dev/sdb1
# -C: Show progress bar
sudo fsck -C /dev/sdb1
文件系统特定命令
1. ext2/ext3/ext4 (e2fsck)
# Check ext4 file system
sudo fsck.ext4 /dev/sdb1
# Force check
sudo e2fsck -f /dev/sdb1
# Fix bad blocks
sudo e2fsck -c /dev/sdb1
# Thorough check with bad block scan
sudo e2fsck -cc /dev/sdb1
2. XFS (xfs_repair)
# Check XFS file system (read-only)
sudo xfs_repair -n /dev/sdb1
# Repair XFS file system
sudo xfs_repair /dev/sdb1
# Verbose repair
sudo xfs_repair -v /dev/sdb1
3. FAT32 (fsck.fat)
# Check FAT32 file system
sudo fsck.fat /dev/sdb1
# Repair FAT32
sudo fsck.fat -r /dev/sdb1
# Verbose check
sudo fsck.fat -v /dev/sdb1
实际示例
1. 在挂载前检查
# Always check before mounting suspicious drives
sudo fsck -n /dev/sdb1
# If clean, mount normally
sudo mount /dev/sdb1 /mnt/usb
# If errors found, repair first
sudo fsck -y /dev/sdb1
sudo mount /dev/sdb1 /mnt/usb
2. 系统崩溃后的恢复
# Boot from live CD/USB# Check root file system
sudo fsck -f /dev/sda1
# Check other partitions
sudo fsck -f /dev/sda2
sudo fsck -f /dev/sda3
# Reboot if repairs were made
sudo reboot
3. 定期维护
# Force check on all file systems
sudo fsck -Af
# Check with automatic repair
sudo fsck -Ap
# Check with progress indicators
sudo fsck -AVC
处理不同场景
1. 只读检查
# Check without making changes
sudo fsck -n /dev/sdb1
# Verbose read-only check
sudo fsck -nv /dev/sdb1
# Generate report only
sudo fsck -n /dev/sdb1 > fsck_report.txt 2>&1
2. 自动修复
# Repair automatically (dangerous!)
sudo fsck -y /dev/sdb1
# Safer automatic repair
sudo fsck -p /dev/sdb1
# Batch mode for multiple file systems
sudo fsck -Ap
3. 交互式修复
# Interactive mode (default)
sudo fsck /dev/sdb1
# Ask before each fix
sudo fsck -r /dev/sdb1
# Show detailed information
sudo fsck -rv /dev/sdb1
启动时文件系统检查
1. 自动检查
# Configure automatic checks in /etc/fstab
# Sixth field controls fsck behavior:
# 0 = no check
# 1 = check first (root filesystem)
# 2 = check after root filesystem
# Example /etc/fstab entry:
# /dev/sda1 / ext4 defaults 1 1
# /dev/sda2 /home ext4 defaults 1 2
2. 在下一次启动时强制检查
# Create forcefsck file (traditional method)
sudo touch /forcefsck
# Or use tune2fs for ext filesystems
sudo tune2fs -C 1 -c 1 /dev/sda1
# Set maximum mount count
sudo tune2fs -c 30 /dev/sda1
3. 检查间隔
# Set check interval (ext filesystems)
sudo tune2fs -i 30d /dev/sda1 # Check every 30 days
sudo tune2fs -i 0 /dev/sda1 # Disable time-based checks
# Set mount count interval
sudo tune2fs -c 25 /dev/sda1 # Check every 25 mounts
sudo tune2fs -c 0 /dev/sda1 # Disable mount-based checks
常见问题故障排除
1. 无法卸载的文件系统
# Try read-only check first
sudo fsck -n /dev/sdb1
# If errors found, try repair
sudo fsck -y /dev/sdb1
# For severe corruption
sudo fsck -f /dev/sdb1
2. 超级块损坏
# List backup superblocks
sudo mke2fs -n /dev/sdb1
# Use backup superblock
sudo e2fsck -b 32768 /dev/sdb1
# Try different backup
sudo e2fsck -b 98304 /dev/sdb1
3. Lost+Found 目录
# Recovered files appear in lost+found
ls -la /mnt/partition/lost+found/
# Files are numbered by inode
# Use file command to identify type
file /mnt/partition/lost+found/*
# Restore files based on content
高级修复选项
1. 损坏块处理
# Scan for bad blocks during check
sudo e2fsck -c /dev/sdb1
# Thorough bad block scan
sudo e2fsck -cc /dev/sdb1
# Use existing bad block list
sudo badblocks -sv /dev/sdb1 > badblocks.list
sudo e2fsck -l badblocks.list /dev/sdb1
2. 日志恢复
# ext3/ext4 journal recovery
sudo e2fsck -y /dev/sdb1
# Force journal recovery
sudo tune2fs -O ^has_journal /dev/sdb1
sudo e2fsck -f /dev/sdb1
sudo tune2fs -j /dev/sdb1
3. Inode 问题
# Check inode usage
sudo e2fsck -D /dev/sdb1
# Rebuild directory index
sudo e2fsck -D -f /dev/sdb1
# Fix inode count problems
sudo e2fsck -f /dev/sdb1
监控和日志记录
1. 检查结果
# View fsck results
dmesg | grep -i fsck
# Check system logs
journalctl | grep fsck
tail -f /var/log/messages | grep fsck
2. 文件系统状态
# Check filesystem status
sudo tune2fs -l /dev/sda1 | grep -i "filesystem state"
# Check last fsck time
sudo tune2fs -l /dev/sda1 | grep -i "last checked"
# Check mount count
sudo tune2fs -l /dev/sda1 | grep -i "mount count"
3. 自动监控
# Script to check filesystem health#!/bin/bashfor fs in $(awk '$3 ~ /^ext[234]$/ && $2 != "/" {print $1}' /etc/fstab); do
echo "Checking $fs..."
sudo fsck -n "$fs" || echo "Errors found on $fs"
done
预防和最佳实践
1. 定期维护
# Schedule regular checks
# Add to crontab for non-critical systems
# 0 3 * * 0 /sbin/fsck -Ap > /var/log/fsck.log 2>&1
2. 正确关机
# Always shutdown properly
sudo shutdown -h now
# Use sync before emergency shutdown
sync
sudo shutdown -h now
3. UPS 保护
# Install UPS monitoring
sudo apt install apcupsd # For APC UPS
sudo apt install nut # Network UPS Tools
# Configure automatic shutdown on power loss
恢复场景
1. 启动失败
# Boot from live USB/CD# Mount root filesystem read-only
sudo mount -o ro /dev/sda1 /mnt
# Copy important data
sudo cp -r /mnt/home/user/important /backup/
# Unmount and check
sudo umount /mnt
sudo fsck -f /dev/sda1
2. 数据恢复
# Use ddrescue for severely damaged drives
sudo ddrescue /dev/sdb /backup/disk.img /backup/disk.log
# Then fsck the image
sudo fsck -f /backup/disk.img
# Mount and recover data
sudo mount -o loop /backup/disk.img /mnt/recovery
3. 多个错误
# Progressive repair approach
sudo fsck -n /dev/sdb1 # Check first
sudo fsck -p /dev/sdb1 # Auto-repair safe issues
sudo fsck -y /dev/sdb1 # Force repair remaining issues
sudo fsck -f /dev/sdb1 # Final thorough check
性能考虑
1. 速度优化
# Use progress indicator
sudo fsck -C /dev/sdb1
# Parallel checking (careful with dependencies)
sudo fsck -A -P
# Skip time-consuming checks when appropriate
sudo fsck -p /dev/sdb1
2. 系统影响
# Run during low-activity periods# Schedule during maintenance windows# Use ionice for lower priority
sudo ionice -c 3 fsck /dev/sdb1
重要安全提示
-
始终在检查前卸载文件系统
-
在修复前备份重要数据
-
在操作期间切勿中断 fsck
-
首先使用只读模式来评估损坏情况
-
理解自动修复模式的风险
-
从可启动介质启动以检查根文件系统
-
在开始修复前准备好恢复计划
退出代码
# fsck exit codes:
# 0: No errors
# 1: Filesystem errors corrected
# 2: System should be rebooted
# 4: Filesystem errors left uncorrected
# 8: Operational error
# 16: Usage or syntax error
# 32: Checking canceled by user request
# 128: Shared-library error
fsck 命令对于维护文件系统完整性和从损坏问题中恢复至关重要。
更多详细信息,请查看手册:man fsck
mkfs命令
mkfs(创建文件系统)命令用于在存储设备上创建文件系统。它使用特定的文件系统类型(如 ext4、XFS、FAT32 等)格式化分区或整个磁盘。这对于为 Linux 系统准备存储设备是必不可少的。
语法
mkfs [options] [-t type] device
mkfs.type [options] device
关键特性
-
多种文件系统支持:ext2/3/4、XFS、FAT32、NTFS 等
-
自定义参数:块大小、inode 比率、标签和特性
-
快速格式化与完整格式化:快速格式化或彻底初始化
-
高级选项:加密、压缩和性能调整
基本用法
创建文件系统
# Auto-detect and create default filesystem
sudo mkfs /dev/sdb1
# Specify filesystem type
sudo mkfs -t ext4 /dev/sdb1
# Direct filesystem creation
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.xfs /dev/sdb2
sudo mkfs.fat /dev/sdb3
常见文件系统类型
# ext4 (recommended for Linux)
sudo mkfs.ext4 /dev/sdb1
# XFS (good for large files)
sudo mkfs.xfs /dev/sdb1
# FAT32 (cross-platform compatibility)
sudo mkfs.fat -F32 /dev/sdb1
# NTFS (Windows compatibility)
sudo mkfs.ntfs /dev/sdb1
文件系统特定选项
1. ext4 文件系统
# Basic ext4 creation
sudo mkfs.ext4 /dev/sdb1
# With label
sudo mkfs.ext4 -L MyData /dev/sdb1
# Custom block size
sudo mkfs.ext4 -b 4096 /dev/sdb1
# Custom inode ratio
sudo mkfs.ext4 -i 4096 /dev/sdb1
# With journal
sudo mkfs.ext4 -J size=128 /dev/sdb1
高级 ext4 选项
# Disable journaling (ext2-like)
sudo mkfs.ext4 -O ^has_journal /dev/sdb1
# Enable encryption support
sudo mkfs.ext4 -O encrypt /dev/sdb1
# Set reserved blocks percentage
sudo mkfs.ext4 -m 1 /dev/sdb1
# Custom UUID
sudo mkfs.ext4 -U 12345678-1234-1234-1234-123456789012 /dev/sdb1
2. XFS 文件系统
# Basic XFS creation
sudo mkfs.xfs /dev/sdb1
# Force creation (overwrite existing)
sudo mkfs.xfs -f /dev/sdb1
# With label
sudo mkfs.xfs -L MyXFS /dev/sdb1
# Custom block size
sudo mkfs.xfs -b size=4096 /dev/sdb1
# Custom sector size
sudo mkfs.xfs -s size=4096 /dev/sdb1
高级 XFS 选项
# Separate log device
sudo mkfs.xfs -l logdev=/dev/sdc1 /dev/sdb1
# Real-time device
sudo mkfs.xfs -r rtdev=/dev/sdd1 /dev/sdb1
# Custom inode size
sudo mkfs.xfs -i size=512 /dev/sdb1
# Allocation group size
sudo mkfs.xfs -d agcount=8 /dev/sdb1
3. FAT32 文件系统
# Basic FAT32 creation
sudo mkfs.fat -F32 /dev/sdb1
# With label
sudo mkfs.fat -F32 -n USBDRIVE /dev/sdb1
# Custom cluster size
sudo mkfs.fat -F32 -s 8 /dev/sdb1
# Custom volume ID
sudo mkfs.fat -F32 -i 12345678 /dev/sdb1
4. NTFS 文件系统
# Basic NTFS creation
sudo mkfs.ntfs /dev/sdb1
# Quick format
sudo mkfs.ntfs -Q /dev/sdb1
# With label
sudo mkfs.ntfs -L WindowsData /dev/sdb1
# Custom cluster size
sudo mkfs.ntfs -c 4096 /dev/sdb1
实际示例
1. 准备 USB 驱动器
# Check device name
lsblk
# Create partition table (if needed)
sudo fdisk /dev/sdc
# or
sudo cfdisk /dev/sdc
# Format with FAT32 for compatibility
sudo mkfs.fat -F32 -n MYUSB /dev/sdc1
# Mount and test
sudo mkdir /mnt/usb
sudo mount /dev/sdc1 /mnt/usb
2. 设置数据驱动器
# Create ext4 with optimal settings
sudo mkfs.ext4 -L DataDrive -b 4096 -m 1 /dev/sdb1
# Create mount point
sudo mkdir /mnt/data
# Add to fstab for automatic mounting
echo "LABEL=DataDrive /mnt/data ext4 defaults 0 2" | sudo tee -a /etc/fstab
# Mount
sudo mount /mnt/data
3. 高性能存储
# XFS for large files and high performance
sudo mkfs.xfs -f -L HighPerf -b size=4096 -d agcount=8 /dev/sdb1
# Or ext4 with performance optimizations
sudo mkfs.ext4 -L HighPerf -b 4096 -E stride=32,stripe-width=64 /dev/sdb1
4. SSD 优化
# ext4 for SSD with TRIM support
sudo mkfs.ext4 -L SSD -b 4096 -E discard /dev/sdb1
# XFS for SSD
sudo mkfs.xfs -f -L SSD -K /dev/sdb1
# Add discard option in fstab
# /dev/sdb1 /mnt/ssd ext4 defaults,discard 0 2
高级配置
1. 大型文件系统
# ext4 for very large filesystems
sudo mkfs.ext4 -T largefile4 /dev/sdb1
# XFS with optimizations for large files
sudo mkfs.xfs -f -i size=512 -d agcount=32 /dev/sdb1
# Increase inode ratio for many small files
sudo mkfs.ext4 -T small /dev/sdb1
2. RAID 配置
# ext4 for RAID arrays
sudo mkfs.ext4 -b 4096 -E stride=16,stripe-width=32 /dev/md0
# XFS for RAID
sudo mkfs.xfs -f -d su=64k,sw=2 /dev/md0
# Where:
# stride = (chunk-size / block-size)
# stripe-width = (number-of-data-disks * stride)
3. 加密支持
# ext4 with encryption
sudo mkfs.ext4 -O encrypt /dev/sdb1
# Setup LUKS encryption first
sudo cryptsetup luksFormat /dev/sdb1
sudo cryptsetup open /dev/sdb1 encrypted_disk
sudo mkfs.ext4 /dev/mapper/encrypted_disk
备份和安全
1. 格式化前检查
# Verify device
lsblk /dev/sdb
fdisk -l /dev/sdb
# Check for mounted filesystems
mount | grep /dev/sdb
lsof /dev/sdb*
# Backup important data
sudo dd if=/dev/sdb of=/backup/sdb_backup.img bs=1M
2. 分区表备份
# Backup partition table
sudo sfdisk -d /dev/sdb > sdb_partition_table.txt
# Restore if needed
sudo sfdisk /dev/sdb < sdb_partition_table.txt
3. 使用前测试
# Create filesystem
sudo mkfs.ext4 /dev/sdb1
# Mount and test
sudo mkdir /mnt/test
sudo mount /dev/sdb1 /mnt/test
# Basic functionality test
echo "test" | sudo tee /mnt/test/testfile
cat /mnt/test/testfile
sudo rm /mnt/test/testfile
# Unmount
sudo umount /mnt/test
故障排除
1. 设备忙碌错误
# Check what's using the device
lsof /dev/sdb1
fuser -v /dev/sdb1
# Unmount if mounted
sudo umount /dev/sdb1
# Kill processes if necessary
sudo fuser -k /dev/sdb1
2. 空间不足
# Check available space
fdisk -l /dev/sdb
# Verify partition size
cat /proc/partitions
# Check for existing filesystems
file -s /dev/sdb1
3. 权限问题
# Must run as root
sudo mkfs.ext4 /dev/sdb1
# Check device permissions
ls -l /dev/sdb1
# Add user to disk group if needed
sudo usermod -a -G disk username
性能优化
1. 块大小选择
# For small files (default: 4096)
sudo mkfs.ext4 -b 1024 /dev/sdb1
# For large files
sudo mkfs.ext4 -b 4096 /dev/sdb1
# For very large files (ext4 only)
sudo mkfs.ext4 -b 65536 /dev/sdb1
2. Inode 配置
# More inodes for many small files
sudo mkfs.ext4 -i 1024 /dev/sdb1
# Fewer inodes for large files
sudo mkfs.ext4 -i 16384 /dev/sdb1
# Fixed number of inodes
sudo mkfs.ext4 -N 1000000 /dev/sdb1
3. 日志优化
# Large journal for write-heavy workloads
sudo mkfs.ext4 -J size=128 /dev/sdb1
# External journal device
sudo mkfs.ext4 -J device=/dev/sdc1 /dev/sdb1
# Disable journal for read-only media
sudo mkfs.ext4 -O ^has_journal /dev/sdb1
专用用例
1. 可启动媒体
# FAT32 for UEFI boot
sudo mkfs.fat -F32 -n BOOT /dev/sdb1
# ext4 for Linux boot
sudo mkfs.ext4 -L BOOT /dev/sdb2
# Install bootloader after filesystem creation
2. 网络存储
# XFS for NFS exports
sudo mkfs.xfs -f -L NFSSHARE /dev/sdb1
# ext4 for Samba shares
sudo mkfs.ext4 -L SAMBA /dev/sdb1
3. 容器存储
# ext4 with specific features for containers
sudo mkfs.ext4 -O project -L CONTAINERS /dev/sdb1
# XFS with project quotas
sudo mkfs.xfs -f -i size=512 /dev/sdb1
监控和验证
1. 文件系统信息
# ext4 information
sudo tune2fs -l /dev/sdb1
# XFS information
sudo xfs_info /dev/sdb1
# General filesystem info
df -T /mnt/mountpoint
2. 健康检查
# Check filesystem after creation
sudo fsck -n /dev/sdb1
# Mount and verify
sudo mount /dev/sdb1 /mnt/test
sudo df -h /mnt/test
sudo ls -la /mnt/test
最佳实践
1. 规划
# Determine optimal filesystem type based on use case:
# - ext4: General purpose, good for most Linux use cases
# - XFS: Large files, high performance, NAS/database storage
# - FAT32: Cross-platform compatibility, small devices
# - NTFS: Windows compatibility
2. 标签
# Always use descriptive labels
sudo mkfs.ext4 -L "SystemData" /dev/sdb1
sudo mkfs.xfs -L "MediaStorage" /dev/sdb2
sudo mkfs.fat -F32 -n "BACKUP" /dev/sdb3
3. 文档
# Document filesystem configurationecho "Created: $(date)" > /root/filesystem_log.txt
echo "Device: /dev/sdb1" >> /root/filesystem_log.txt
echo "Type: ext4" >> /root/filesystem_log.txt
echo "Label: DataDrive" >> /root/filesystem_log.txt
重要注意事项
-
在格式化前始终备份数据
-
仔细验证设备名称以避免数据丢失
-
在格式化前卸载文件系统
-
为您的用例选择合适的文件系统
-
在选择选项时考虑性能要求
-
创建后测试文件系统
-
为将来参考记录配置
mkfs命令对于准备存储设备是基本的,应该在使用时仔细考虑需求和安全性程序。
更多详细信息,请查看手册:man mkfs
cpio 命令
cpio (输入,输出) 命令是一个多功能的归档工具,可以创建和提取归档,复制文件,并处理特殊文件类型。它特别适用于系统备份、创建 initramfs 图像和与磁带归档一起工作。
语法
cpio [options] < name-list
cpio [options] -i [patterns] < archive
cpio [options] -o > archive
cpio [options] -p destination-directory
操作模式
1. 输出模式 (-o)
# Create archive from file list
find . -name "*.txt" | cpio -o > archive.cpio
# Create compressed archive
find . -type f | cpio -o | gzip > archive.cpio.gz
# Verbose output
find . -name "*.conf" | cpio -ov > config_backup.cpio
2. 输入模式 (-i)
# Extract archive
cpio -i < archive.cpio
# Extract to specific directory
cd /restore && cpio -i < /backup/archive.cpio
# Extract specific files
cpio -i "*.txt" < archive.cpio
3. 透明模式 (-p)
# Copy files to another directory
find /source -type f | cpio -p /destination
# Preserve attributes while copying
find /etc -name "*.conf" | cpio -pdm /backup/configs
常用选项
基本选项
# -o: Copy-out (create archive)
find . | cpio -o > archive.cpio
# -i: Copy-in (extract archive)
cpio -i < archive.cpio
# -p: Pass-through (copy files)
find . | cpio -p /destination
# -v: Verbose output
find . | cpio -ov > archive.cpio
# -t: List archive contents
cpio -tv < archive.cpio
高级选项
# -d: Create directories as needed
cpio -id < archive.cpio
# -m: Preserve modification times
cpio -im < archive.cpio
# -u: Unconditional extraction (overwrite)
cpio -iu < archive.cpio
# -H: Specify archive format
cpio -oH newc > archive.cpio
# -B: Use 5120-byte blocks
cpio -oB > archive.cpio
归档格式
可用格式
# Binary format (default, obsolete)
cpio -o > archive.cpio
# New ASCII format (recommended)
cpio -oH newc > archive.cpio
# Old ASCII format
cpio -oH odc > archive.cpio
# CRC format
cpio -oH crc > archive.cpio
# TAR format
cpio -oH tar > archive.tar
# USTAR format
cpio -oH ustar > archive.tar
实际示例
1. 系统备份
# Backup entire system (excluding certain directories)
find / -path /proc -prune -o -path /sys -prune -o -path /dev -prune -o -print | \
sudo cpio -oH newc | gzip > system_backup.cpio.gz
# Backup specific directories
find /etc /home /var -type f | cpio -oH newc > important_files.cpio
# Backup with verbose output
find /home/user -type f | cpio -ovH newc > user_backup.cpio
2. 创建 initramfs
# Create initramfs image (common in Linux boot process)cd /tmp/initramfs
find . | cpio -oH newc | gzip > /boot/initramfs.img
# Extract existing initramfs
cd /tmp/extract
zcat /boot/initramfs.img | cpio -id
3. 选择性文件操作
# Archive only configuration files
find /etc -name "*.conf" -o -name "*.cfg" | cpio -oH newc > configs.cpio
# Archive files modified in last 7 days
find /home -type f -mtime -7 | cpio -oH newc > recent_files.cpio
# Archive files larger than 1MB
find /var/log -type f -size +1M | cpio -oH newc > large_logs.cpio
4. 与压缩归档一起工作
# Create compressed archive
find . -type f | cpio -oH newc | gzip > archive.cpio.gz
find . -type f | cpio -oH newc | bzip2 > archive.cpio.bz2
find . -type f | cpio -oH newc | xz > archive.cpio.xz
# Extract compressed archives
zcat archive.cpio.gz | cpio -id
bzcat archive.cpio.bz2 | cpio -id
xzcat archive.cpio.xz | cpio -id
特殊文件类型
1. 设备文件和特殊文件
# Archive including device files
find /dev -type c -o -type b | sudo cpio -oH newc > device_files.cpio
# Archive symbolic links
find . -type l | cpio -oH newc > symlinks.cpio
# Archive with all file types preserved
find . | sudo cpio -oH newc > complete_backup.cpio
2. 保留属性
# Preserve ownership and permissions
find . | sudo cpio -oH newc > backup.cpio
sudo cpio -idm < backup.cpio
# Preserve modification times
cpio -im < archive.cpio
# Preserve all attributes in pass-through mode
find /source | sudo cpio -pdm /destination
文件过滤和选择
1. 模式匹配
# Extract specific file patterns
cpio -i "*.txt" "*.conf" < archive.cpio
# Extract files in specific directory
cpio -i "etc/*" < archive.cpio
# Extract with shell globbing
cpio -i "*backup*" < archive.cpio
2. 排除模式
# Create archive excluding certain files
find . -type f ! -name "*.tmp" ! -name "*.log" | cpio -oH newc > clean_archive.cpio
# Use grep to filter
find . -type f | grep -v -E '\.(tmp|log|cache)$' | cpio -oH newc > filtered.cpio
网络操作
1. 远程备份
# Send archive over network
find /home | cpio -oH newc | ssh user@remote "cat > backup.cpio"
# Compressed network backup
find /data | cpio -oH newc | gzip | ssh user@remote "cat > data_backup.cpio.gz"
# Receive archive from network
ssh user@remote "cat backup.cpio" | cpio -id
2. 磁带操作
# Write to tape device
find /home | cpio -oH newc > /dev/st0
# Read from tape
cpio -itv < /dev/st0 # List contents
cpio -id < /dev/st0 # Extract
# Multi-volume archives
find /large_dataset | cpio -oH newc --split-at=700M > /dev/st0
归档管理
1. 列出归档内容
# List all files in archive
cpio -tv < archive.cpio
# List with detailed information
cpio -itv < archive.cpio
# Count files in archive
cpio -it < archive.cpio | wc -l
# Search for specific files
cpio -it < archive.cpio | grep "filename"
2. 验证归档
# Test archive integrity
cpio -it < archive.cpio > /dev/null
# Compare with filesystem
find . | cpio -oH newc | cpio -it | sort > archive_list.txt
find . | sort > filesystem_list.txt
diff archive_list.txt filesystem_list.txt
3. 更新归档
# Append to existing archive (not directly supported)# Workaround: extract, add files, recreate
mkdir /tmp/archive_work
cd /tmp/archive_work
cpio -id < /path/to/archive.cpio
# Add new files
find . | cpio -oH newc > /path/to/new_archive.cpio
性能优化
1. 块大小调整
# Use larger block size for better performance
cpio -oB > archive.cpio # 5120 bytes
cpio -o --block-size=32768 > archive.cpio # 32KB blocks
# For tape drives
cpio -o --block-size=65536 > /dev/st0 # 64KB blocks
2. 压缩策略
# Different compression methods
find . | cpio -oH newc | gzip -1 > fast_compress.cpio.gz # Fast
find . | cpio -oH newc | gzip -9 > best_compress.cpio.gz # Best ratio
find . | cpio -oH newc | lz4 > lz4_compress.cpio.lz4 # Very fast
find . | cpio -oH newc | xz -9 > xz_compress.cpio.xz # Best ratio
3. 并行处理
# Use parallel compression
find . | cpio -oH newc | pigz > parallel_compressed.cpio.gz
# Parallel decompression
pigz -dc archive.cpio.gz | cpio -id
与其他工具的集成
1. 与 find 结合
# Complex find expressions
find /var/log -name "*.log" -size +10M -mtime +30 | cpio -oH newc > old_large_logs.cpio
# Execute commands during find
find . -name "*.txt" -exec grep -l "important" {} \; | cpio -oH newc > important_texts.cpio
2. 与 rsync 结合
# Create incremental backups
rsync -av --link-dest=/backup/previous /source/ /backup/current/
find /backup/current -type f | cpio -oH newc > incremental.cpio
3. 与 tar 兼容
# Convert tar to cpio
tar -cf - files | cpio -oH tar > archive.tar
# Convert cpio to tar
cpio -it < archive.cpio | tar -cf archive.tar -T -
故障排除
1. 常见错误
# "Premature end of file" error# Check if archive is complete or corrupted
file archive.cpio
# Permission denied errors
# Use sudo for system files
sudo cpio -id < archive.cpio
# "Cannot create directory" errors
# Use -d option
cpio -id < archive.cpio
2. 调试
# Verbose mode for debugging
cpio -idv < archive.cpio
# Check archive format
file archive.cpio
hexdump -C archive.cpio | head
# Test archive before extraction
cpio -it < archive.cpio > /dev/null
echo $? # Should return 0 for success
3. 恢复
# Partial archive recovery
dd if=damaged_archive.cpio of=partial.cpio bs=512 count=1000
cpio -id < partial.cpio
# Skip damaged portions
cpio -id --only-verify-crc < archive.cpio
脚本和自动化
1. 备份脚本
#!/bin/bash# Automated backup script
BACKUP_DIR="/backup/$(date +%Y%m%d)"
SOURCE="/home /etc /var/log"
mkdir -p "$BACKUP_DIR"
for dir in $SOURCE; do
find "$dir" -type f | cpio -oH newc | gzip > "$BACKUP_DIR/$(basename $dir).cpio.gz"
done
2. 恢复脚本
#!/bin/bash# Automated restoration script
ARCHIVE="$1"
DEST="${2:-/restore}"
if [ ! -f "$ARCHIVE" ]; then
echo "Archive not found: $ARCHIVE"
exit 1
fi
mkdir -p "$DEST"
cd "$DEST"
if [[ "$ARCHIVE" =~ \.gz$ ]]; then
zcat "$ARCHIVE" | cpio -idm
else
cpio -idm < "$ARCHIVE"
fi
最佳实践
1. 归档命名
# Use descriptive names with dates
backup_$(hostname)_$(date +%Y%m%d_%H%M%S).cpio.gz
# Include source information
home_backup_$(date +%Y%m%d).cpio
etc_configs_$(date +%Y%m%d).cpio
2. 验证
# Always verify critical archives
find /important | cpio -oH newc > critical.cpio
cpio -it < critical.cpio | wc -l
find /important | wc -l
3. 文档
# Document archive contents
cpio -itv < archive.cpio > archive_contents.txt
echo "Created: $(date)" >> archive_info.txt
echo "Source: /path/to/source" >> archive_info.txt
重要注意事项
-
选择合适的格式:使用
newc格式适用于现代系统 -
保留权限:使用
-m并以适当的用户运行 -
测试归档:始终验证归档完整性
-
使用压缩:与 gzip/bzip2/xz 结合以实现空间效率
-
处理特殊文件:小心处理设备文件和符号链接
-
网络安全:使用安全通道进行远程操作
-
备份策略:定期备份并进行验证
cpio 命令在创建灵活的归档和系统备份方面非常强大,尤其是在与 find 和压缩工具结合使用时。
更多详细信息,请查看手册:man cpio
lsb_release命令
lsb_release命令显示有关 Linux 标准基(LSB)和特定于发行版的信息。它提供了有关 Linux 发行版版本、代号和其他识别信息的详细信息。
语法
lsb_release [options]
关键特性
-
发行版信息:名称、版本、代号
-
LSB 合规性:显示 LSB 版本支持
-
标准格式:跨发行版的统一输出
-
脚本友好:易于解析输出
基本用法
显示所有信息
# Display all available information
lsb_release -a
# Example output:
# Distributor ID: Ubuntu
# Description: Ubuntu 22.04.1 LTS
# Release: 22.04
# Codename: jammy
单个信息
# Distribution ID only
lsb_release -i
# Release version only
lsb_release -r
# Codename only
lsb_release -c
# Description only
lsb_release -d
常见选项
基本选项
# -a: Show all information
lsb_release -a
# -i: Distributor ID
lsb_release -i
# -d: Description
lsb_release -d
# -r: Release number
lsb_release -r
# -c: Codename
lsb_release -c
输出格式选项
# -s: Short format (no field names)
lsb_release -a -s
# Example output:
# Ubuntu
# Ubuntu 22.04.1 LTS
# 22.04
# jammy
# Individual fields in short format
lsb_release -i -s # Output: Ubuntu
lsb_release -r -s # Output: 22.04
lsb_release -c -s # Output: jammy
实际示例
1. 系统识别
# Get distribution name
DISTRO=$(lsb_release -i -s)
echo "Running on: $DISTRO"
# Get version
VERSION=$(lsb_release -r -s)
echo "Version: $VERSION"
# Get codename
CODENAME=$(lsb_release -c -s)
echo "Codename: $CODENAME"
2. 条件脚本
#!/bin/bash# Script that behaves differently based on distribution
DISTRO=$(lsb_release -i -s)
VERSION=$(lsb_release -r -s)
case $DISTRO in
"Ubuntu")
echo "Ubuntu detected, version $VERSION"
if [[ "$VERSION" == "22.04" ]]; then
echo "Running on Ubuntu 22.04 LTS"
fi
;;
"Debian")
echo "Debian detected, version $VERSION"
;;
"CentOS"|"RedHatEnterprise")
echo "Red Hat based system detected"
;;
*)
echo "Unknown distribution: $DISTRO"
;;
esac
3. 软件包管理脚本
#!/bin/bash# Install packages based on distributioninstall_package() {
local package=$1
local distro=$(lsb_release -i -s)
case $distro in
"Ubuntu"|"Debian")
sudo apt-get install -y "$package"
;;
"CentOS"|"RedHatEnterprise")
sudo yum install -y "$package"
;;
"Fedora")
sudo dnf install -y "$package"
;;
*)
echo "Unsupported distribution: $distro"
return 1
;;
esac
}
install_package "curl"
发行版特定示例
1. Ubuntu/Debian 系统
# Check Ubuntu version
lsb_release -a
# Distributor ID: Ubuntu
# Description: Ubuntu 22.04.1 LTS
# Release: 22.04
# Codename: jammy
# Check if it's LTS version
if lsb_release -d -s | grep -q "LTS"; then
echo "This is an LTS release"
fi
2. CentOS/RHEL 系统
# CentOS example
lsb_release -a
# Distributor ID: CentOS
# Description: CentOS Linux release 8.4.2105
# Release: 8.4.2105
# Codename: n/a
# Check major version
MAJOR_VERSION=$(lsb_release -r -s | cut -d. -f1)
echo "Major version: $MAJOR_VERSION"
3. Fedora 系统
# Fedora example
lsb_release -a
# Distributor ID: Fedora
# Description: Fedora release 36 (Thirty Six)
# Release: 36
# Codename: ThirtySix
替代信息来源
1. 当 lsb_release 不可用时
# Check if lsb_release existsif command -v lsb_release >/dev/null 2>&1; then
lsb_release -a
else
echo "lsb_release not available, using alternatives:"
# Try /etc/os-release (systemd standard)
if [ -f /etc/os-release ]; then
cat /etc/os-release
fi
# Try distribution-specific files
if [ -f /etc/redhat-release ]; then
cat /etc/redhat-release
elif [ -f /etc/debian_version ]; then
echo "Debian $(cat /etc/debian_version)"
elif [ -f /etc/issue ]; then
cat /etc/issue
fi
fi
2. 使用/etc/os-release
# Modern alternative to lsb_release
cat /etc/os-release
# Example output:
# PRETTY_NAME="Ubuntu 22.04.1 LTS"
# NAME="Ubuntu"
# VERSION_ID="22.04"
# VERSION="22.04.1 LTS (Jammy Jellyfish)"
# ID=ubuntu
# ID_LIKE=debian
# HOME_URL="https://www.ubuntu.com/"
# SUPPORT_URL="https://help.ubuntu.com/"
# Parse specific values
source /etc/os-release
echo "Distribution: $NAME"
echo "Version: $VERSION_ID"
echo "Pretty Name: $PRETTY_NAME"
脚本和自动化
1. 系统信息脚本
#!/bin/bash# Comprehensive system informationecho "=== System Information ==="
echo "Date: $(date)"
echo "Hostname: $(hostname)"
echo "Uptime: $(uptime)"
echo
echo "=== Distribution Information ==="
if command -v lsb_release >/dev/null 2>&1; then
lsb_release -a
else
echo "lsb_release not available"
if [ -f /etc/os-release ]; then
echo "Using /etc/os-release:"
cat /etc/os-release
fi
fi
echo
echo "=== Kernel Information ==="
uname -a
echo
echo "=== Hardware Information ==="
lscpu | head -10
echo
free -h
echo
df -h
2. 环境设置脚本
#!/bin/bash# Setup development environment based on distribution
DISTRO=$(lsb_release -i -s 2>/dev/null || echo "Unknown")
VERSION=$(lsb_release -r -s 2>/dev/null || echo "Unknown")
echo "Setting up environment for $DISTRO $VERSION"
case $DISTRO in
"Ubuntu")
echo "Configuring for Ubuntu..."
sudo apt update
sudo apt install -y build-essential git curl
if [[ "$VERSION" == "22.04" ]]; then
echo "Ubuntu 22.04 specific setup..."
# Add 22.04 specific configurations
fi
;;
"Debian")
echo "Configuring for Debian..."
sudo apt update
sudo apt install -y build-essential git curl
;;
"CentOS"|"RedHatEnterprise")
echo "Configuring for Red Hat based system..."
sudo yum groupinstall -y "Development Tools"
sudo yum install -y git curl
;;
*)
echo "Unknown or unsupported distribution: $DISTRO"
echo "Manual configuration required"
;;
esac
3. 版本比较
#!/bin/bash# Compare distribution versionscheck_minimum_version() {
local current_version=$(lsb_release -r -s)
local minimum_version=$1
local distro=$(lsb_release -i -s)
echo "Current $distro version: $current_version"
echo "Minimum required version: $minimum_version"
if [ "$(printf '%s\n' "$minimum_version" "$current_version" | sort -V | head -n1)" = "$minimum_version" ]; then
echo "Version requirement satisfied"
return 0
else
echo "Version requirement NOT satisfied"
return 1
fi
}
# Check if Ubuntu 20.04 or later
if [[ "$(lsb_release -i -s)" == "Ubuntu" ]]; then
check_minimum_version "20.04"
fi
与配置管理集成
1. Ansible 事实
# lsb_release information is often used in Ansible
# Example Ansible task:
# - name: Install package on Ubuntu
# apt:
# name: nginx
# state: present
# when: ansible_lsb.id == "Ubuntu"
# - name: Install package on CentOS
# yum:
# name: nginx
# state: present
# when: ansible_lsb.id == "CentOS"
2. Docker 集成
#!/bin/bash# Create Dockerfile based on host distribution
HOST_DISTRO=$(lsb_release -i -s)
HOST_VERSION=$(lsb_release -r -s)
cat > Dockerfile << EOF
# Generated Dockerfile based on host: $HOST_DISTRO $HOST_VERSION
FROM ${HOST_DISTRO,,}:$HOST_VERSION
RUN apt-get update && apt-get install -y \\
curl \\
wget \\
git
# Add application-specific configurations
EOF
echo "Dockerfile generated for $HOST_DISTRO $HOST_VERSION"
故障排除
1. 命令未找到
# Install lsb_release if missing# Ubuntu/Debian
sudo apt-get install lsb-release
# CentOS/RHEL 7
sudo yum install redhat-lsb-core
# CentOS/RHEL 8/Fedora
sudo dnf install redhat-lsb-core
# Alternative: use built-in files
cat /etc/os-release
2. 输出不一致
# Some distributions may not fully populate LSB information# Use fallback methodsget_distro_info() {
if command -v lsb_release >/dev/null 2>&1; then
echo "Distribution: $(lsb_release -i -s)"
echo "Version: $(lsb_release -r -s)"
echo "Codename: $(lsb_release -c -s)"
else
echo "Using alternative detection methods..."
if [ -f /etc/os-release ]; then
source /etc/os-release
echo "Distribution: $NAME"
echo "Version: $VERSION_ID"
fi
fi
}
3. 解析问题
# Handle cases where information might be incompleteparse_distro_safe() {
local distro=$(lsb_release -i -s 2>/dev/null)
local version=$(lsb_release -r -s 2>/dev/null)
if [ -z "$distro" ]; then
distro="Unknown"
fi
if [ -z "$version" ]; then
version="Unknown"
fi
echo "Distribution: $distro"
echo "Version: $version"
}
现代替代方案
1. hostnamectl (systemd)
# Modern systemd-based alternative
hostnamectl
# Example output:
# Static hostname: ubuntu-server
# Icon name: computer-vm
# Chassis: vm
# Machine ID: 12345...
# Boot ID: 67890...
# Virtualization: vmware
# Operating System: Ubuntu 22.04.1 LTS
# Kernel: Linux 5.15.0-58-generic
# Architecture: x86-64
2. /etc/os-release
# Standard file across modern distributions
cat /etc/os-release
# Parse specific fields
grep '^NAME=' /etc/os-release | cut -d= -f2 | tr -d '"'
grep '^VERSION_ID=' /etc/os-release | cut -d= -f2 | tr -d '"'
最佳实践
1. 错误处理
# Always check if command exists before usingif ! command -v lsb_release >/dev/null 2>&1; then
echo "lsb_release not available, using fallback method"
# Use alternative method
fi
2. 缓存结果
# Cache results in scripts that call lsb_release multiple times
DISTRO_INFO=$(lsb_release -a 2>/dev/null)
DISTRO_ID=$(echo "$DISTRO_INFO" | awk '/Distributor ID:/ {print $3}')
DISTRO_VERSION=$(echo "$DISTRO_INFO" | awk '/Release:/ {print $2}')
3. 跨平台兼容性
# Write scripts that work across different distributionsdetect_os() {
if [ -f /etc/os-release ]; then
source /etc/os-release
echo "$NAME $VERSION_ID"
elif command -v lsb_release >/dev/null 2>&1; then
lsb_release -d -s
elif [ -f /etc/redhat-release ]; then
cat /etc/redhat-release
else
echo "Unknown"
fi
}
重要注意事项
-
安装要求:lsb_release 可能默认未安装
-
LSB 标准:遵循 Linux 标准基规范
-
特定于发行版:输出格式可能在不同发行版之间有所不同
-
脚本用途:非常适合发行版感知脚本
-
现代替代方案:考虑使用
/etc/os-release用于较新系统 -
回退方法:始终有备选检测方法
lsb_release命令对于创建发行版感知脚本和系统识别至关重要。
查看更多详细信息,请参阅手册:man lsb_release
dmidecode 命令
dmidecode 命令用于从桌面管理接口(DMI)表(也称为 SMBIOS,系统管理 BIOS)中检索硬件信息。它提供了关于系统硬件组件的详细信息,包括主板、CPU、RAM、BIOS 以及其他系统组件。
语法
dmidecode [options] [type]
关键特性
-
硬件信息: CPU、内存、主板、BIOS 详细信息
-
SMBIOS 访问: 直接访问系统管理信息
-
结构化输出: 优雅的硬件清单
-
系统识别: 序列号、型号信息
-
无需 root 权限: 所有用户可访问的基本信息
基本用法
显示所有信息
# Display all available hardware information
sudo dmidecode
# Show specific information types
sudo dmidecode -t system
sudo dmidecode -t processor
sudo dmidecode -t memory
常见信息类型
# BIOS information
sudo dmidecode -t bios
# System information
sudo dmidecode -t system
# Base board (motherboard) information
sudo dmidecode -t baseboard
# Chassis information
sudo dmidecode -t chassis
# Processor information
sudo dmidecode -t processor
# Memory information
sudo dmidecode -t memory
信息类型
数字类型代码
# Type 0: BIOS Information
sudo dmidecode -t 0
# Type 1: System Information
sudo dmidecode -t 1
# Type 2: Base Board Information
sudo dmidecode -t 2
# Type 3: Chassis Information
sudo dmidecode -t 3
# Type 4: Processor Information
sudo dmidecode -t 4
# Type 16: Physical Memory Array
sudo dmidecode -t 16
# Type 17: Memory Device
sudo dmidecode -t 17
字符串类型名称
# BIOS information
sudo dmidecode -t bios
# System information (manufacturer, model, serial)
sudo dmidecode -t system
# Motherboard information
sudo dmidecode -t baseboard
# Case/chassis information
sudo dmidecode -t chassis
# CPU information
sudo dmidecode -t processor
# Memory information
sudo dmidecode -t memory
# Slot information
sudo dmidecode -t slot
# Cache information
sudo dmidecode -t cache
实际示例
1. 系统识别
# Get system manufacturer and model
sudo dmidecode -s system-manufacturer
sudo dmidecode -s system-product-name
sudo dmidecode -s system-serial-number
# Example output:
# Dell Inc.
# OptiPlex 7090
# 1234567
# Complete system information
sudo dmidecode -t system
2. 硬件清单
# CPU informationecho "=== CPU Information ==="
sudo dmidecode -t processor | grep -E "(Family|Model|Speed|Cores|Threads)"
# Memory information
echo "=== Memory Information ==="
sudo dmidecode -t memory | grep -E "(Size|Speed|Manufacturer|Type)"
# Motherboard information
echo "=== Motherboard Information ==="
sudo dmidecode -t baseboard | grep -E "(Manufacturer|Product|Version)"
3. 内存详细信息
# Total memory slots and usageecho "Memory Slots:"
sudo dmidecode -t memory | grep -E "(Locator|Size|Speed)" | grep -v "Bank Locator"
# Maximum memory capacity
echo "Maximum Memory Capacity:"
sudo dmidecode -t 16 | grep "Maximum Capacity"
# Memory module details
echo "Installed Memory Modules:"
sudo dmidecode -t 17 | grep -E "(Size|Speed|Manufacturer|Part Number)" | grep -v "No Module"
特定硬件信息
1. BIOS 信息
# BIOS details
sudo dmidecode -t bios
# Specific BIOS information
sudo dmidecode -s bios-vendor
sudo dmidecode -s bios-version
sudo dmidecode -s bios-release-date
# Example output:
# American Megatrends Inc.
# 2.15.1237
# 03/15/2023
2. CPU 信息
# Processor details
sudo dmidecode -t processor
# Specific CPU information
echo "CPU Family: $(sudo dmidecode -s processor-family)"
echo "CPU Manufacturer: $(sudo dmidecode -s processor-manufacturer)"
echo "CPU Version: $(sudo dmidecode -s processor-version)"
# CPU specifications
sudo dmidecode -t processor | grep -E "(Version|Family|Max Speed|Current Speed|Core Count|Thread Count)"
3. 内存信息
# Memory array information
sudo dmidecode -t 16
# Individual memory modules
sudo dmidecode -t 17
# Memory summary
echo "Total Memory Slots:"
sudo dmidecode -t 17 | grep "Locator:" | wc -l
echo "Occupied Memory Slots:"
sudo dmidecode -t 17 | grep "Size:" | grep -v "No Module" | wc -l
echo "Total Installed Memory:"
sudo dmidecode -t 17 | grep "Size:" | grep -v "No Module" | awk '{sum+=$2} END {print sum " MB"}'
4. 主板信息
# Motherboard details
sudo dmidecode -t baseboard
# Specific motherboard information
echo "Motherboard Manufacturer: $(sudo dmidecode -s baseboard-manufacturer)"
echo "Motherboard Model: $(sudo dmidecode -s baseboard-product-name)"
echo "Motherboard Version: $(sudo dmidecode -s baseboard-version)"
echo "Motherboard Serial: $(sudo dmidecode -s baseboard-serial-number)"
高级用法
1. 解析和过滤
# Extract specific information using grep and awkget_memory_info() {
sudo dmidecode -t 17 | awk '
/Memory Device/,/^$/ {
if (/Size:/) size=$2" "$3
if (/Speed:/) speed=$2" "$3
if (/Manufacturer:/) manufacturer=$2
if (/Part Number:/) part=$3
if (/Locator:/ && !/Bank/) {
locator=$2
if (size != "No Module") {
print locator": "size" @ "speed" ("manufacturer" "part")"
}
}
}'
}
get_memory_info
2. 系统资产信息
# Create system asset reportcreate_asset_report() {
echo "=== System Asset Report ==="
echo "Generated: $(date)"
echo
echo "System Information:"
echo " Manufacturer: $(sudo dmidecode -s system-manufacturer)"
echo " Model: $(sudo dmidecode -s system-product-name)"
echo " Serial Number: $(sudo dmidecode -s system-serial-number)"
echo " UUID: $(sudo dmidecode -s system-uuid)"
echo
echo "BIOS Information:"
echo " Vendor: $(sudo dmidecode -s bios-vendor)"
echo " Version: $(sudo dmidecode -s bios-version)"
echo " Date: $(sudo dmidecode -s bios-release-date)"
echo
echo "Motherboard Information:"
echo " Manufacturer: $(sudo dmidecode -s baseboard-manufacturer)"
echo " Model: $(sudo dmidecode -s baseboard-product-name)"
echo " Serial: $(sudo dmidecode -s baseboard-serial-number)"
echo
echo "Chassis Information:"
echo " Type: $(sudo dmidecode -s chassis-type)"
echo " Manufacturer: $(sudo dmidecode -s chassis-manufacturer)"
echo " Serial: $(sudo dmidecode -s chassis-serial-number)"
}
create_asset_report > system_asset_report.txt
3. 硬件验证
# Validate hardware configurationvalidate_hardware() {
echo "=== Hardware Validation ==="
# Check if virtualization is supported
if sudo dmidecode -t processor | grep -q "VMX\|SVM"; then
echo "✓ Virtualization supported"
else
echo "✗ Virtualization not supported"
fi
# Check memory configuration
local total_slots=$(sudo dmidecode -t 17 | grep "Locator:" | wc -l)
local used_slots=$(sudo dmidecode -t 17 | grep "Size:" | grep -v "No Module" | wc -l)
echo "Memory: $used_slots/$total_slots slots used"
# Check for ECC memory
if sudo dmidecode -t 17 | grep -q "Error Correction Type.*ECC"; then
echo "✓ ECC memory detected"
else
echo "ℹ No ECC memory detected"
fi
# Check system age (approximate)
local bios_date=$(sudo dmidecode -s bios-release-date)
local year=$(echo $bios_date | awk -F'/' '{print $3}')
local current_year=$(date +%Y)
local age=$((current_year - year))
echo "Approximate system age: $age years"
}
validate_hardware
字符串选项
可用的字符串选项
# System strings
sudo dmidecode -s system-manufacturer
sudo dmidecode -s system-product-name
sudo dmidecode -s system-version
sudo dmidecode -s system-serial-number
sudo dmidecode -s system-uuid
# BIOS strings
sudo dmidecode -s bios-vendor
sudo dmidecode -s bios-version
sudo dmidecode -s bios-release-date
# Baseboard strings
sudo dmidecode -s baseboard-manufacturer
sudo dmidecode -s baseboard-product-name
sudo dmidecode -s baseboard-version
sudo dmidecode -s baseboard-serial-number
# Chassis strings
sudo dmidecode -s chassis-manufacturer
sudo dmidecode -s chassis-type
sudo dmidecode -s chassis-version
sudo dmidecode -s chassis-serial-number
# Processor strings
sudo dmidecode -s processor-family
sudo dmidecode -s processor-manufacturer
sudo dmidecode -s processor-version
sudo dmidecode -s processor-frequency
输出选项
格式化选项
# Quiet output (suppress headers)
sudo dmidecode -q -t system
# No piping warning
sudo dmidecode --no-sysfs -t memory
# Dump raw DMI data
sudo dmidecode --dump-bin dmi.bin
# Read from binary dump
dmidecode --from-dump dmi.bin
脚本和自动化
1. 硬件监控脚本
#!/bin/bash# Monitor hardware changes
HARDWARE_LOG="/var/log/hardware_changes.log"
CURRENT_STATE="/tmp/current_hardware.txt"
PREVIOUS_STATE="/var/lib/hardware_baseline.txt"
# Generate current hardware state
{
echo "=== Hardware State $(date) ==="
sudo dmidecode -s system-serial-number
sudo dmidecode -t memory | grep -E "(Size|Speed)" | grep -v "No Module"
sudo dmidecode -t processor | grep -E "(Version|Speed|Cores)"
} > "$CURRENT_STATE"
# Compare with previous state
if [ -f "$PREVIOUS_STATE" ]; then
if ! diff -q "$PREVIOUS_STATE" "$CURRENT_STATE" >/dev/null; then
echo "$(date): Hardware configuration changed" >> "$HARDWARE_LOG"
diff "$PREVIOUS_STATE" "$CURRENT_STATE" >> "$HARDWARE_LOG"
fi
fi
# Update baseline
cp "$CURRENT_STATE" "$PREVIOUS_STATE"
2. 清单收集
#!/bin/bash# Collect hardware inventory for multiple systemscollect_inventory() {
local hostname=$(hostname)
local output_file="inventory_${hostname}_$(date +%Y%m%d).txt"
{
echo "Hardware Inventory for $hostname"
echo "Generated: $(date)"
echo "================================="
echo
echo "System Information:"
sudo dmidecode -t system | grep -E "(Manufacturer|Product|Serial|UUID)"
echo
echo "BIOS Information:"
sudo dmidecode -t bios | grep -E "(Vendor|Version|Release Date)"
echo
echo "Memory Configuration:"
sudo dmidecode -t memory | grep -E "(Maximum Capacity|Number Of Devices)"
sudo dmidecode -t 17 | grep -E "(Locator|Size|Speed|Manufacturer)" | grep -v "Bank Locator"
echo
echo "Processor Information:"
sudo dmidecode -t processor | grep -E "(Family|Version|Speed|Core Count|Thread Count)"
echo
echo "Motherboard Information:"
sudo dmidecode -t baseboard | grep -E "(Manufacturer|Product|Version|Serial)"
} > "$output_file"
echo "Inventory saved to: $output_file"
}
collect_inventory
3. 许可证管理
#!/bin/bash# Extract information for software licensingget_license_info() {
echo "System Identification for Licensing:"
echo "UUID: $(sudo dmidecode -s system-uuid)"
echo "Serial: $(sudo dmidecode -s system-serial-number)"
echo "Manufacturer: $(sudo dmidecode -s system-manufacturer)"
echo "Model: $(sudo dmidecode -s system-product-name)"
# Generate unique system fingerprint
local fingerprint=$(sudo dmidecode -s system-uuid)$(sudo dmidecode -s baseboard-serial-number)
echo "System Fingerprint: $(echo -n "$fingerprint" | sha256sum | cut -d' ' -f1)"
}
get_license_info
故障排除
1. 权限问题
# dmidecode requires root privileges for full access# Some information may be available without root# Check what's available without root
dmidecode 2>/dev/null || echo "Root access required for complete information"
# Use sudo for full access
sudo dmidecode -t system
2. 虚拟机考虑事项
# In VMs, some information may be virtualized or missingcheck_virtualization() {
local system_product=$(sudo dmidecode -s system-product-name)
case "$system_product" in
*"VMware"*|*"Virtual Machine"*|*"VirtualBox"*)
echo "Running in virtual machine: $system_product"
echo "Some hardware information may be virtualized"
;;
*)
echo "Physical machine detected"
;;
esac
}
check_virtualization
3. 缺失信息
# Some fields may show "Not Specified" or be empty# Handle missing data gracefullyget_safe_value() {
local value=$(sudo dmidecode -s "$1" 2>/dev/null)
if [ -z "$value" ] || [ "$value" = "Not Specified" ]; then
echo "Unknown"
else
echo "$value"
fi
}
echo "Manufacturer: $(get_safe_value system-manufacturer)"
echo "Model: $(get_safe_value system-product-name)"
与其他工具集成
1. 与 lscpu 结合
# Comprehensive CPU informationecho "=== CPU Information ==="
echo "DMI Information:"
sudo dmidecode -t processor | grep -E "(Family|Version|Speed|Cores)"
echo
echo "Kernel Information:"
lscpu
2. 内存交叉引用
# Compare dmidecode with /proc/meminfoecho "DMI Memory Information:"
sudo dmidecode -t 16 | grep "Maximum Capacity"
sudo dmidecode -t 17 | grep "Size:" | grep -v "No Module"
echo
echo "Kernel Memory Information:"
cat /proc/meminfo | grep -E "(MemTotal|MemAvailable)"
3. 系统监控集成
# Add to monitoring systemscreate_monitoring_metrics() {
local uuid=$(sudo dmidecode -s system-uuid)
local serial=$(sudo dmidecode -s system-serial-number)
local manufacturer=$(sudo dmidecode -s system-manufacturer)
# Output in monitoring format (e.g., Prometheus)
echo "system_info{uuid=\"$uuid\",serial=\"$serial\",manufacturer=\"$manufacturer\"} 1"
}
最佳实践
1. 缓存结果
# Cache dmidecode output for scripts that use it multiple times
DMI_CACHE="/tmp/dmidecode_cache.txt"
get_cached_dmidecode() {
if [ ! -f "$DMI_CACHE" ] || [ "$(find "$DMI_CACHE" -mmin +60)" ]; then
sudo dmidecode > "$DMI_CACHE"
fi
cat "$DMI_CACHE"
}
2. 错误处理
# Always check if dmidecode is available and handle errorsrun_dmidecode() {
if ! command -v dmidecode >/dev/null 2>&1; then
echo "dmidecode not available"
return 1
fi
if ! sudo dmidecode "$@" 2>/dev/null; then
echo "Failed to read DMI information"
return 1
fi
}
3. 安全考虑
# Be careful with sensitive information in logssanitize_output() {
sudo dmidecode "$@" | sed 's/Serial Number:.*/Serial Number: [REDACTED]/'
}
重要注意事项
-
root 访问: 完全功能需要 root 权限
-
硬件相关: 输出取决于 BIOS/UEFI 实现
-
虚拟机: 信息可能被虚拟化或受限
-
制造商特定: 一些字段可能是制造商特定的
-
版本差异: 不同 dmidecode 版本之间的输出格式可能不同
-
安全性: 在日志中注意敏感硬件信息
dmidecode 命令对于硬件清单、系统识别和解决硬件相关问题是必不可少的。
更多详情,请查看手册:man dmidecode
apropos 命令
apropos 命令在手册页名称和描述中搜索关键词。它本质上等同于 man -k,帮助用户在知道他们想做什么但不知道确切命令名称时找到相关的命令和文档。
语法
apropos [options] keyword...
关键特性
-
关键词搜索:搜索手册页名称和描述
-
正则表达式支持:允许模式匹配
-
多个关键词:搜索多个术语
-
章节过滤:限制搜索到特定手册章节
-
精确匹配:查找精确的单词匹配
基本用法
简单关键词搜索
# Search for commands related to "copy"
apropos copy
# Search for commands related to "network"
apropos network
# Search for file-related commands
apropos file
# Search for text processing commands
apropos text
多个关键词
# Search for commands related to both "file" and "system"
apropos file system
# Search for networking and configuration
apropos network config
# Search for user and management
apropos user management
常见选项
基本选项
# -a: AND search (all keywords must match)
apropos -a file system
# -e: Exact match
apropos -e copy
# -r: Use regular expressions
apropos -r "^net"
# -w: Match whole words only
apropos -w net
高级选项
# -s: Search specific manual sections
apropos -s 1 copy # User commands only
apropos -s 8 network # System administration commands
# -l: Long output format
apropos -l file
# -M: Specify manual path
apropos -M /usr/share/man file
实际示例
1. 通过功能查找命令
# Find compression commands
apropos compress
# Find archive commands
apropos archive
# Find text editors
apropos editor
# Find file system commands
apropos filesystem
# Find process management commands
apropos process
2. 网络相关命令
# General network commands
apropos network
# Network configuration
apropos -a network config
# Network troubleshooting
apropos -a network trouble
# Firewall commands
apropos firewall
# DNS-related commands
apropos dns
3. 系统管理
# User management
apropos user
# Service management
apropos service
# System monitoring
apropos -a system monitor
# Log management
apropos log
# Package management
apropos package
4. 开发和编程
# Compiler commands
apropos compiler
# Debugging tools
apropos debug
# Version control
apropos version
# Build tools
apropos build
# Library commands
apropos library
使用正则表达式
1. 模式匹配
# Find commands starting with "net"
apropos -r "^net"
# Find commands ending with "fs"
apropos -r "fs$"
# Find commands containing "config"
apropos -r ".*config.*"
# Find commands with specific patterns
apropos -r "[0-9]+"
2. 复杂模式
# Multiple patterns
apropos -r "(copy|move|transfer)"
# Case-insensitive search
apropos -r -i "FILE"
# Word boundaries
apropos -r "\bnet\b"
特定章节搜索
手册章节
# Section 1: User commands
apropos -s 1 copy
# Section 2: System calls
apropos -s 2 file
# Section 3: Library functions
apropos -s 3 string
# Section 5: File formats
apropos -s 5 config
# Section 8: System administration
apropos -s 8 mount
理解章节
# List all sections
man man | grep -A 10 "MANUAL SECTIONS"
# Common sections:
# 1 - User commands
# 2 - System calls
# 3 - Library functions
# 4 - Device files
# 5 - File formats and conventions
# 6 - Games
# 7 - Miscellaneous
# 8 - System administration commands
高级用法
1. 与其他命令结合使用
# Search and count results
apropos network | wc -l
# Search and sort
apropos file | sort
# Search and filter
apropos copy | grep -v "manual"
# Search and format
apropos -l network | column -t
2. 脚本应用
#!/bin/bash# Find commands for specific tasksfind_commands() {
local task="$1"
echo "Commands related to '$task':"
apropos "$task" | head -10
echo
}
# Usage examples
find_commands "backup"
find_commands "monitor"
find_commands "security"
3. 学习工具
# Daily command discoverydaily_discovery() {
local keywords=("network" "file" "text" "system" "process")
local keyword=${keywords[$RANDOM % ${#keywords[@]}]}
echo "Today's command discovery - Topic: $keyword"
apropos "$keyword" | shuf | head -5
}
daily_discovery
常见问题故障排除
1. 没有找到结果
# Update manual database if no results
sudo mandb
# Check if manual pages are installed
ls /usr/share/man/man1/ | head
# Try different keywords
apropos copy
apropos duplicate
apropos clone
2. 数据库问题
# Rebuild manual database
sudo mandb -c
# Force database rebuild
sudo mandb -f
# Check database status
mandb --version
3. 权限问题
# Check manual path permissions
ls -la /usr/share/man/
# Check database location
find /var -name "*man*" -type d 2>/dev/null
# Run with specific path
apropos -M /usr/local/man keyword
有用的搜索模式
1. 常见任务
# File operations
apropos -a file copy
apropos -a file move
apropos -a file remove
apropos -a file search
# System information
apropos -a system info
apropos -a hardware info
apropos -a disk usage
# Network operations
apropos -a network interface
apropos -a network test
apropos -a network config
2. 按软件类别
# Text processing
apropos -r "(awk|sed|grep|cut|sort)"
# Compression tools
apropos -r "(gzip|tar|zip|compress)"
# System monitoring
apropos -r "(top|ps|iostat|netstat)"
# File systems
apropos -r "(mount|umount|fsck|mkfs)"
3. 管理任务
# User management
apropos -a user add
apropos -a user delete
apropos -a user modify
# Service management
apropos -a service start
apropos -a service stop
apropos -a service status
# Package management
apropos -a package install
apropos -a package remove
apropos -a package update
与学习的集成
1. 命令发现脚本
#!/bin/bash# Interactive command discoverydiscover_commands() {
echo "What do you want to do? (e.g., 'copy files', 'monitor system')"
read -r task
echo "Searching for commands related to: $task"
echo "======================================"
apropos "$task" | while read -r line; do
cmd=$(echo "$line" | awk '{print $1}')
desc=$(echo "$line" | cut -d' ' -f2-)
echo "Command: $cmd"
echo "Description: $desc"
echo "Try: man $cmd"
echo "---"
done
}
discover_commands
2. 命令推荐
#!/bin/bash# Recommend commands based on keywordsrecommend_command() {
local keyword="$1"
echo "For '$keyword', you might want to try:"
apropos "$keyword" | head -5 | while read -r line; do
cmd=$(echo "$line" | awk '{print $1}')
echo " • $cmd - $(man -f $cmd 2>/dev/null | cut -d' ' -f2- || echo 'No description')"
done
}
# Examples
recommend_command "backup"
recommend_command "monitor"
recommend_command "compress"
与类似命令的比较
1. apropos 与 man -k 的比较
# These are equivalent
apropos network
man -k network
# Both search manual page descriptions
2. apropos 与 whatis 的比较
# apropos: searches descriptions (broader)
apropos copy
# whatis: exact command name match (narrower)
whatis cp
3. apropos 与 which/whereis 的比较
# apropos: finds commands by description
apropos file
# which: finds command location
which cp
# whereis: finds command, source, manual locations
whereis cp
配置和自定义
1. 手册路径配置
# Check current manual paths
manpath
# Add custom manual path
export MANPATH="/usr/local/man:$MANPATH"
# Make permanent in shell profile
echo 'export MANPATH="/usr/local/man:$MANPATH"' >> ~/.bashrc
2. 数据库配置
# Manual database locationecho $MANDB
# Update configuration
sudo nano /etc/manpath.config
# Force database update
sudo mandb -f
高级脚本示例
1. 命令探索器
#!/bin/bash# Interactive command explorerwhile true; do
echo -n "Enter search term (or 'quit' to exit): "
read -r term
if [ "$term" = "quit" ]; then
break
fi
results=$(apropos "$term" 2>/dev/null)
if [ -z "$results" ]; then
echo "No commands found for '$term'"
echo "Try: sudo mandb # to update manual database"
else
echo "Commands related to '$term':"
echo "$results" | nl
echo
echo -n "Enter number to view manual (or press Enter to continue): "
read -r choice
if [[ "$choice" =~ ^[0-9]+$ ]]; then
cmd=$(echo "$results" | sed -n "${choice}p" | awk '{print $1}')
if [ -n "$cmd" ]; then
man "$cmd"
fi
fi
fi
echo
done
2. 命令类别浏览器
#!/bin/bash# Browse commands by category
categories=(
"file:File operations"
"network:Network commands"
"system:System administration"
"text:Text processing"
"process:Process management"
"security:Security tools"
"backup:Backup and archive"
"monitor:System monitoring"
)
echo "Command Categories:"
for i in "${!categories[@]}"; do
desc=$(echo "${categories[i]}" | cut -d: -f2)
echo "$((i+1)). $desc"
done
echo -n "Select category (1-${#categories[@]}): "
read -r choice
if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le "${#categories[@]}" ]; then
keyword=$(echo "${categories[$((choice-1))]}" | cut -d: -f1)
desc=$(echo "${categories[$((choice-1))]}" | cut -d: -f2)
echo "Commands for $desc:"
apropos "$keyword" | head -10
fi
最佳实践
1. 高效搜索
# Start with broad terms, then narrow down
apropos file
apropos -a file copy
apropos -a file copy system
# Use synonyms if no results
apropos copy || apropos duplicate || apropos clone
2. 定期数据库更新
# Add to crontab for regular updates# 0 3 * * 0 /usr/bin/mandb -q# Or create update script#!/bin/bashecho "Updating manual database..."
sudo mandb -q
echo "Manual database updated."
3. 学习集成
# Create learning aliasesalias learn='apropos'
alias find-cmd='apropos'
alias what-cmd='apropos'
# Create help function
help-me() {
echo "What do you want to do?"
echo "Example: help-me copy files"
apropos "$*"
}
重要注意事项
-
数据库依赖性:需要更新的手册数据库 (
mandb) -
关键词质量:结果取决于搜索词的质量
-
手册完整性:仅查找已记录的命令
-
正则表达式:使用
-r进行模式匹配 -
章节意识:使用
-s进行特定章节的搜索 -
大小写敏感性:默认情况下通常不区分大小写
当你知道你想完成什么但不知道要使用的具体命令时,apropos 命令对于发现命令和了解系统功能非常有价值。
想要更多详细信息,请查看手册:man apropos
dmesg 命令
dmesg 命令显示内核环形缓冲区中的消息。它显示引导消息、硬件检测、驱动加载和系统事件。这对于解决硬件问题、驱动程序问题和理解系统启动过程至关重要。
语法
dmesg [options]
关键特性
-
内核消息: 显示内核环形缓冲区内容
-
引导信息: 硬件检测和驱动加载
-
实时监控: 可以跟踪新消息
-
过滤选项: 通过设施、级别或时间过滤
-
多种格式: 人类可读和原始格式
基本用法
显示所有消息
# Display all kernel messages
dmesg
# Display with human-readable timestamps
dmesg -T
# Display last 20 lines
dmesg | tail -20
# Display first 20 lines (boot messages)
dmesg | head -20
跟踪新消息
# Follow new kernel messages (like tail -f)
dmesg -w
# Follow with timestamps
dmesg -T -w
# Follow last 10 lines and continue
dmesg | tail -10 && dmesg -w
消息级别和设施
消息级别
# Emergency messages (level 0)
dmesg -l emerg
# Alert messages (level 1)
dmesg -l alert
# Critical messages (level 2)
dmesg -l crit
# Error messages (level 3)
dmesg -l err
# Warning messages (level 4)
dmesg -l warn
# Notice messages (level 5)
dmesg -l notice
# Info messages (level 6)
dmesg -l info
# Debug messages (level 7)
dmesg -l debug
多级
# Show errors and warnings
dmesg -l err,warn
# Show critical and above (crit, alert, emerg)
dmesg -l crit+
# Show warnings and below (warn, notice, info, debug)
dmesg -l warn-
设施
# Kernel messages
dmesg -f kern
# User-space messages
dmesg -f user
# Mail system messages
dmesg -f mail
# System daemons
dmesg -f daemon
# Authorization messages
dmesg -f auth
# Syslog messages
dmesg -f syslog
常见选项
显示选项
# -T: Human-readable timestamps
dmesg -T
# -t: Don't show timestamps
dmesg -t
# -x: Decode facility and level to human-readable
dmesg -x
# -H: Enable human-readable output
dmesg -H
# -k: Show kernel messages only
dmesg -k
缓冲区选项
# -c: Clear ring buffer after reading
sudo dmesg -c
# -C: Clear ring buffer
sudo dmesg -C
# -s: Buffer size
dmesg -s 65536
# -n: Set console log level
sudo dmesg -n 1
实际示例
1. 硬件检测
# Check USB device detection
dmesg | grep -i usb
# Check network interface detection
dmesg | grep -i eth
# Check disk detection
dmesg | grep -i -E "(sda|sdb|sdc|nvme)"
# Check memory detection
dmesg | grep -i memory
# Check CPU detection
dmesg | grep -i cpu
2. 驱动加载
# Check loaded drivers
dmesg | grep -i driver
# Check specific driver (e.g., nvidia)
dmesg | grep -i nvidia
# Check wireless driver
dmesg | grep -i wifi
# Check bluetooth driver
dmesg | grep -i bluetooth
# Check sound driver
dmesg | grep -i audio
3. 错误调试
# Show only error messages
dmesg -l err
# Show errors and warnings
dmesg -l err,warn
# Search for specific errors
dmesg | grep -i error
# Search for failed operations
dmesg | grep -i fail
# Search for timeout issues
dmesg | grep -i timeout
4. 引导过程分析
# Show boot messages with timestamps
dmesg -T | head -50
# Find boot completion time
dmesg | grep -i "boot"
# Check service startup
dmesg | grep -i systemd
# Check filesystem mounting
dmesg | grep -i mount
# Check network initialization
dmesg | grep -i network
基于时间的过滤
最近消息
# Messages from last 10 minutes
dmesg --since="10 minutes ago"
# Messages from last hour
dmesg --since="1 hour ago"
# Messages from today
dmesg --since="today"
# Messages from specific time
dmesg --since="2023-01-01 00:00:00"
时间范围
# Messages between specific times
dmesg --since="2023-01-01" --until="2023-01-02"
# Messages from last boot
dmesg --since="last boot"
# Messages from specific duration
dmesg --since="30 minutes ago" --until="10 minutes ago"
高级过滤
1. 过滤器组合
# Errors from last hour
dmesg -l err --since="1 hour ago"
# Kernel warnings with timestamps
dmesg -T -l warn -f kern
# USB-related errors
dmesg -l err | grep -i usb
# Network errors from today
dmesg --since="today" | grep -i -E "(network|eth|wifi)"
2. 输出格式化
# JSON format
dmesg --json
# Raw format (no timestamp processing)
dmesg -r
# Colored output (if supported)
dmesg --color=always
# No pager
dmesg --nopager
3. 自定义格式化
# Extract specific informationextract_usb_devices() {
dmesg | grep -E "usb.*: New USB device" | \
sed -n 's/.*New USB device found, idVendor=\([^,]*\), idProduct=\([^ ]*\).*/Vendor: \1, Product: \2/p'
}
extract_usb_devices
监控和警报
1. 实时监控
# Monitor for specific eventsmonitor_errors() {
dmesg -w -l err | while read line; do
echo "$(date): $line"
# Send alert
echo "$line" | mail -s "Kernel Error Alert" admin@domain.com
done
}
# Monitor USB connections
monitor_usb() {
dmesg -w | grep --line-buffered -i usb | while read line; do
echo "USB Event: $line"
done
}
2. 日志分析脚本
#!/bin/bash# Analyze kernel messages for issuesanalyze_dmesg() {
echo "=== Kernel Message Analysis ==="
echo "Generated: $(date)"
echo
echo "Error Messages:"
dmesg -l err | tail -10
echo
echo "Warning Messages:"
dmesg -l warn | tail -10
echo
echo "Recent Hardware Events:"
dmesg --since="1 hour ago" | grep -i -E "(usb|disk|network|memory)" | tail -10
echo
echo "Driver Loading Issues:"
dmesg | grep -i -E "(failed|error|timeout)" | grep -i driver | tail -5
}
analyze_dmesg > kernel_analysis.txt
3. 系统健康检查
#!/bin/bash# Check system health using dmesgcheck_system_health() {
local issues=0
echo "=== System Health Check ==="
# Check for critical errors
critical_errors=$(dmesg -l crit,alert,emerg --since="24 hours ago" | wc -l)
if [ $critical_errors -gt 0 ]; then
echo "⚠️ $critical_errors critical errors found in last 24 hours"
((issues++))
else
echo "✅ No critical errors in last 24 hours"
fi
# Check for hardware errors
hw_errors=$(dmesg --since="24 hours ago" | grep -i -c -E "(hardware error|machine check|MCE)")
if [ $hw_errors -gt 0 ]; then
echo "⚠️ $hw_errors hardware errors detected"
((issues++))
else
echo "✅ No hardware errors detected"
fi
# Check for out of memory
oom_events=$(dmesg --since="24 hours ago" | grep -i -c "out of memory")
if [ $oom_events -gt 0 ]; then
echo "⚠️ $oom_events out of memory events"
((issues++))
else
echo "✅ No out of memory events"
fi
# Check for filesystem errors
fs_errors=$(dmesg --since="24 hours ago" | grep -i -c -E "(filesystem error|ext[234] error|xfs error)")
if [ $fs_errors -gt 0 ]; then
echo "⚠️ $fs_errors filesystem errors"
((issues++))
else
echo "✅ No filesystem errors"
fi
echo
if [ $issues -eq 0 ]; then
echo "🎉 System appears healthy!"
else
echo "⚠️ Found $issues types of issues - check details above"
fi
}
check_system_health
常见用例
1. USB 设备故障排除
# Monitor USB device connectionsmonitor_usb_debug() {
echo "Monitoring USB events (Ctrl+C to stop)..."
dmesg -w | grep --line-buffered -i usb | while read line; do
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] $line"
done
}
# Check USB device history
usb_device_history() {
echo "USB Device Connection History:"
dmesg | grep -i "usb.*: New USB device" | tail -10
echo
echo "USB Device Disconnections:"
dmesg | grep -i "usb.*disconnect" | tail -10
}
2. 网络接口问题
# Check network interface eventscheck_network_issues() {
echo "Network Interface Events:"
dmesg | grep -i -E "(eth[0-9]|wlan[0-9]|enp|wlp)" | tail -10
echo
echo "Network Driver Issues:"
dmesg | grep -i -E "network.*error|ethernet.*error" | tail -5
echo
echo "Link Status Changes:"
dmesg | grep -i "link" | tail -10
}
3. 存储设备监控
# Check disk health and errorscheck_storage_health() {
echo "Storage Device Detection:"
dmesg | grep -i -E "(sda|sdb|nvme)" | grep -i "sectors" | tail -5
echo
echo "Storage Errors:"
dmesg | grep -i -E "(I/O error|Medium Error|critical medium error)" | tail -5
echo
echo "Filesystem Events:"
dmesg | grep -i -E "(mounted|unmounted|remounted)" | tail -10
}
与其他工具集成
1. 结合 journalctl
# Compare kernel messagesecho "=== dmesg output ==="
dmesg --since="1 hour ago" | head -5
echo "=== journalctl kernel messages ==="
journalctl -k --since="1 hour ago" | head -5
2. 日志文件集成
# Save dmesg to file with rotationsave_dmesg_log() {
local logfile="/var/log/dmesg.log"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] === dmesg snapshot ===" >> "$logfile"
dmesg -T >> "$logfile"
# Rotate if file gets too large
if [ $(stat -f%z "$logfile" 2>/dev/null || stat -c%s "$logfile") -gt 10485760 ]; then
mv "$logfile" "$logfile.old"
echo "Log rotated at $timestamp" > "$logfile"
fi
}
3. 监控系统集成
# Create metrics for monitoring systemscreate_dmesg_metrics() {
local errors=$(dmesg -l err --since="1 hour ago" | wc -l)
local warnings=$(dmesg -l warn --since="1 hour ago" | wc -l)
local timestamp=$(date +%s)
# Output in Prometheus format
echo "kernel_errors_total $errors $timestamp"
echo "kernel_warnings_total $warnings $timestamp"
}
故障排除
1. 缓冲区大小问题
# Check current buffer size
dmesg | wc -l
# Increase buffer size (temporary)
sudo dmesg -s 1048576
# Make permanent (add to kernel parameters)
# Add to GRUB: log_buf_len=1048576
2. 权限问题
# Check if non-root can read dmesg
dmesg >/dev/null 2>&1 && echo "Can read dmesg" || echo "Cannot read dmesg"
# Check kernel parameter
cat /proc/sys/kernel/dmesg_restrict
# Allow non-root users (temporary)
sudo sysctl kernel.dmesg_restrict=0
# Make permanent
echo "kernel.dmesg_restrict = 0" | sudo tee -a /etc/sysctl.conf
3. 消息过滤问题
# Check available facilities and levels
dmesg --help | grep -A 20 "supported facilities"
# Test filtering
dmesg -l err | head -5
dmesg -f kern | head -5
# Check if systemd is interfering
systemctl status systemd-journald
性能考虑
1. 大缓冲区处理
# Process large buffers efficientlyprocess_large_dmesg() {
# Use streaming instead of loading all into memory
dmesg | while IFS= read -r line; do
# Process line by line
echo "$line" | grep -q "error" && echo "Error: $line"
done
}
2. 高效搜索
# Use specific filters instead of post-processing
dmesg -l err # Better than dmesg | grep -i error
dmesg --since="1 hour ago" # Better than dmesg | filtering by time
最佳实践
1. 定期监控
# Create cron job for regular checks# 0 */4 * * * /usr/local/bin/check_dmesg_errors.sh# Create check script#!/bin/bash
errors=$(dmesg -l err --since="4 hours ago" | wc -l)
if [ $errors -gt 0 ]; then
dmesg -l err --since="4 hours ago" | mail -s "Kernel Errors Detected" admin@domain.com
fi
2. 日志保留
# Save important messagessave_important_messages() {
local date_str=$(date '+%Y%m%d')
dmesg -l err,crit,alert,emerg > "/var/log/kernel_errors_$date_str.log"
}
3. 文档
# Document system eventsdocument_system_event() {
local event="$1"
local logfile="/var/log/system_events.log"
echo "$(date): $event" >> "$logfile"
echo "=== dmesg at time of event ===" >> "$logfile"
dmesg -T | tail -20 >> "$logfile"
echo "=================================" >> "$logfile"
}
重要注意事项
-
root 权限: 一些发行版将 dmesg 限制为 root 用户
-
缓冲区大小: 环形缓冲区大小有限;旧消息被覆盖
-
时间戳: 使用
-T以人类可读的格式显示 -
级别: 理解消息级别以进行有效过滤
-
实时: 使用
-w监控新消息 -
性能: 大缓冲区可能影响性能
-
安全: 谨慎暴露内核消息
dmesg 命令对于系统故障排除、硬件调试和理解内核行为至关重要。
更多详细信息,请查看手册:man dmesg
!! 命令(历史扩展)
!! 命令是 bash 历史扩展功能,用于重复最后一个命令。它是历史扩展能力更广泛集合的一部分,允许您快速重新执行、修改或引用之前的命令。这对于纠正错误、添加 sudo 或重复复杂命令非常有用。
语法
!!
!<event>
!<string>
!?<string>?
关键特性
-
重复上一个命令:快速重新运行上一个命令
-
命令修改:修改并重新执行之前的命令
-
参数提取:从之前的命令中提取特定参数
-
模式匹配:通过模式查找命令
-
节省时间:避免重新输入复杂的命令
基本用法
简单历史扩展
# Run a command
ls -la /home/user
# Repeat the last command
!!
# Add sudo to the last command
sudo !!
# This is equivalent to:
sudo ls -la /home/user
常见场景
# Forgot sudo
apt update
# Permission denied
# Fix with sudo
sudo !!
# Executes: sudo apt update
# Wrong directory
cd /var/logs
# No such file or directory
# Fix the path
cd /var/log
# Then repeat with correct path
!!
历史扩展模式
1. 事件指示符
# !! - Last command
!!
# !n - Command number n
!123
# !-n - nth command back
!-2 # Two commands ago
!-5 # Five commands ago
# !string - Most recent command starting with 'string'
!ls # Last command starting with 'ls'
!git # Last command starting with 'git'
# !?string? - Most recent command containing 'string'
!?config? # Last command containing 'config'
!?file? # Last command containing 'file'
2. 单词指示符
# Previous command: git commit -m "Fix bug" --amend# !^ - First argumentecho !^ # echo commit
# !$ - Last argument
echo !$ # echo --amend
# !* - All arguments
echo !* # echo commit -m "Fix bug" --amend
# !:n - nth argument (0-based)
echo !:0 # echo git
echo !:1 # echo commit
echo !:2 # echo -m
# !:n-m - Range of arguments
echo !:1-3 # echo commit -m "Fix bug"
3. 修饰符
# Previous command: ls /home/user/documents/file.txt# :h - Remove trailing pathname component (head)echo !!:h # echo /home/user/documents
# :t - Remove leading pathname components (tail)
echo !!:t # echo file.txt
# :r - Remove trailing suffix
echo !!:r # echo /home/user/documents/file
# :e - Remove all but trailing suffix
echo !!:e # echo txt
# :s/old/new/ - Substitute first occurrence
!!:s/user/admin/ # ls /home/admin/documents/file.txt
# :gs/old/new/ - Global substitution
!!:gs/o/0/ # ls /h0me/user/d0cuments/file.txt
实际示例
1. 错误纠正
# Typo in command
ct /etc/hosts
# Command not found
# Correct and re-run
cat /etc/hosts
# Then if you need to edit it
sudo vi !! # Becomes: sudo vi /etc/hosts
2. 添加缺失的选项
# Run command without verbose
tar -czf backup.tar.gz /home/user
# Add verbose flag
!!:s/-czf/-czvf/
# Becomes: tar -czvf backup.tar.gz /home/user
# Or simpler approach
tar -czvf backup.tar.gz /home/user
3. 文件操作
# Create file
touch /tmp/test_file.txt
# Edit the same file
vi !!:$ # vi /tmp/test_file.txt
# Copy to different location
cp !!:$ /home/user/
# Becomes: cp /tmp/test_file.txt /home/user/
# Previous command: find /var/log -name "*.log" -size +10M
# Copy found files
cp !!:3 !!:4 !!:5 /backup/
# Using specific arguments from find command
4. 目录导航
# Change to a directorycd /usr/local/bin
# List contents
ls !!:$ # ls /usr/local/bin
# Go back and then to related directory
cd /usr/local/src
# ... later ...
cd !!:h/bin # cd /usr/local/bin
高级历史扩展
1. 复杂替换
# Previous: rsync -av /home/user/docs/ backup@server:/backup/user/docs/# Change source directory
!!:s/docs/pictures/
# Becomes: rsync -av /home/user/pictures/ backup@server:/backup/user/docs/
# Change both source and destination
!!:s/docs/pictures/:s/user\/docs/user\/pictures/
# Global changes
!!:gs/docs/pictures/
2. 与其他功能结合
# Previous: find /var/log -name "*.log" -type f -exec ls -l {} \;# Modify to use different action
!!:s/-exec ls -l/-exec wc -l/
# Count lines instead of listing
# Extract just the find portion
!:0-4 # find /var/log -name "*.log" -type f
# Use arguments with different command
grep "error" !!:3 # grep "error" "*.log"
3. 使用多个命令
# Pipeline command
ps aux | grep apache | grep -v grep
# Modify the grep pattern
!!:s/apache/nginx/
# Becomes: ps aux | grep nginx | grep -v grep
# Extract just part of pipeline
!:0-2 # ps aux | grep apache
# Add to existing pipeline
!! | wc -l # Count the results
交互式功能
1. 历史验证
# Enable history verification (before execution)set +H # Disable history expansion
set -H # Enable history expansion
# Show command before execution
shopt -s histverify
# Now !! will show the command and wait for Enter
2. 历史搜索
# Ctrl+R - Reverse search# Type to search through history# Ctrl+R again to find previous matches# Search for specific command
!?git commit? # Find last command containing "git commit"
!?ssh? # Find last command containing "ssh"
配置和设置
1. 历史设置
# History sizeexport HISTSIZE=1000 # Commands in memory
export HISTFILESIZE=2000 # Commands in file
# History control
export HISTCONTROL=ignoreboth # Ignore duplicates and spaces
export HISTCONTROL=ignoredups # Ignore duplicates only
# History ignore patterns
export HISTIGNORE="ls:cd:cd -:pwd:exit:date:* --help"
# Timestamp in history
export HISTTIMEFORMAT="%F %T "
2. 历史扩展设置
# Check if history expansion is enabledset +o | grep histexpand
# Enable history expansion
set -H
# or
set -o histexpand
# Disable history expansion
set +H
# or
set +o histexpand
安全性和最佳实践
1. 执行前验证
# Enable command verificationshopt -s histverify
# This makes !! show the command first, requiring Enter to execute
# Check what command will be executed
history | tail -1 # See last command
echo !! # See what !! would execute (without running it)
2. 安全实践
# Be careful with destructive commands
rm -rf /tmp/*
# Don't blindly run !! after such commands
# Use history to verify
history | tail -5 # Check recent commands
# For critical operations, type commands fully
# Don't rely on history expansion for:
# - rm commands
# - chmod commands
# - System configuration changes
3. 调试
# See history expansion in actionset -x # Enable command tracing
!! # You'll see the expanded command
set +x # Disable tracing
# Check history before using
history 10 # Show last 10 commands
!-2 # Run 2nd to last command
常见模式和快捷键
1. 常见组合
# Add sudo to last command
sudo !!
# Redirect last command output
!! > output.txt
!! 2>&1 | tee log.txt
# Background last command
!! &
# Time last command
time !!
# Run last command in different directory
(cd /tmp && !!)
2. 文件和目录操作
# Previous: vi /etc/apache2/sites-available/default# Test the configuration
apache2ctl -t
# Copy the file
cp !!:$ !!:$:r.backup # cp /etc/apache2/sites-available/default /etc/apache2/sites-available/default.backup
# Edit related file
vi !!:h/sites-enabled/default # vi /etc/apache2/sites-enabled/default
3. 网络和系统命令
# Check service status
systemctl status apache2
# Restart if needed
sudo !!:s/status/restart/ # sudo systemctl restart apache2
# Check multiple services
systemctl status nginx
!!:s/nginx/mysql/ # systemctl status mysql
!!:s/mysql/postgresql/ # systemctl status postgresql
与脚本集成
1. 脚本中的历史
#!/bin/bash# Note: History expansion doesn't work in scripts by default# Enable it explicitly if neededset -H # Enable history expansion in script
# Use variables instead of history expansion in scripts
last_command="$1"
echo "Re-running: $last_command"
eval "$last_command"
2. 交互式脚本
#!/bin/bash# Interactive script using history conceptswhile true; do
read -p "Command: " cmd
if [ "$cmd" = "!!" ]; then
echo "Re-running: $last_cmd"
eval "$last_cmd"
elif [ "$cmd" = "exit" ]; then
break
else
eval "$cmd"
last_cmd="$cmd"
fi
done
替代命令和相关命令
1. fc(修复命令)
# Edit last command in editorfc# Edit specific command numberfc 123
# List recent commands
fc -l
# Re-run range of commands
fc -s 100 105
2. history 命令
# Show command historyhistory# Show last 10 commandshistory 10
# Execute specific command number
!123
# Search and execute
history | grep git
!456
故障排除
1. 历史扩展不起作用
# Check if enabledset +o | grep histexpand
# Enable it
set -H
# Check in current shell
echo $- # Should contain 'H'
2. 预期之外的扩展
# Escape ! to prevent expansionecho "The price is \$5\!"
# Use single quotes
echo 'The price is $5!'
# Disable temporarily
set +H
echo "Commands with ! work normally"
set -H
3. 复杂命令问题
# For very complex commands, use variables
complex_cmd="find /var/log -name '*.log' -exec grep 'error' {} \;"
eval "$complex_cmd"
# Then modify variable instead of using history expansion
complex_cmd="${complex_cmd/error/warning}"
eval "$complex_cmd"
重要注意事项
-
仅交互式:历史扩展主要在交互式 shell 中工作
-
不在脚本中:通常在脚本中禁用以提高安全性
-
特定于 shell:这是一个 bash/zsh 特性,并非所有 shell 都可用
-
验证:使用
histverify选项在具有破坏性的命令中提高安全性 -
大小写敏感:历史扩展是大小写敏感的
-
立即执行:!! 立即执行;在使用具有破坏性的命令时要小心
!! 命令和历史扩展功能是高效的命令行工具,但它们需要理解和谨慎使用以避免错误。
更多详细信息,请查看 bash 手册:man bash(搜索“历史扩展”)
tty命令
tty命令打印连接到标准输入的终端文件名。它显示你当前正在使用的终端设备,并可以确定输入是否来自终端或从文件或管道重定向。
语法
tty [options]
关键特性
-
终端识别:显示当前终端设备
-
重定向检测:确定输入是否来自终端或文件
-
会话信息:帮助识别终端会话
-
脚本支持:退出码指示终端与非终端
基本用法
显示当前终端
# Display current terminal device
tty
# Example outputs:
# /dev/pts/0 (pseudo-terminal)
# /dev/tty1 (console terminal)
# /dev/ttys000 (macOS terminal)
检查是否为终端
# Silent mode - just check if it's a terminal
tty -s
# Check exit code
tty -s && echo "Running in terminal" || echo "Not in terminal"
# Example usage in scripts
if tty -s; then
echo "Interactive mode"
else
echo "Non-interactive mode"
fi
常用选项
基本选项
# -s: Silent mode (no output, just exit code)
tty -s
# --help: Show help information
tty --help
# --version: Show version information
tty --version
理解终端类型
1. 物理终端
# Console terminals (virtual consoles)# /dev/tty1, /dev/tty2, /dev/tty3, etc.# Switch to virtual console and check# Ctrl+Alt+F1 (then login)
tty
# Output: /dev/tty1
2. 伪终端
# Most common in desktop environments# /dev/pts/0, /dev/pts/1, /dev/pts/2, etc.# In terminal emulator
tty
# Output: /dev/pts/0
# Each new terminal window gets new pts number
3. 串行终端
# Serial console connections
# /dev/ttyS0, /dev/ttyS1, etc.
# USB serial devices
# /dev/ttyUSB0, /dev/ttyUSB1, etc.
实际示例
1. 会话识别
# Identify current sessionecho "Current session: $(tty)"
# Show user and terminal
echo "User: $(whoami) on $(tty)"
# Show all users and their terminals
who
# Show current user's terminals
who | grep $(whoami)
2. 多终端脚本
#!/bin/bash# Script that behaves differently based on terminal
current_tty=$(tty)
echo "Running on: $current_tty"
case "$current_tty" in
/dev/tty[1-6])
echo "Running on virtual console"
# Console-specific behavior
;;
/dev/pts/*)
echo "Running in terminal emulator"
# Terminal emulator behavior
;;
*)
echo "Unknown terminal type"
;;
esac
3. 交互式与非交互式检测
#!/bin/bash# Detect if script is running interactivelyif tty -s; then
echo "Interactive mode - can prompt user"
read -p "Enter your name: " name
echo "Hello, $name!"
else
echo "Non-interactive mode - using defaults"
name="User"
echo "Hello, $name!"
fi
4. 终端特定配置
#!/bin/bash# Configure based on terminal capabilities
current_tty=$(tty)
if [[ "$current_tty" =~ ^/dev/pts/ ]]; then
# Modern terminal emulator
echo -e "\e[32mGreen text\e[0m"
echo -e "\e[1mBold text\e[0m"
elif [[ "$current_tty" =~ ^/dev/tty[1-6]$ ]]; then
# Virtual console - limited capabilities
echo "Plain text output"
else
echo "Unknown terminal - safe output"
fi
脚本应用
1. 条件用户交互
#!/bin/bash# Only prompt if running in terminalask_confirmation() {
local message="$1"
if tty -s; then
read -p "$message (y/n): " response
case "$response" in
[Yy]|[Yy][Ee][Ss]) return 0 ;;
*) return 1 ;;
esac
else
# Non-interactive - assume yes
echo "$message: Assumed yes (non-interactive)"
return 0
fi
}
# Usage
if ask_confirmation "Delete old files?"; then
echo "Deleting files..."
else
echo "Keeping files..."
fi
2. 进度指示器
#!/bin/bash# Show progress only in terminalshow_progress() {
if tty -s; then
echo -n "Processing: "
for i in {1..10}; do
echo -n "."
sleep 0.5
done
echo " Done!"
else
echo "Processing... Done!"
fi
}
show_progress
3. 日志行为
#!/bin/bash# Different logging based on terminallog_message() {
local level="$1"
local message="$2"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
if tty -s; then
# Terminal output - colored
case "$level" in
INFO) echo -e "\e[32m[$timestamp] INFO: $message\e[0m" ;;
WARN) echo -e "\e[33m[$timestamp] WARN: $message\e[0m" ;;
ERROR) echo -e "\e[31m[$timestamp] ERROR: $message\e[0m" ;;
esac
else
# Non-terminal output - plain
echo "[$timestamp] $level: $message"
fi
}
# Usage
log_message "INFO" "Script started"
log_message "WARN" "Low disk space"
log_message "ERROR" "Connection failed"
终端会话管理
1. 会话信息
# Get detailed session infoget_session_info() {
echo "=== Session Information ==="
echo "Terminal: $(tty)"
echo "User: $(whoami)"
echo "Shell: $SHELL"
echo "PID: $$"
echo "PPID: $PPID"
echo "Session ID: $(ps -o sid= -p $$)"
echo "Process Group: $(ps -o pgid= -p $$)"
}
get_session_info
2. 多终端检测
# Count user's active terminalscount_user_terminals() {
local user=$(whoami)
local count=$(who | grep "^$user " | wc -l)
echo "User $user has $count active terminals"
echo "Active sessions:"
who | grep "^$user " | while read line; do
echo " $line"
done
}
count_user_terminals
3. 终端通信
# Send message to specific terminalsend_to_terminal() {
local target_tty="$1"
local message="$2"
if [ -w "$target_tty" ]; then
echo "Message from $(tty): $message" > "$target_tty"
echo "Message sent to $target_tty"
else
echo "Cannot write to $target_tty"
fi
}
# Usage (if permissions allow)
# send_to_terminal "/dev/pts/1" "Hello from another terminal!"
与其他命令的集成
1. 与 ps 结合使用
# Find processes in current terminal
current_tty=$(tty | sed 's|/dev/||')
ps -t "$current_tty"
# Show process tree for current terminal
pstree -p $(ps -t "$current_tty" -o pid --no-headers | head -1)
2. 与 who/w 结合使用
# Show who is on the same terminal type
current_tty_type=$(tty | cut -d'/' -f3 | sed 's/[0-9]*$//')
who | grep "$current_tty_type"
# Detailed information about current session
w | grep "$(tty | sed 's|/dev/||')"
3. 系统监控
# Monitor terminal activitymonitor_terminals() {
echo "Active terminals:"
ls -la /dev/pts/
echo
echo "Users and terminals:"
who
echo
echo "Current session:"
echo " TTY: $(tty)"
echo " Uptime: $(uptime)"
}
monitor_terminals
安全性和权限
1. 终端权限
# Check terminal permissionscheck_tty_permissions() {
local current_tty=$(tty)
echo "Terminal: $current_tty"
ls -la "$current_tty"
# Check if others can write to terminal
if [ -w "$current_tty" ]; then
echo "Terminal is writable"
else
echo "Terminal is not writable"
fi
}
check_tty_permissions
2. 安全终端检查
# Verify secure terminal environmentcheck_secure_terminal() {
if ! tty -s; then
echo "WARNING: Not running in a terminal"
return 1
fi
local current_tty=$(tty)
local tty_perms=$(ls -la "$current_tty" | cut -d' ' -f1)
if [[ "$tty_perms" =~ .*w.*w.* ]]; then
echo "WARNING: Terminal is world-writable"
return 1
fi
echo "Terminal security check passed"
return 0
}
check_secure_terminal
调试和故障排除
1. 终端问题
# Debug terminal problemsdebug_terminal() {
echo "=== Terminal Debug Information ==="
echo "TTY: $(tty 2>/dev/null || echo "No TTY")"
echo "TERM: $TERM"
echo "Interactive: $(tty -s && echo "Yes" || echo "No")"
echo "Standard input: $(file /proc/self/fd/0 | cut -d: -f2-)"
echo "Standard output: $(file /proc/self/fd/1 | cut -d: -f2-)"
echo "Standard error: $(file /proc/self/fd/2 | cut -d: -f2-)"
}
debug_terminal
2. 重定向检测
# Detect various input/output scenariosdetect_io_redirection() {
echo "Input/Output Analysis:"
if tty -s; then
echo " Standard input: Terminal ($(tty))"
else
echo " Standard input: Redirected/Pipe"
fi
if [ -t 1 ]; then
echo " Standard output: Terminal"
else
echo " Standard output: Redirected/Pipe"
fi
if [ -t 2 ]; then
echo " Standard error: Terminal"
else
echo " Standard error: Redirected/Pipe"
fi
}
detect_io_redirection
3. 会话恢复
# Help recover lost terminal sessionsfind_my_sessions() {
local user=$(whoami)
echo "Finding sessions for user: $user"
echo "Current TTY: $(tty)"
echo
echo "All active sessions:"
who | grep "^$user "
echo
echo "Screen sessions:"
screen -ls 2>/dev/null || echo "No screen sessions"
echo
echo "Tmux sessions:"
tmux list-sessions 2>/dev/null || echo "No tmux sessions"
}
find_my_sessions
高级用法
1. 终端多路复用集成
# Detect if running inside multiplexerdetect_multiplexer() {
if [ -n "$TMUX" ]; then
echo "Running inside tmux"
echo " Session: $(tmux display-message -p '#S')"
echo " Window: $(tmux display-message -p '#W')"
echo " Pane: $(tmux display-message -p '#P')"
elif [ -n "$STY" ]; then
echo "Running inside screen"
echo " Session: $STY"
else
echo "Not in a multiplexer"
fi
echo "TTY: $(tty)"
}
detect_multiplexer
2. 远程会话检测
# Detect remote vs local sessionsdetect_session_type() {
local current_tty=$(tty)
if [ -n "$SSH_CONNECTION" ]; then
echo "Remote SSH session"
echo " From: $(echo $SSH_CONNECTION | cut -d' ' -f1,2)"
echo " To: $(echo $SSH_CONNECTION | cut -d' ' -f3,4)"
elif [[ "$current_tty" =~ ^/dev/tty[1-6]$ ]]; then
echo "Local console session"
elif [[ "$current_tty" =~ ^/dev/pts/ ]]; then
echo "Local terminal emulator"
else
echo "Unknown session type"
fi
echo "TTY: $current_tty"
}
detect_session_type
最佳实践
1. 安全脚本
# Always check for terminal before interactive operationssafe_interactive() {
if ! tty -s; then
echo "Error: This script requires a terminal" >&2
exit 1
fi
# Proceed with interactive operations
read -p "Continue? (y/n): " response
}
2. 跨平台兼容性
# Handle different systemsget_terminal_info() {
if command -v tty >/dev/null 2>&1; then
local terminal=$(tty 2>/dev/null)
if [ $? -eq 0 ]; then
echo "$terminal"
else
echo "not a tty"
fi
else
echo "tty command not available"
fi
}
3. 错误处理
# Robust terminal checkingcheck_terminal_safe() {
local tty_output
tty_output=$(tty 2>/dev/null)
local exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "Terminal: $tty_output"
return 0
else
echo "Not a terminal (exit code: $exit_code)"
return 1
fi
}
重要提示
-
退出码:如果 stdin 是终端,则 tty 返回 0,否则返回非零值
-
静默模式:对于只需检查终端状态的脚本,使用
-s -
重定向:当 stdin 从文件或管道重定向时,输出会改变
-
安全性:注意终端权限和写入访问
-
可移植性:在大多数类 Unix 系统中可用
-
会话管理:对多路复用和会话跟踪很有用
tty命令对于需要检测终端环境并在交互式与非交互式环境中适当行为的脚本至关重要。
更多详细信息,请查看手册:man tty
lspci命令
lspci命令列出系统连接的所有 PCI(外围组件互连)设备。它提供了关于硬件组件的详细信息,包括显卡、网络适配器、声卡、存储控制器以及其他基于 PCI 的设备。
语法
lspci [options]
关键特性
-
硬件检测:列出所有 PCI 设备
-
详细信息:供应商、设备、类别和能力
-
树视图:显示设备层次结构和关系
-
过滤选项:按供应商、设备或类别搜索
-
详细输出:多级详细信息
基本用法
简单设备列表
# List all PCI devices
lspci
# Example output:
# 00:00.0 Host bridge: Intel Corporation Device 9b61
# 00:01.0 PCI bridge: Intel Corporation Device 1901
# 00:02.0 VGA compatible controller: Intel Corporation Device 9bc4
# 00:14.0 USB controller: Intel Corporation Device a36d
人类可读输出
# Show device names instead of just IDs
lspci -nn
# More verbose output
lspci -v
# Very verbose output (includes everything)
lspci -vv
# Extremely verbose output
lspci -vvv
常见选项
基本选项
# -v: Verbose (show detailed info)
lspci -v
# -vv: Very verbose
lspci -vv
# -n: Show numeric IDs instead of names
lspci -n
# -nn: Show both names and numeric IDs
lspci -nn
# -k: Show kernel drivers
lspci -k
显示选项
# -t: Tree format
lspci -t
# -tv: Tree format with verbose info
lspci -tv
# -x: Show hex dump of config space
lspci -x
# -xxx: Show full hex dump
lspci -xxx
过滤和选择
1. 按设备类型
# Graphics cards
lspci | grep -i vga
lspci | grep -i display
# Network adapters
lspci | grep -i network
lspci | grep -i ethernet
# USB controllers
lspci | grep -i usb
# Sound cards
lspci | grep -i audio
lspci | grep -i sound
# Storage controllers
lspci | grep -i storage
lspci | grep -i sata
2. 按供应商
# Intel devices
lspci | grep -i intel
# AMD devices
lspci | grep -i amd
# NVIDIA devices
lspci | grep -i nvidia
# Broadcom devices
lspci | grep -i broadcom
3. 特定设备选择
# Select specific device by bus ID
lspci -s 00:02.0
# Select multiple devices
lspci -s 00:02.0,00:14.0
# Select by vendor ID
lspci -d 8086:
# Select by vendor and device ID
lspci -d 8086:9bc4
详细信息
1. 详细设备信息
# Show capabilities and features
lspci -v
# Example output includes:
# - Memory addresses
# - IRQ assignments
# - Capabilities (MSI, Power Management, etc.)
# - Kernel modules/drivers
# Very detailed information
lspci -vv
# Includes:
# - Extended capabilities
# - Configuration registers
# - Link status and speeds
2. 驱动程序信息
# Show which kernel drivers are in use
lspci -k
# Example output:
# 00:02.0 VGA compatible controller: Intel Corporation Device 9bc4
# Subsystem: Dell Device 097d
# Kernel driver in use: i915
# Kernel modules: i915
# Combine with verbose for more detail
lspci -vk
3. 配置空间
# Show configuration space (hex dump)
lspci -x
# Full configuration space
lspci -xxx
# Specific device configuration
lspci -s 00:02.0 -xxx
树视图和拓扑
1. 设备层次结构
# Show device tree structure
lspci -t
# Example output:
# -[0000:00]-+-00.0 Intel Corporation Device 9b61
# +-01.0-[01]--
# +-02.0 Intel Corporation Device 9bc4
# +-14.0 Intel Corporation Device a36d
# Tree with device names
lspci -tv
2. 总线信息
# Show bridges and connections
lspci -tv | grep -E "(bridge|Bridge)"
# PCI Express information
lspci -vv | grep -A 5 -B 5 "Express"
# Link capabilities and status
lspci -vv | grep -E "(Link|Speed|Width)"
硬件分析
1. 显卡信息
# List graphics devicesget_gpu_info() {
echo "=== Graphics Cards ==="
lspci | grep -i -E "(vga|display|3d)"
echo
echo "=== Detailed GPU Information ==="
lspci -v | grep -A 10 -B 2 -i -E "(vga|display)"
echo
echo "=== GPU Drivers ==="
lspci -k | grep -A 3 -B 1 -i -E "(vga|display)"
}
get_gpu_info
2. 网络接口分析
# Network adapter detailsget_network_info() {
echo "=== Network Adapters ==="
lspci | grep -i -E "(network|ethernet|wireless)"
echo
echo "=== Network Driver Information ==="
lspci -k | grep -A 3 -B 1 -i -E "(network|ethernet)"
echo
echo "=== Wireless Capabilities ==="
lspci -vv | grep -A 20 -B 5 -i wireless
}
get_network_info
3. 存储控制器信息
# Storage device detailsget_storage_info() {
echo "=== Storage Controllers ==="
lspci | grep -i -E "(storage|sata|ide|scsi|nvme)"
echo
echo "=== Storage Driver Information ==="
lspci -k | grep -A 3 -B 1 -i -E "(storage|sata|ahci)"
echo
echo "=== SATA Capabilities ==="
lspci -vv | grep -A 10 -B 2 -i sata
}
get_storage_info
系统分析脚本
1. 硬件清单
#!/bin/bash# Complete hardware inventory using lspcihardware_inventory() {
echo "=== PCI Hardware Inventory ==="
echo "Generated: $(date)"
echo
echo "--- System Overview ---"
lspci | wc -l | xargs echo "Total PCI devices:"
echo
echo "--- Graphics ---"
lspci | grep -i -E "(vga|display|3d)" || echo "No graphics devices found"
echo
echo "--- Network ---"
lspci | grep -i -E "(network|ethernet|wireless)" || echo "No network devices found"
echo
echo "--- Storage ---"
lspci | grep -i -E "(storage|sata|ide|nvme)" || echo "No storage controllers found"
echo
echo "--- Audio ---"
lspci | grep -i -E "(audio|sound|multimedia)" || echo "No audio devices found"
echo
echo "--- USB Controllers ---"
lspci | grep -i usb || echo "No USB controllers found"
echo
echo "--- Other Devices ---"
lspci | grep -v -i -E "(vga|display|3d|network|ethernet|wireless|storage|sata|ide|nvme|audio|sound|multimedia|usb|bridge|host)" || echo "No other devices"
}
hardware_inventory > hardware_inventory.txt
2. 驱动状态检查
#!/bin/bash# Check driver status for all PCI devicescheck_drivers() {
echo "=== PCI Driver Status ==="
lspci | while read line; do
device_id=$(echo "$line" | cut -d' ' -f1)
device_name=$(echo "$line" | cut -d' ' -f2-)
driver_info=$(lspci -k -s "$device_id" | grep "Kernel driver in use")
if [ -n "$driver_info" ]; then
driver=$(echo "$driver_info" | cut -d':' -f2 | xargs)
echo "✓ $device_id: $device_name -> $driver"
else
echo "✗ $device_id: $device_name -> NO DRIVER"
fi
done
}
check_drivers
3. 性能分析
#!/bin/bash# Analyze PCI device performance capabilitiesanalyze_performance() {
echo "=== PCI Performance Analysis ==="
echo "--- PCIe Link Speeds ---"
lspci -vv | grep -A 1 -B 1 "Link.*Speed" | grep -E "(:|Speed|Width)"
echo
echo "--- Memory Mappings ---"
lspci -v | grep -E "(Memory at|I/O ports at)" | sort | uniq -c | sort -nr
echo
echo "--- Power Management ---"
lspci -vv | grep -c "Power Management" | xargs echo "Devices with power management:"
echo
echo "--- MSI Capabilities ---"
lspci -vv | grep -c "MSI:" | xargs echo "Devices with MSI support:"
echo
echo "--- 64-bit Devices ---"
lspci -vv | grep -c "64-bit" | xargs echo "64-bit capable devices:"
}
analyze_performance
故障排除
1. 设备检测问题
# Check if device is detectedcheck_device_detection() {
local search_term="$1"
echo "Searching for: $search_term"
devices=$(lspci | grep -i "$search_term")
if [ -n "$devices" ]; then
echo "✓ Device(s) found:"
echo "$devices"
echo
echo "Driver information:"
echo "$devices" | while read line; do
device_id=$(echo "$line" | cut -d' ' -f1)
lspci -k -s "$device_id" | grep -E "(driver|module)"
done
else
echo "✗ No devices found matching '$search_term'"
echo "Try checking:"
echo " - Physical connections"
echo " - BIOS/UEFI settings"
echo " - Power supply"
fi
}
# Usage examples
check_device_detection "graphics"
check_device_detection "network"
2. 驱动程序问题
# Find devices without driversfind_missing_drivers() {
echo "=== Devices Without Drivers ==="
lspci | while read line; do
device_id=$(echo "$line" | cut -d' ' -f1)
device_name=$(echo "$line" | cut -d' ' -f2-)
if ! lspci -k -s "$device_id" | grep -q "Kernel driver in use"; then
echo "Missing driver: $device_id - $device_name"
# Try to find available modules
modules=$(lspci -k -s "$device_id" | grep "Kernel modules:" | cut -d':' -f2)
if [ -n "$modules" ]; then
echo " Available modules:$modules"
fi
fi
done
}
find_missing_drivers
3. 硬件兼容性
# Check hardware compatibilitycheck_compatibility() {
echo "=== Hardware Compatibility Check ==="
echo "--- Unsupported Devices ---"
lspci -nn | while read line; do
if echo "$line" | grep -q "\[ffff:"; then
echo "Possible unsupported device: $line"
fi
done
echo
echo "--- Legacy Devices ---"
lspci | grep -i -E "(legacy|isa|parallel|serial|floppy)" || echo "No legacy devices found"
echo
echo "--- Vendor Support ---"
echo "Intel devices: $(lspci | grep -i intel | wc -l)"
echo "AMD devices: $(lspci | grep -i amd | wc -l)"
echo "NVIDIA devices: $(lspci | grep -i nvidia | wc -l)"
echo "Other vendors: $(lspci | grep -v -i -E "(intel|amd|nvidia)" | wc -l)"
}
check_compatibility
高级用法
1. 配置空间分析
# Analyze specific device configurationanalyze_device_config() {
local device_id="$1"
echo "=== Configuration Analysis for $device_id ==="
echo "--- Basic Information ---"
lspci -s "$device_id" -v
echo
echo "--- Configuration Space ---"
lspci -s "$device_id" -x
echo
echo "--- Capabilities ---"
lspci -s "$device_id" -vv | grep -A 20 "Capabilities:"
}
# Usage: analyze_device_config "00:02.0"
2. 带宽分析
# Analyze PCIe bandwidthanalyze_bandwidth() {
echo "=== PCIe Bandwidth Analysis ==="
lspci -vv | grep -A 2 -B 2 "Express.*Root Port\|Express.*Endpoint" | \
while read line; do
if echo "$line" | grep -q "Express"; then
echo "Device: $line"
elif echo "$line" | grep -q "Link.*Speed"; then
echo " $line"
fi
done
}
analyze_bandwidth
3. 电源管理
# Check power management capabilitiescheck_power_management() {
echo "=== Power Management Status ==="
lspci -vv | grep -B 5 -A 10 "Power Management" | \
grep -E "(^[0-9a-f]{2}:[0-9a-f]{2}\.[0-9]|Power Management|PME)"
}
check_power_management
与其他工具集成
1. 与 lsmod 结合
# Match PCI devices with loaded modulesmatch_devices_modules() {
echo "=== PCI Devices and Kernel Modules ==="
lspci -k | grep -E "(^[0-9a-f]{2}:|Kernel driver|Kernel modules)" | \
while read line; do
if [[ "$line" =~ ^[0-9a-f]{2}: ]]; then
echo "$line"
elif [[ "$line" =~ "Kernel driver in use:" ]]; then
driver=$(echo "$line" | cut -d':' -f2 | xargs)
echo " Active driver: $driver"
lsmod | grep "^$driver" && echo " ✓ Module loaded" || echo " ✗ Module not found"
fi
done
}
2. 与 udev 结合
# Check udev rules for PCI devicescheck_udev_rules() {
local device_id="$1"
echo "Checking udev rules for device: $device_id"
# Get vendor and device IDs
vendor_device=$(lspci -n -s "$device_id" | awk '{print $3}')
vendor_id=$(echo "$vendor_device" | cut -d':' -f1)
device_id_hex=$(echo "$vendor_device" | cut -d':' -f2)
echo "Vendor ID: $vendor_id, Device ID: $device_id_hex"
# Search udev rules
find /etc/udev/rules.d /lib/udev/rules.d -name "*.rules" -exec grep -l "$vendor_id\|$device_id_hex" {} \; 2>/dev/null
}
安全考虑
1. 硬件安全
# Check for security-relevant hardwarecheck_security_hardware() {
echo "=== Security Hardware Check ==="
echo "--- TPM Devices ---"
lspci | grep -i tpm || echo "No TPM devices found"
echo
echo "--- Virtualization Support ---"
lspci -vv | grep -i -E "(vt-x|amd-v|virtualization)" || echo "Check CPU flags for virtualization"
echo
echo "--- IOMMU Support ---"
lspci -vv | grep -i iommu || echo "No explicit IOMMU references found"
echo
echo "--- Hardware Security Modules ---"
lspci | grep -i -E "(security|crypto|hsm)" || echo "No HSM devices found"
}
check_security_hardware
最佳实践
1. 定期硬件监控
# Create hardware monitoring script#!/bin/bash# Monitor hardware changes
BASELINE_FILE="/var/lib/hardware_baseline.txt"
CURRENT_FILE="/tmp/current_hardware.txt"
# Generate current state
lspci -nn > "$CURRENT_FILE"
# Compare with baseline
if [ -f "$BASELINE_FILE" ]; then
if ! diff -q "$BASELINE_FILE" "$CURRENT_FILE" >/dev/null; then
echo "Hardware configuration changed!"
echo "Changes:"
diff "$BASELINE_FILE" "$CURRENT_FILE"
fi
else
echo "Creating hardware baseline"
fi
# Update baseline
cp "$CURRENT_FILE" "$BASELINE_FILE"
2. 文档
# Generate hardware documentationdocument_hardware() {
local output_file="hardware_documentation_$(date +%Y%m%d).txt"
{
echo "Hardware Documentation"
echo "Generated: $(date)"
echo "Hostname: $(hostname)"
echo "========================="
echo
echo "PCI Device Summary:"
lspci | wc -l | xargs echo "Total devices:"
echo
echo "Detailed Device List:"
lspci -nn
echo
echo "Driver Status:"
lspci -k
echo
echo "Device Tree:"
lspci -tv
} > "$output_file"
echo "Documentation saved to: $output_file"
}
重要注意事项
-
根访问:一些详细信息需要 root 权限
-
硬件检测:仅显示连接到 PCI 总线的设备
-
驱动状态:显示当前加载的驱动程序,并非所有可用的驱动程序
-
更新:设备信息从内核读取,可能需要硬件重新扫描
-
供应商 ID:数字 ID 是标准化的,名称来自 PCI ID 数据库
-
树视图:显示物理总线拓扑和设备关系
lspci命令对于硬件故障排除、驱动程序管理和系统分析至关重要。
更多详细信息,请查看手册:man lspci
cfdisk 命令
cfdisk 命令是 Linux 的基于 curses 的磁盘分区工具。它提供了一个用户友好的、基于文本的界面,用于创建、删除和管理磁盘分区。与 fdisk 不同,cfdisk 提供了一个更直观的菜单驱动方法。
语法
cfdisk [options] [device]
关键特性
-
交互式界面: 菜单驱动分区管理
-
实时显示: 显示当前分区表
-
安全操作: 需要显式写入命令以保存更改
-
多种文件系统: 支持各种分区类型
-
调整大小支持: 可以调整现有分区的大小
基本用法
启动 cfdisk
# Open cfdisk on primary disk
sudo cfdisk /dev/sda
# Open cfdisk on secondary disk
sudo cfdisk /dev/sdb
# Auto-detect and use first available disk
sudo cfdisk
导航
-
上/下箭头: 在分区之间导航
-
左/右箭头: 在菜单选项之间导航
-
Enter: 选择菜单选项
-
Tab: 在界面元素之间移动
菜单选项
主要操作
-
新: 创建新分区
-
删除: 删除所选分区
-
调整大小: 调整所选分区的大小
-
类型: 更改分区类型
-
写入: 将更改写入磁盘
-
退出: 退出而不保存(如果没有写入更改)
其他选项
-
可引导: 切换可引导标志
-
验证: 检查分区表一致性
-
打印: 显示分区信息
常见任务
1. 创建新分区
# Start cfdisk
sudo cfdisk /dev/sdb
# Steps in cfdisk:
# 1\. Select "New" from menu
# 2\. Choose partition size
# 3\. Select partition type (primary/extended)
# 4\. Choose partition type (Linux, swap, etc.)
# 5\. Select "Write" to save changes
# 6\. Type "yes" to confirm
# 7\. Select "Quit" to exit
2. 删除分区
# In cfdisk interface:
# 1\. Navigate to partition to delete
# 2\. Select "Delete" from menu
# 3\. Confirm deletion
# 4\. Select "Write" to save changes
# 5\. Type "yes" to confirm
3. 更改分区类型
# In cfdisk interface:
# 1\. Navigate to target partition
# 2\. Select "Type" from menu
# 3\. Choose new partition type from list
# 4\. Select "Write" to save changes
常见分区类型
Linux 分区类型
-
83: Linux 文件系统
-
82: Linux 交换分区
-
8e: Linux LVM
-
fd: Linux RAID 自动检测
其他常见类型
-
07: NTFS/HPFS
-
0c: FAT32 LBA
-
ef: EFI 系统分区
-
01: FAT12
命令行选项
# Show help
cfdisk --help
# Show version
cfdisk --version
# Use alternative device
cfdisk /dev/sdc
# Start with specific partition table type
cfdisk -t gpt /dev/sdb
cfdisk -t dos /dev/sdb
实际示例
1. 分区新 USB 驱动器
# Insert USB drive (assume it's /dev/sdc)# Check device name
lsblk
# Start cfdisk
sudo cfdisk /dev/sdc
# Create new partition table if needed
# Create partitions as needed
# Write changes and quit
2. 添加交换分区
# Start cfdisk on target disk
sudo cfdisk /dev/sda
# Create new partition
# Set type to "82" (Linux swap)
# Write changes
# Format as swap
sudo mkswap /dev/sda3
# Enable swap
sudo swapon /dev/sda3
3. 为 LVM 准备磁盘
# Start cfdisk
sudo cfdisk /dev/sdb
# Create partition
# Set type to "8e" (Linux LVM)
# Write changes
# Create physical volume
sudo pvcreate /dev/sdb1
安全特性
1. 变更跟踪
# cfdisk tracks all changes
# Shows asterisk (*) next to modified partitions
# Changes only applied when "Write" is selected
2. 需要确认
# Writing changes requires typing "yes"
# Provides final warning before applying changes
# Can quit without saving if no "Write" performed
3. 验证
# Built-in partition table verification
# Warns about potential issues
# Suggests corrections for problems
与不同分区表一起工作
1. GPT (GUID 分区表)
# Create GPT partition table
sudo cfdisk -t gpt /dev/sdb
# Features:
# - Supports >2TB disks
# - Up to 128 partitions
# - Backup partition table
# - 64-bit LBA addressing
2. MBR/DOS 分区表
# Create MBR partition table
sudo cfdisk -t dos /dev/sdb
# Limitations:
# - 4 primary partitions maximum
# - 2TB disk size limit
# - Extended partitions for >4 partitions
与其他工具的集成
1. 分区后
# Verify partition creation
lsblk /dev/sdb
fdisk -l /dev/sdb
# Format partitions
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.xfs /dev/sdb2
# Mount partitions
sudo mkdir /mnt/partition1
sudo mount /dev/sdb1 /mnt/partition1
2. 变更前备份
# Backup partition table before changes
sudo sfdisk -d /dev/sdb > sdb_partition_backup.txt
# Restore if needed
sudo sfdisk /dev/sdb < sdb_partition_backup.txt
故障排除
1. 权限问题
# Must run as root or with sudo
sudo cfdisk /dev/sdb
# Check device permissions
ls -l /dev/sdb
2. 设备忙碌
# Unmount all partitions on device first
sudo umount /dev/sdb1
sudo umount /dev/sdb2
# Check for active processes
lsof /dev/sdb*
3. 分区表损坏
# Verify partition table
sudo cfdisk /dev/sdb
# If corrupted, recreate partition table
# (This will destroy all data!)
sudo cfdisk -t gpt /dev/sdb # For GPT
sudo cfdisk -t dos /dev/sdb # For MBR
最佳实践
1. 总是备份
# Backup important data before partitioning# Create partition table backup
sudo sfdisk -d /dev/sdb > partition_backup.txt
2. 验证设备
# Double-check device name before starting
lsblk
fdisk -l
# Ensure you're working on correct disk
3. 计划分区布局
# Plan your partition scheme:
# - Root partition (/)
# - Swap partition
# - Home partition (/home)
# - Boot partition (/boot) if needed
4. 考虑对齐
# Modern cfdisk handles alignment automatically
# Uses 1MB alignment by default
# Optimal for SSDs and advanced format drives
与其他工具的比较
与 fdisk 对比
-
cfdisk: 菜单驱动,用户友好
-
fdisk: 命令驱动,更可脚本化
与 parted 对比
-
cfdisk: 简单的界面,基本操作
-
parted: 更高级的功能,可命令行脚本化
与 gparted 对比
-
cfdisk: 基于文本,轻量级
-
gparted: 图形界面,需要 X11
重要注意事项
-
在修改分区之前始终卸载分区
-
除非你明确选择“写入”,否则更改不会写入
-
在进行分区更改之前备份重要数据
-
一些操作可能需要系统重启才能生效
-
在处理系统磁盘时请格外小心
-
考虑使用 LVM 进行更灵活的分区管理
cfdisk 命令在易用性和功能之间提供了优秀的平衡,适用于磁盘分区任务。
更多详细信息,请查看手册:man cfdisk
ifplugstatus 命令
ifplugstatus 命令是一个诊断工具,用于检查 Linux 系统上网络接口的物理链路状态。它报告接口(如 eth0、enp0s3 或 wlan0)是否有网络电缆连接。此工具特别适用于故障排除有线网络连接和检测未插拔的电缆。
语法
ifplugstatus [options] [interface]
参数
-
interface — 要检查的网络接口(例如,eth0、enp0s3、wlan0)。
-
选项 — 用于自定义输出的可选标志。
安装
ifplugstatus 是 ifplugd 软件包的一部分。您可以使用以下命令根据您的发行版进行安装:
# Ubuntu/Debian
sudo apt update
sudo apt install ifplugd
# CentOS/RHEL/Fedora
sudo yum install ifplugd
# or
sudo dnf install ifplugd
要验证安装:
which ifplugstatus
基本用法
1. 检查单个接口的状态
ifplugstatus eth0
样本输出:
eth0: link beat detected
或
eth0: link beat not detected
说明:
-
链路检测到链接 → 电缆已插入并激活。
-
链路检测未检测到 → 电缆未插拔或未激活。注意:'链路检测'是旧式以太网(10/100 Mbps)的术语。现代千兆位或更高接口可能使用不同的链路检测信号,但命令通常报告一个活动的物理链路。
2. 检查多个接口
ifplugstatus eth0 wlan0
样本输出:
eth0: link beat detected
wlan0: link beat not detected
这允许快速验证所有可用接口。
选项
一些流行的选项标志包括:
| 选项 | 描述 |
|---|---|
-a |
显示所有接口(默认行为)。 |
-i |
指定特定接口。 |
-s |
仅显示简短摘要。 |
-v |
详细输出,包含更多详细信息。 |
-q |
静默模式 — 最小输出。 |
-h |
显示帮助信息。 |
实际示例
1. 检查主以太网接口是否连接
ifplugstatus eth0
显示 eth0 的当前电缆连接状态。
2. 检查所有可用网络接口
ifplugstatus -a
列出每个检测到的接口的链路状态。
3. 使用详细模式以获取详细信息
ifplugstatus -v eth0
提供有关链路状态的更多描述性信息。
4. 脚本或自动化模式的静默模式
ifplugstatus -q eth0
仅输出必要信息,适用于 shell 脚本。
理解输出
典型输出可能如下所示:
eth0: link beat detected
enp0s3: link beat not detected
-
接口名称:eth0、enp0s3 等。
-
链路状态:指示是否存在物理链路(电缆或信号)。
当集成到脚本中时,这有助于自动化检测断开连接的接口或故障布线。
常见用例
1. 电缆连接测试
ifplugstatus eth0
快速验证电缆是否物理连接到网络端口。
2. 多接口监控
ifplugstatus eth0 wlan0
同时检查多个接口的链路活动。
3. 持续监控
watch -n 5 ifplugstatus eth0
每隔 5 秒更新接口状态,以进行实时链路监控。
常见问题故障排除
1. 接口未找到
如果提供了错误的接口名称:
eth5: No such device
修复方法: 使用 ip a 或 ifconfig 命令列出有效接口。
2. 权限拒绝
一些系统可能需要提升权限:
sudo ifplugstatus eth0
3. 命令未找到
如果命令缺失:
ifplugstatus: command not found
修复方法: 使用您的包管理器安装 ifplugd 软件包。
提示:始终确保已安装 ifplugd 软件包,并且您的用户有权访问网络接口。
相关命令
| 命令 | 描述 |
|---|---|
ip a(推荐)/ ifconfig |
显示所有网络接口及其详细信息。ip a是现代工具;ifconfig是旧版工具。 |
ethtool eth0 |
获取关于网络接口的高级信息。 |
nmcli device status |
通过 NetworkManager 检查连接状态。 |
ping |
在确认电缆连接后测试网络可达性。 |
重要注意事项
-
与有线以太网接口配合使用最佳。
-
无线接口可能不会总是准确报告链路状态。
-
工具为只读模式 — 它不会修改系统设置。
-
轻量级且适用于桌面和服务器环境的安全使用。
手册参考
对于更多信息和高阶使用:
man ifplugstatus
column 命令
column 命令用于将输入格式化为多列。它特别适用于创建基于文本的表格和改善命令输出的可读性。
命令语法
column [options] [file]...
命令选项
-
-t:自动确定列数并创建表格 -
-s:指定列分隔符(默认为空白字符) -
-n:不合并多个相邻的分隔符 -
-c:以指定宽度输出列格式 -
-x:在行之前填充列 -
-L:将所有条目左对齐 -
-R:将所有条目右对齐 -
-o:指定表格输出的列分隔符
示例
- 基本列格式化
# Create a simple list and format it into columns
ls | column
- 从分隔数据创建表格
# Format /etc/passwd entries into a neat table
cut -d: -f1,6,7 /etc/passwd | column -t -s:
- 格式化命令输出
# Display mount information in a clean tabular format
mount | column -t
- 自定义列分隔符
# Format CSV data with custom separatorecho -e "Name,Age,City\nJohn,25,NYC\nJane,30,LA" | column -t -s,
Name Age City
John 25 NYC
Jane 30 LA
- 左对齐表格
# Create a left-aligned table from space-separated data
ps aux | head -n 5 | column -t -L
注意: 选项如
-L和-R可能并非所有 Linux 发行版中都可用(主要是在 GNUcolumn中)。
将文件格式化为列(例如,data.txt)
column -t -s, data.txt
更多信息
-
column命令是util-linux软件包的一部分 -
它在 shell 脚本中用于格式化输出特别有用
-
可以处理文件输入和标准输入(stdin)
-
与其他文本处理命令如
cut、sort和grep一起使用效果良好
相关链接
-
cut命令 - 从文件中删除部分内容 -
sort命令 - 对文本文件的行进行排序 -
paste命令 - 合并文件的行 -
tr命令 - 转换或删除字符
进一步阅读
-
man column-column命令的手册页面
nmtui 命令
nmtui(网络管理器文本用户界面)命令是一个用于在 Linux 中配置网络连接的 菜单驱动工具。
它提供了一个简单、基于文本的界面来管理网络设置,如 Wi-Fi、以太网、主机名等,而无需使用复杂的命令行选项。
🔹 它的作用
nmtui 允许您:
-
查看和编辑 网络连接
-
激活或停用 接口
-
设置或更改系统 主机名
-
连接到 Wi-Fi 网络
-
管理 IPv4 / IPv6 设置
它在服务器或 没有图形桌面环境 的系统上特别有用。
🧠 语法
nmtui [选项]
🖥️ 示例
-
打开主菜单界面:
nmtui
打开主 TUI(文本用户界面)窗口,其中包含 编辑连接、激活连接 或 设置系统主机名 的选项。
-
直接编辑网络连接:
nmtui edit
允许您创建、修改或删除网络连接(包括以太网和 Wi-Fi)。
-
直接激活或停用连接:
nmtui connect
打开 激活连接 菜单,您可以在其中启用或禁用网络接口。
-
设置或更改系统主机名:
nmtui hostname
打开一个对话框来设置您的系统主机名(用于网络上的识别)。
-
直接连接到特定的 Wi-Fi 网络:
nmtui connect "MyWiFiNetwork"
如果范围内存在,则连接到指定的 Wi-Fi 网络。
-
退出界面:
简单地使用 Tab → 退出 或按 Esc。
🧩 常用选项和子命令
| 命令 | 描述 |
|---|---|
nmtui |
启动交互式主菜单 |
nmtui edit |
打开“编辑连接”屏幕 |
nmtui connect |
打开“激活连接”屏幕 |
nmtui hostname |
打开“设置系统主机名”对话框 |
nmtui connect <SSID> |
直接连接到特定的 Wi-Fi 网络 |
nmtui help |
显示基本使用帮助 |
⚙️ 接口导航
-
使用 箭头键 或 Tab 在字段之间移动。
-
按下 Enter 键进行选择。
-
使用 空格键 切换复选框或选项。
-
按下 Esc 或选择 退出 以安全退出。
📡 常见用例
1. 配置静态 IP 地址:
nmtui edit
→ 选择您的以太网连接
→ 将“IPv4 配置”设置为 手动
→ 输入 IP、网关和 DNS
→ 保存 → 激活连接
2. 从终端连接 Wi-Fi:
nmtui connect
→ 选择您的无线接口
→ 选择 SSID
→ 输入密码
→ 激活连接
3. 更改主机名:
nmtui hostname
→ 输入您的新主机名
→ 确认并退出
→ 新的主机名将立即生效。
🛠 故障排除
| 问题 | 可能的解决方案 |
|---|---|
nmtui 命令未找到 |
安装 NetworkManager TUI:sudo apt install network-manager(Debian/Ubuntu)或 sudo dnf install NetworkManager-tui(Fedora/RHEL/CentOS) |
| 变更不会生效 | 重新启动 NetworkManager:sudo systemctl restart NetworkManager |
| 接口未显示 | 确保您的接口由 NetworkManager 管理:检查 /etc/NetworkManager/NetworkManager.conf |
| Wi-Fi 缺失 | 确保已安装无线驱动程序,并且 nmcli device status 显示 Wi-Fi 网卡 |
🧰 相关命令
| 命令 | 用途 |
|---|---|
nmcli |
命令行(非交互式)NetworkManager 控制 |
ip addr |
显示所有接口的 IP 地址 |
ifconfig |
(已弃用)接口配置命令 |
systemctl restart NetworkManager |
重新启动 NetworkManager 服务 |
hostnamectl |
直接管理系统主机名 |
🧾 示例:通过 nmtui 配置以太网
sudo nmtui
→ 选择 编辑连接
→ 选择 有线连接 1
→ 将 IPv4 设置为 手动
→ 填写:地址:192.168.1.50/24
网关:192.168.1.1
DNS:8.8.8.8
→ 保存 → 返回 → 激活连接 → 选择 有线连接 1
✅ 您的网络连接现在将使用静态 IP。
📘 备注
-
使用
nmtui做的更改在重启后依然有效。 -
需要 NetworkManager 激活。
-
nmtui提供了与nmcli相同的功能,但界面更加用户友好。 -
非常适合 服务器环境 或 SSH 会话,在这些环境中 GUI 工具不可用。
结论
恭喜!您已到达 101 Linux 命令电子书 的结尾。在整个旅程中,您探索了超过 135 个基本的 Linux 命令,这些命令构成了系统管理、开发和日常 Linux 使用的基石。
您所学到的内容
这本电子书涵盖了包括以下在内的广泛主题:
🗂️ 文件和目录管理
-
导航命令 (
cd,ls,pwd) -
文件操作 (
cp,mv,rm,mkdir) -
内容查看 (
cat,head,tail,less) -
搜索和查找操作 (
find,grep,locate)
🔧 系统管理
-
进程管理 (
ps,kill,top,htop) -
用户和组管理 (
useradd,usermod,chmod,chown) -
系统监控 (
df,du,free,vmstat) -
服务管理 (
systemctl,service)
🌐 网络和通信
-
网络配置 (
ip,ifconfig,netstat) -
远程访问 (
ssh,scp,rsync) -
网络诊断 (
ping,dig,whois)
📦 软件包管理和归档
-
软件包管理器 (
apt,yum,rpm) -
压缩工具 (
tar,gzip,zip) -
归档操作
⚙️ 文本处理和自动化
-
文本编辑器 (
vim,nano) -
文本处理 (
awk,sed,cut,sort) -
任务调度 (
crontab) -
Shell 脚本辅助工具 (
xargs,nohup)
您的 Linux 之旅继续
掌握这些命令只是您 Linux 之旅的开始。以下是一些继续学习的建议:
📚 下一步
-
经常练习:掌握 Linux 命令的最佳方式是通过持续的练习
-
探索系统管理:了解服务器管理、安全和部署
-
深入脚本:开始编写 bash 脚本来自动化重复性任务
-
学习版本控制:掌握 Git 以进行代码管理和协作
-
探索容器化:学习 Docker 和 Kubernetes 以进行现代应用程序部署
🛠️ 探索高级主题
-
Shell 脚本:编写复杂的自动化脚本
-
系统安全:了解防火墙、SSL 证书和安全加固
-
性能调优:优化系统性能和解决问题
-
DevOps 工具:探索 CI/CD 管道、配置管理和基础设施即代码
-
云计算:了解 AWS、Azure、Google Cloud 和云原生技术
📖 其他资源
-
手册页:使用
man command获取任何命令的详细信息 -
Linux 文档项目:全面的指南和 HOWTO
-
在线社区:加入论坛、Discord 服务器和 Reddit 社区
-
练习环境:设置虚拟机或使用云平台进行动手学习
为本项目做出贡献
这本电子书是开源的,由社区驱动。我们欢迎来自世界各地的开发者和 Linux 爱好者的贡献:
🤝 如何贡献
-
添加新命令:帮助我们达到覆盖更多 Linux 命令的目标
-
改进示例: 为现有命令添加更好的示例或用例
-
修复问题: 报告错误、错别字或过时信息
-
翻译: 帮助将此电子书翻译成其他语言
-
分享知识: 添加技巧、窍门和最佳实践
访问我们的 GitHub 仓库 开始贡献。
致谢
🙏 特别感谢
-
Mohamed Said: 原始 Ibis 工具的创造者
-
Roberto Butti: 维护 Ibis Next,用于生成此电子书
-
Hacktoberfest 社区: 帮助扩展和改进此资源的贡献者
-
开源社区: 每个贡献示例、修复和改进的人
🎨 设计和工具
-
封面设计: 由 Suhail Kakar 制作
-
电子书生成: 由 Ibis Next 提供
-
托管: 感谢 DevDojo 提供托管和支持
最后的话
Linux 不仅仅是一个操作系统——它是一种开放协作、持续学习和技术赋权的哲学。你在本电子书中学到的命令将是你在技术职业生涯中服务的工具。
不论你是管理服务器的系统管理员、构建应用的开发者、自动化部署的 DevOps 工程师,还是仅仅对技术充满好奇的学习者,这些 Linux 命令都将是你旅程中的无价伴侣。
记住:终端是你的朋友。不要害怕实验,犯错误,并从中学习。每个 Linux 专家都是从你现在所在的地方开始的。
🚀 持续学习,不断成长
Linux 的世界广阔且不断演变。保持好奇心,持续练习,最重要的是,享受探索 Linux 提供的令人难以置信的力量和灵活性的乐趣。
Happy Linux-ing! 🐧
本电子书使用 Ibis Next 生成 - 这是一个用于 Markdown 内容的现代、多格式电子书生成工具。
下载其他格式
本电子书提供多种格式:
-
PDF: 适用于离线阅读和打印
-
EPUB: 与电子阅读器和移动设备兼容
-
HTML: 适用于网页浏览和分享
访问我们的 GitHub 发布版 下载您偏好的格式。


浙公网安备 33010602011771号