Linux命令

Linux命令
墨颜丶查看现在登陆的用户及登陆过的用户
who
who
命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等。
使用权限:所有使用者都可使用。
1 | > who |
- -H 或 --heading:显示各栏位的标题信息列;
- -i 或 -u 或 --idle:显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标成"."号,如果该用户已超过24小时没有任何动作,则标示出"old"字符串;
- -m:此参数的效果和指定"am i"字符串相同;
- -q 或–count:只显示登入系统的帐号名称和总人数;
- -s:此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题;
- -w 或-T或–mesg或–message或–writable:显示用户的信息状态栏;
- –help:在线帮助;
- –version:显示版本信息。
显示当前登录系统的用户
1 | # who //显示当前登录系统的用户 |
显示标题栏
1 | # who -H |
显示用户登录来源
1 | # who -l -H |
显示终端属性
1 | # who -T -H |
只显示当前用户
1 | # who -m -H |
精简模式显示
1 | # who -q |
last
last
命令用于显示系统用户的登录记录。它可以显示所有用户的登录和注销信息,包括登录时间、注销时间、登录终端、登录主机等。
1 | > last |
-x
:显示系统启动和关闭的记录。-n num
:限制显示的记录数量,简写-num
。-R
:不显示主机名或 IP 地址。-F
:显示完整的日期和时间。-s <time>
:从指定时间开始显示记录。-t <time>
:显示到指定时间为止的记录。-F
: 显示登录的完整时间-w
: 在输出中显示完整的用户名或域名
第一列:用户名
第二列:终端位置(pts/0伪终端,意味着从SSH或telnet等工具远程连接的用户,图形界面终端归于此类。tty0直接连接到计算机或本地连接的用户。后面的数字代表连接编号)
第三列:登录IP或内核(如果是:0.0或者什么都没有,意味着用户通过本地终端连接。除了重启活动,内核版本会显示在状态中)
第四列:开始时间
第五列:结束时间(still login in尚未退出,down直到正常关机,crash直到强制关机)
第六列:持续时间
指定显示记录的数量(显示记录中最后登录的数量)
1 | [root@xnyh ~]# last -10 |
指定查询的文件,原本默认的是wtmp
1 | [root@xnyh ~]# last -10 -f /var/log/btmp |
显示特定用户的登录记录
1 | last user1 |
显示系统启动和关闭的记录
1 | last -x |
显示指定时间之前的10条记录[-t YYYYMMDDHHMMSS]
1 | [root@ftp 2021022512314]# last -10 -t 20210221000000 |
ssh
ssh-key
是用于 SSH(Secure Shell)连接的身份验证机制,通过公钥和私钥对来实现安全的无密码登录。
1 | ssh-keygen -t rsa -b 2048 |
-t rsa
:指定生成的密钥类型为 RSA。-b 2048
:指定密钥长度为 2048 位(推荐使用 2048 位或更高)。
执行该命令后,系统会提示你输入保存密钥的文件路径和密码(可选):
1 | Generating public/private rsa key pair. |
- 文件路径:默认路径为
~/.ssh/id_rsa
。 - 密码:可以选择设置一个密码来保护私钥,增加安全性。如果不需要密码,直接按回车键即可。
生成的密钥对包括:
- 私钥:
~/.ssh/id_rsa
- 公钥:
~/.ssh/id_rsa.pub
生成 Ed25519 密钥对:
Ed25519 是一种更现代的密钥类型,具有更高的安全性和性能。生成 Ed25519 密钥对的命令如下:
1 | ssh-keygen -t ed25519 |
将公钥复制到远程服务器
生成密钥对后,需要将公钥复制到远程服务器的 ~/.ssh/authorized_keys
文件中。可以使用 ssh-copy-id
命令来完成这一操作:
1 | ssh-copy-id user@remote_host |
user
:远程服务器上的用户名。remote_host
:远程服务器的主机名或 IP 地址。
执行该命令后,系统会提示你输入远程服务器的密码。成功后,公钥将被添加到远程服务器的 ~/.ssh/authorized_keys
文件中。
手动复制添加公钥
如果 ssh-copy-id
命令不可用,可以手动将公钥添加到远程服务器的 ~/.ssh/authorized_keys
文件中:
查看公钥内容:
1
cat ~/.ssh/id_rsa.pub
将公钥内容复制到剪贴板。
登录到远程服务器:
1
ssh user@remote_host
创建
~/.ssh
目录(如果不存在):1
2mkdir -p ~/.ssh
chmod 700 ~/.ssh编辑
~/.ssh/authorized_keys
文件:1
nano ~/.ssh/authorized_keys
将公钥内容粘贴到
authorized_keys
文件中,保存并退出编辑器。设置
authorized_keys
文件的权限:1
chmod 600 ~/.ssh/authorized_keys
配置完成后,你可以使用 SSH 密钥进行无密码登录:
1 | ssh user@remote_host |
如果一切配置正确,你应该能够直接登录到远程服务器,而无需输入密码。
总结
通过生成 SSH 密钥对并配置公钥,可以实现安全的无密码登录。这不仅提高了登录的便利性,还增强了系统的安全性。以下是主要步骤的总结:
- 生成密钥对:使用
ssh-keygen
命令生成 RSA 或 Ed25519 密钥对。 - 配置公钥:使用
ssh-copy-id
或手动将公钥添加到远程服务器的~/.ssh/authorized_keys
文件中。 - 使用密钥登录:使用
ssh
命令进行无密码登录,或指定特定的私钥文件。
1 | ssh -t -i /data/id_rsa_ops -o StrictHostKeyChecking=no -p 22 ops@192.168.101.225 "sudo -i" |
选项和参数详解
ssh
- 功能:用于通过 SSH 协议连接到远程服务器。
-t
- 全称:
-t
或--tty
- 功能:强制分配一个伪终端(pseudo-terminal)。这对于需要交互式操作的命令(如
sudo -i
)非常重要,因为它允许你在远程服务器上进行交互式会话。 - 解释:
-t
确保即使在非交互式命令中,也会分配一个终端,以便sudo -i
能够正常工作。
-i /data/id_rsa_ops
- 全称:
-i
或--identity
- 功能:指定用于身份验证的私钥文件。
- 解释:
/data/scripts/id_rsa_ops
是私钥文件的路径,用于身份验证。
-o StrictHostKeyChecking=no
- 全称:
-o
或--option
- 功能:设置 SSH 客户端的配置选项。
- 解释:
StrictHostKeyChecking=no
表示在连接到新的或未知的主机时,不进行主机密钥检查。这可以避免首次连接时的确认提示,适用于自动化脚本。
-p 22
- 全称:
-p
或--port
- 功能:指定连接的端口号。
- 解释:
59679
是远程服务器的 SSH 服务监听的端口号。
ops@192.168.101.225
- 功能:指定远程服务器的用户名和主机名(或 IP 地址)。
- 解释:
ops
是远程服务器上的用户名,164.52.47.9
是远程服务器的 IP 地址。
"sudo -i"
- 功能:在远程服务器上执行的命令。
- 解释:
sudo -i
表示以 root 用户身份启动一个新的 shell 会话。-i
选项模拟初始登录,加载 root 用户的环境。
综合解释
这条命令的完整含义是:
- 连接到远程服务器:使用
ssh
命令连接到 IP 地址为192.168.101.225
的远程服务器,使用用户名ops
。 - 指定端口号:连接时使用端口号
22
。 - 使用私钥文件:使用
/data/id_rsa_ops
作为私钥文件进行身份验证。 - 禁用主机密钥检查:通过
StrictHostKeyChecking=no
选项禁用主机密钥检查,避免首次连接时的确认提示。 - 分配伪终端:通过
-t
选项强制分配一个伪终端,以便sudo -i
能够正常工作。 - 执行命令:在远程服务器上执行
sudo -i
命令,以 root 用户身份启动一个新的 shell 会话。
使用场景
这条命令通常用于自动化脚本或需要以 root 用户身份执行某些操作的场景。例如,你可能需要在多台服务器上自动执行某些管理任务,而这些任务需要 root 权限。
注意事项
- 安全性:禁用主机密钥检查 (
StrictHostKeyChecking=no
) 会降低安全性,因为它允许连接到未知的主机。在生产环境中使用时需谨慎。 - 私钥保护:确保私钥文件的安全性,设置适当的权限(如
chmod 600
)。
假设你有一个本地目录 /root/hq
,其中包含一些重要文件,需要同步到远程服务器 192.168.101.225
的 /tmp/
目录,并且需要以 root 权限进行同步。你可以使用以下命令:
1 | rsync -av -e 'ssh -i /data/id_rsa_ops -o StrictHostKeyChecking=no -p 22' --rsync-path="sudo rsync" /root/hq ops@192.168.101.225:/tmp/ |
选项和参数详解
rsync
- 功能:用于文件和目录的同步工具。
-a
- 全称:
--archive
- 功能:归档模式,相当于
-rlptgoD
的组合,保留文件的属性(如权限、时间戳、符号链接等)。
-v
- 全称:
--verbose
- 功能:详细模式,显示传输过程中的详细信息。
-e 'ssh -i /data/scripts/id_rsa_ops -o StrictHostKeyChecking=no -p 59679'
- 全称:
-e
或--rsh
- 功能:指定用于远程连接的 shell 程序。
- 解释:
ssh -i /data/id_rsa_ops -o StrictHostKeyChecking=no -p 22
是一个完整的ssh
命令,用于指定 SSH 连接的参数。-i /data/id_rsa_ops
:指定用于身份验证的私钥文件。-o StrictHostKeyChecking=no
:禁用主机密钥检查,避免首次连接时的确认提示。-p 22
:指定连接的端口号。
--rsync-path="sudo rsync"
- 功能:指定远程服务器上使用的
rsync
命令路径。 - 解释:
sudo rsync
表示在远程服务器上使用sudo
运行rsync
命令,以提升权限。
/root/hq
- 功能:指定本地源目录。
- 解释:
/root/hq
是本地需要同步的目录。
ops@192.168.101.225:/tmp/
- 功能:指定远程目标目录。
- 解释:
ops@192.168.101.225
是远程服务器的用户名和 IP 地址,/tmp/
是远程服务器上的目标目录。
综合解释
这条命令的完整含义是:
- 同步文件:使用
rsync
命令同步本地目录/root/hq
到远程服务器192.168.101.225
上的/tmp/
目录。 - 归档模式:使用
-a
选项保留文件的属性(如权限、时间戳、符号链接等)。 - 详细模式:使用
-v
选项显示传输过程中的详细信息。 - 指定 SSH 连接参数:使用
-e
选项指定ssh
命令及其参数,包括私钥文件、禁用主机密钥检查和指定端口号。 - 提升远程权限:使用
--rsync-path="sudo rsync"
选项在远程服务器上使用sudo
运行rsync
命令,以提升权限。
通过 SSH 链接服务器运行本地 Shell 脚本 posts/1562562224/
sed
sed
(stream editor)是一个强大的文本处理工具,常用于在Unix/Linux系统中对文本文件进行快速的解析和转换。它的工作方式是读取输入流(可以是文件或标准输入),根据给定的命令修改文本,并将结果输出到标准输出。
1 | sed [选项]... '{脚本}' [输入文件]... |
-n
:通常情况下,sed
会将每一行都输出到屏幕。使用-n
参数后,只有经过sed
命令处理并明确要求打印的行才会被显示出来。-e script
:允许添加多条编辑命令。每个命令之间用分号(;
)隔开。-f script-file
:从文件中读取sed
命令。-i
:直接修改文件内容,而不是输出到标准输出。--help
:显示帮助信息。--version
:显示版本信息。
假设有一个文件example.txt
,其内容为:
1 | Hello, World! |
- 替换文本
要将所有出现的“test”替换为“sed”,可以使用以下命令:
1 | sed 's/test/sed/g' example.txt |
这里的s/old/new/
是替换命令,其中s
表示替换,old
是要被替换的字符串,new
是新的字符串,g
表示全局替换(即一行中的所有匹配项都会被替换)。
- 删除行
删除example.txt
中所有包含“World”的行,可以使用:
1 | sed '/World/d' example.txt |
这里/World/d
表示删除所有包含“World”的行。
- 打印特定行
只打印example.txt
的第一行,可以使用:
1 | sed -n '1p' example.txt |
这里-n
参数阻止了默认的输出行为,而1p
命令指定了只打印第一行。
- 插入和追加文本
在example.txt
的第二行之前插入一行文本“Insert before line 2”:
1 | sed '2i\Insert before line 2' example.txt |
若要在第二行之后追加一行文本“Append after line 2”:
1 | sed '2a\Append after line 2' example.txt |
在包含关键字“Hello”的行之后插入一行Inserted line after 'Hello'
,可以使用以下命令:
1 | sed '/Hello/a Inserted line after '\''Hello'\'' ' example.txt |
这里的/Hello/a
表示在匹配“test”的行之后追加文本。注意,由于命令中包含了单引号,所以我们需要对内部的单引号进行转义,使用\''
来实现这一点。
在包含关键字“Hello”的行之前插入一行Prepended line before 'Hello'
,可以使用以下命令:
1 | sed '/Hello/i Prepended line before '\''Hello'\'' ' example.txt |
- 插入和追加文件
在 example.txt
中包含关键字“Hello”的行之后追加 append.txt
的内容,可以使用以下命令:
1 | sed '/Hello/r append.txt' example.txt |
/test/
:匹配包含“test”的行。r append.txt
:在匹配到的行之后读取并插入append.txt
的内容。
通过这种方式,你可以在 sed
中灵活地追加另一个文件复杂的内容而不用转义。
awk
1 | awk [选项] '程序' [文件] |
- 记录(Record):默认情况下,每行是一个记录。
- 字段(Field):每行中的列,字段之间默认由空格或制表符分隔。
- 内置变量:
NR
:当前记录号(行号)。NF
:当前记录中的字段数。$0
:当前记录的全部内容。$1
,$2
, …:当前记录中的第1个字段、第2个字段等。FS
:字段分隔符,默认为空格或制表符。OFS
:输出字段分隔符,默认为空格。ORS
:输出记录分隔符,默认为换行符。
假设我们有一个文件 data.csv
,内容如下:
1 | John,Doe,25 |
- 打印文件中的特定字段
要打印每个人的姓名(第一列)和年龄(第三列),可以使用:
1 | awk -F, '{print $1, $3}' data.csv |
可以使用 FS
变量来设置分隔符
- 条件选择
只想打印年龄大于25岁的人的信息,可以使用条件语句:
1 | awk -F, '$3 > 25 {print $1, $3}' data.csv |
- 使用 BEGIN 和 END 块
BEGIN
块在处理任何输入之前执行,END
块在处理完所有输入后执行。例如,计算文件中所有人的平均年龄:
1 | awk -F, 'BEGIN {sum=0; count=0} {sum += $3; count++} END {print "Average age:", sum/count}' data.csv |
输出:
1 | Average age: 27.6667 |
- 处理多行记录
有时,记录可能跨越多行。可以使用 RS
变量来设置记录分隔符。假设 data.txt
内容如下:
1 | Name: John Doe |
要提取每个人的信息,可以使用:
1 | awk -v RS= 'BEGIN {FS="\n"; OFS=": "} {print $1, $2}' data.txt |
输出:
1 | Name: John Doe: Age: 25 |
正则匹配
假设 access.log
文件内容如下:
1 | 192.168.1.1 - - [10/Oct/2023:12:34:56 +0000] "GET /index.html HTTP/1.1" 200 1024 |
提取每行的 URL:
1 | awk '{match($0, /"([A-Z]+) ([^ ]+) HTTP\/[0-9\.]+"/, arr); print arr[2]}' access.log |
输出:
1 | /index.html |
逐行解释
match($0, /"([A-Z]+) ([^ ]+) HTTP\/[0-9\.]+"/, arr);
match
:awk
的内置函数,用于在字符串中查找与正则表达式匹配的部分。$0
:当前行的全部内容。/"([A-Z]+) ([^ ]+) HTTP\/[0-9\.]+"/
:正则表达式,用于匹配请求行。arr
:一个数组,用于存储匹配的结果。
正则表达式详解
"
:匹配双引号。([A-Z]+)
:匹配一个或多个大写字母,并将其捕获到第一个分组(arr[1]
)。:匹配一个空格。
([^ ]+)
:匹配一个或多个非空格字符,并将其捕获到第二个分组(arr[2]
)。:匹配一个空格。
HTTP\/[0-9\.]+
:匹配HTTP/
后跟一个或多个数字或点。"
:匹配双引号。
print arr[2]
print
:awk
的内置函数,用于输出内容。arr[2]
:数组arr
的第二个元素,即匹配到的 URL。
执行过程
读取第一行:
match
函数找到匹配的部分"GET /index.html HTTP/1.1"
。- arr数组的内容:
arr[0]
:"GET /index.html HTTP/1.1"
arr[1]
:GET
arr[2]
:/index.html
print arr[2]
输出:/index.html
算术运算
假设我们有一个文件 grades.txt
,内容如下:
1 | 85 |
使用 awk
来计算这些成绩的平均值:
1 | awk '{sum += $1; count++} END {print "Average:", sum/count}' grades.txt |
输出:
1 | Average: 86.6 |
解释:
{sum += $1; count++}
:将每行的第一个字段(即成绩)累加到变量sum
中,并计数行数。END {print "Average:", sum/count}
:在处理完所有行后,计算并打印平均值。
条件判断
假设我们有一个文件 sales.txt
,内容如下:
1 | 2023-01-01,apple,10 |
我们可以使用 awk
来计算特定产品的总销量:
1 | awk -F, '$2 == "apple" {total += $3} END {print "Total sales of apple:", total}' sales.txt |
输出:
1 | Total sales of apple: 25 |
解释:
-F,
:设置字段分隔符为逗号。$2 == "apple" {total += $3}
:如果第二列是 “apple”,则将第三列的值累加到变量total
中。END {print "Total sales of apple:", total}
:在处理完所有行后,打印苹果的总销量。
列重复次数
awk
命令用来统计多列数据中,每对唯一值组合出现的次数的
假设有一个文件 data.txt
,内容如下:
1 | A 1 |
运行命令:
1 | awk '{a[$1" "$2]++} END {for (i in a) print i, a[i]}' data.txt |
awk
:这是命令行中的awk
程序,用于处理文本和数据。'{a[$1" "$2]++}'
:这是awk
的动作部分,用单引号括起来。$1
和$2
:分别代表当前行的第一列和第二列的值。$1" "$2
:将第一列和第二列的值用空格连接起来,形成一个字符串。这样做是为了将两列的数据作为一个整体来处理,以便统计它们的组合出现的次数。a[$1" "$2]++
:这里使用了一个关联数组a
,其索引是上述由第一列和第二列值组成的字符串。对于每一行,如果某个索引(即某对列值组合)已经存在于数组a
中,则将其对应的值增加 1;如果不存在,则在数组中创建这个索引,并将其值初始化为 1。
END {for (i in a) print i, a[i]}
:这是awk
的END
块,它在处理完所有输入行后执行。for (i in a)
:遍历数组a
的所有索引(即所有唯一的列值组合)。print i, a[i]
:对于数组中的每个索引i
(即每对列值组合),打印该索引(组合)和对应的值(出现次数)。
将会得到输出:
1 | A 1 2 |
sort
sort
是一个非常强大的命令行工具,用于对文本文件中的行进行排序。它可以按字母顺序、数值顺序、日期顺序等多种方式进行排序。下面我们将详细介绍 sort
的基本用法、常用选项以及一些示例。
1 | sort [选项] [文件] |
-k
或--key=POS1[,POS2]
:指定排序的键(字段)。POS1
是起始字段,POS2
是结束字段。-t
或--field-separator=SEP
:指定字段分隔符。-n
或--numeric-sort
:按数值排序。-r
或--reverse
:反转排序顺序。-u
或--unique
:去除重复行。-M
或--month-sort
:按月份排序。-h
或--human-numeric-sort
:按人类可读的数值(如K
,M
,G
)排序,能够正确处理带有单位的数值。-g
或--general-numeric-sort
:按通用数值排序(支持科学记数法)。-c
或--check
:检查文件是否已排序。-C
或--check=silent
:检查文件是否已排序,但不输出错误信息。-o
或--output=FILE
:将输出写入指定文件。-V
或--version-sort
:按版本排序。主要适用于文件名或版本号的排序,能够正确处理像1.10
大于1.2
这样的版本号,也能处理类似1K
,1M
,1G
的文件大小。
假设我们有一个文件 employees.txt
,内容如下:
1 | Alice 25 HR |
我们希望按部门(第三列)排序,再按年龄(第二列)排序,并去除重复行:
1 | sort -k3,3 -k2,2n -u employees.txt |
-k3,3
-k
或--key=POS1[,POS2]
:指定排序的键(字段)。3,3
:表示排序键从第3个字段开始,到第3个字段结束。也就是说,只按第3个字段排序。
-k2,2n
-k2,2n
:表示排序键从第2个字段开始,到第2个字段结束,并且按数值排序。2,2
:表示排序键为第2个字段。n
:表示按数值排序(numeric sort)。-u
或--unique
:去除重复行。在排序后的结果中,只保留第一次出现的行,去掉后续的重复行。
输出:
1 | Alice 20 HR |