Linux常用命令
文章目录
系统
查找文件
# 将目录下的所有bak后缀文件全部递归删除
find . -name '*.bak' -type f -print -exec rm -rf {} \;
Rsync同步
如下命令会实现:
- 使用rsync将/etc/A、/etc/B目录同步到/backup/A、/backup/B
- 复制权限(a)、删除/backup文件夹中比源文件多出的文件(–delete)
- 忽略bak后缀文件(–exclude=’*.bak’)、忽略.recycle文件夹(–exclude=’.recycle')
rsync -a --delete --exclude='*.bak' --exclude='.recycle' /etc/A /etc/B /backup
tar压缩与解压缩
linux的压缩与解压实际存在两个步骤:打包、压缩(可以在一个命令中完成)
# tar [选项] [-f 压缩包名] 源文件或目录
# 打包与压缩选项:
# -c: 打包
# -f:指定压缩包的文件名。压缩包的扩展名是用来给管理员识别格式的,所以一定要正确指定扩展名;
# -v:显示打包文件过程
# -z:压缩和解压缩".tar.gz"格式
# -j:压缩和解压缩".tar.bz2"格式
# 解打包选项:
# -x:解打包;
# -f:指定压缩包的文件名;
# -v:显示打包文件过程;
# -t:测试,就是不解打包,只是査看包中有哪些文件;
# -C 目录:指定解打包位置;
# 示例1:将test文件夹压缩为test.tar.gz、test.tar.bz2
tar -cvzf test.tar.gz test/
tar -cvjf test.tar.bz2 test/
# 示例2:将test.tar.gz、test.tar.bz2解压缩
tar -xvzf test.tar.gz
tar -xvjf test.tar.bz2
tar -xvzf test.tar.gz -C hello
Samba目录的挂载
手动挂载
- 指定uid和gid就能让相应用户有这个目录的读写权限
- 需要安装cifs-utils
mount -t cifs -o user=username,pass=password,uid=1000,gid=1000 //SHARE_IP/share_folder /mnt/share_folder
开机自动挂载
-
最好不要使用
/etc/fstab
的方式,避免有错误时无法开机启动 -
此处采用
systemd.mount
的方式挂载 -
实现步骤:
-
启动依赖判断服务(因为网络启动完成后才能挂载网盘)
-
systemctl enable systemd-networkd.service systemd-networkd-wait-online.service
-
-
编辑
/etc/systemd/system/mnt-remotefs.mount
文件(注意:文件名必须与Where=
后字段的一致,比如想要挂载到/mnt/remotefs
那么文件名就必须是mnt-remotefs.mount
)[Unit] Description=Mount remote samba Requires=network-online.target After=systemd-networkd-wait-online.service Wants=systemd-networkd-wait-online.service [Mount] What=//192.168.1.1/share Where=/mnt/remotefs Type=cifs Options=user=username,password=password,file_mode=0754,dir_mode=0755,uid=1000,gid=1000,iocharset=utf8 [Install] WantedBy=multi-user.target
-
自动查找局域网内主机并写入/etc/hosts
文件
#!/bin/bash
upIpList=/tmp/upIpList.txt
pingIp=/tmp/pingIp.txt
dev="ens192"
# If /etc/hosts don't have esxi record
if [[ -z `cat /etc/hosts|grep esxi` ]];then
echo "172.40.123.123 esxi" >> /etc/hosts
sleep 1
fi
# Get Ip Header
ipHeader=`ip addr show dev $dev|grep inet|grep -v inet6|awk '{print $2}'|awk '{split($0,a,".");print a[1]"."a[2]"."a[3]}'`
# Get up hosts by nmap
nmap -sP $ipHeader.0/24 -oG $upIpList
# Get pingIp addresses
cat $upIpList|grep 'Status: Up'|awk '{print $2}' > $pingIp
# Ping IP to add to ip neigh
cat $pingIp | while read ip
do
ping -c 1 -w 1 $ip
done
# Replace host ip
sed -i "s/.*esxi$/`ip neigh show|grep f4:b5:20:49:a7:3c| awk '{print $1 " esxi"}'`/g" /etc/hosts
linux文件的特殊权限
linux除了常规的-[dlb]rwxrwxrwx
权限以外,还有三个特殊的权限。
-
常规权限复习
-
总共十位
-[d]rwxrwxrwx
- 第1位是
-
(文件)、d
(文件夹)、l
(链接文件)、b
(设备文件) - 第2-4位:文件[文件夹]所有者的权限(UID)
- 第5-7位:文件[文件夹]组员的权限(GID)
- 第8-10位:文件[文件夹]其他人的权限(OID)
- 第1位是
-
2-10位都是由
rwx
构成:r
:读的权限,对应数字4w
:写的权限,对应数字2x
:执行权限,对应数字1
-
修改权限可以用
chmod
命令:# 修改test文件权限为-rwxr-xr-x chmod 755 test # 修改testf/文件夹和其所有子文件夹中的文件权限为rwxr-xr-x chmod -R 755 testf/
-
-
特殊权限:可执行位变为
s
或t
-
SUID:
-rwsr-xr-x
- 执行者将具有改程序拥有者的权限(比如普通用户执行的时候可以达到root的权限)
- 仅对二进制程序有效
- 执行者对于改程序需要具有x的可执行权限
- 本权限仅限在改执行程序的过程中有效
-
SGID:
-rwxrwsr-x
、drwxrwsr-x
- 对二进制文件来说功能与SUID一样,只是其他用户执行时获取到文件所属组的权限
- SGID主要用于文件夹:任何用户在有SGID的目录下新建文件时,新建文件的群组会与此目录相同
-
SBIT:
drwxrwxr-t
- 当用户在该目录下新建文件或目录时,仅有自己与root才有权利删除
- 改权限对文件不起作用
-
设置方法(假设test文件或文件夹的权限为
rwxr-xr-x
,即755)- 文字法:SUID: u+s ,SGID: g+s,SBIT: o+t
- 数字法:将原来的三位数扩展为四位数即可,SUID为4,SGID为2,SBIT为1,把它们放在权限数字的最开头。例如设置SUID,可以写成4777,设置SGID可以写成,2777
# 给test文件设置SUID chmod u+s test chmod 4755 test # 给test文件夹设置GUID chmod g+s test chmod 2755 test # 给test文件夹设置SBIT chmod o+t test chmod 1755 test # 给test文件夹同时设置GUID和SBIT chmod 3755 test
-
-
文件权限后的
+
号:代表增加了ACL权限控制
ACL权限控制
常规的Linux权限就是UGO(User, Group, Others),还有上述的三个特殊权限。但在有些场景下这个权限系统可能并不够;比如有一个班级的共享目录/class,班主任为所有者(root: rwx)、全班学生为群组所属者(group: rwx)、其他人没有权限访问,但某天有个旁听(listener)来的时候也需要访问这个共享目录就无法实现。这时候ACL就能发挥其作用了。
- ACL的特点
- 可以为单独的用户添加权限
- 添加ACL权限的目录最后会有一个
+
号
- ACL权限的查询与设定
- 查询的命令为
getfacl 文件名
- 设定的命令为
setfacl
,其参数如下:-m
:设定 ACL 权限。如果是给予用户 ACL 权限,参数则使用 “u:用户名:权限” 的格式,例如setfacl -m u:listener:rx /project
表示设定 listener 用户对 project 目录具有 rx 权限;如果是给予组 ACL 权限,参数则使用 “g:组名:权限” 格式,例如setfacl -m g:tgroup:rx /project
表示设定群组 tgroup 对 project 目录具有 rx 权限。-x
:删除指定用户(参数使用 u:用户名)或群组(参数使用 g:群组名)的 ACL 权限,例如setfacl -x u:listener /project
表示删除 listener 用户对 project 目录的 ACL 权限。-b
:删除所有的 ACL 权限,例如setfacl -b /project
表示删除有关 project 目录的所有 ACL 权限。-d
:设定默认 ACL 权限,命令格式为 “setfacl -m d:u:用户名:权限 文件名”(如果是群组,则使用 d:g:群组名:权限),只对目录生效,指目录中新建立的文件拥有此默认权限,例如setfacl -m d:u:listener:rx /project
表示 listener 用户对 project 目录中新建立的文件拥有 rx 权限。-R
:递归设定 ACL 权限,指设定的 ACL 权限会对目录下的所有子文件生效,命令格式为 “setfacl -m u:用户名:权限 -R 文件名”(群组使用 g:群组名:权限),例如setfacl -m u:listener:rx -R /project
表示 listener 用户对已存在于 project 目录中的子文件和子目录拥有 rx 权限。-k
:删除默认 ACL 权限。
- 查询的命令为
- 最大有效权限
mask
- mask是ACL设置中允许设定的最大权限,比如mask是
r-x
,那么就算使用setfacl -m u:listener:rwx /class
,listener获得的权限也只有r-x
- 其实用户最终获得的权限是
setfacl
设置权限与mask的逻辑与运算结果 - mask一般都设置为
rwx
- 设定mask可以采用:
setfacl -m m:rwx /class
- mask是ACL设置中允许设定的最大权限,比如mask是
- 默认ACL权限
- 当我们为一个目录设置了ACL权限后,在这个目录下新建文件并不会继承父目录的ACL权限
- 默认ACL权限:如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限
- 默认ACL设置之前就存在的子文件是不会继承ACL权限的
touch修改文件时间
-
文件的时间参数有三个:创建时间、修改时间、访问时间
-
touch [选项] [文件名]
-
-a
:只修改文件的访问时间 -
-c
:仅修改文件的时间参数(3 个时间参数都改变),如果文件不存在,则不建立新文件 -
-d
:后面可以跟欲修订的时间,而不用当前的时间,即把文件的 atime 和 mtime 时间改为指定的时间,时间的书写格式为YY-MM-DD hh:mm
-
-m
:只修改文件的数据修改时间 -
-t
:命令后面可以跟欲修订的时间,而不用目前的时间,即把文件的 atime 和 mtime 时间改为指定的时间,时间书写格式为YYMMDDhhmm
-
注意:
-d
与-t
参数仅仅是接受的参数不一样,如果没有指定这两个参数则是修改为当前的系统时间,一般用-d
参数看起来要明确一些
-
# 修改test.txt的创建、修改、访问时间为2023年3月22日13点30分
touch -c -d "2023-03-22 13:30" test.txt
touch -c -t 202303221330 test.txt
# 仅修改test.txt的修改时间为2023年3月22日14点30分
touch -m -d "2023-03-22 14:30" test.txt
touch -m -t 202303221430 test.txt
# 仅修改test.txt的访问时间为2023年3月22日15点30分
touch -a -d "2023-03-22 15:30" test.txt
touch -a -t 202303221530 test.txt
exiftool修改文件名
# 查看111.jpg文件的时间属性信息
exiftool -time:all 111.jpg
# 将所有的jpg格式文件名修改为文件的ModifyDate,当有重名时后续增加序号
exiftool -overwrite_original -r '-Filename<ModifyDate' -d "%Y%m%d-%H%M%S%%-c.%%e" *.jpg
# 将所有的jpg格式文件名修改为文件的DateTimeOriginal、CreateDate、ModifyDate、FileModifyDate(前一个没有就用后一个属性命名),当有重名时后续增加序号
exiftool -overwrite_original -r '-Filename<FileModifyDate' '-Filename<ModifyDate' '-Filename<CreateDate' '-Filename<DateTimeOriginal' -d "%Y%m%d-%H%M%S%%-c.%%e" *.jpg
网络
netstat命令
# netstat常见参数:
# -a (all) 显示所有选项,默认不显示LISTEN相关
# -l (listen) 仅列出 Listen (监听) 的服务
# -t (tcp) 仅显示tcp相关内容
# -u (udp) 仅显示udp相关选项
# -n (numeric) 直接显示ip地址以及端口,不解析为服务名或者主机名
# -p (pid) 显示出socket所属的进程PID 以及进程名字
# -r 显示路由信息,路由表
# -e 显示扩展信息,例如uid等
# -s 按各个协议进行统计
# --inet 显示ipv4相关协议的监听
# 列出所有端口
netstat -an
# 查看IPV4端口上的tcp的监听
netstat -lntp --inet
# 找出某个端口运行的程序(如80端口运行的程序)
netstat -ap|grep ':80'
查看占用端口的程序
# 查看占用80端口的进程
lsof -i:80
Nmap扫描
# 以默认方式扫描某个IP(扫描开放的端口)
nmap 192.168.1.1
# 强力检测某个IP
# 默认会开启服务版本识别(-sV)、操作系统识别(-O)、脚本扫描(-sC)、Traceroute(–traceroute)
nmap -A 192.168.1.1
# 扫描某个端口是否打开
nmap -p 80 192.168.1.1
# 同时扫描多个端口和网段
nmap -p 21,22,80 192.168.1.1-254
# 扫描文件中的ip
nmap -iL ip.txt
# 探测某个网段主机是否存活(采用ping扫描方式)
# -sP也可以用-sn
nmap -sP 192.168.1.0/24
# 探测某个网段主机是否存活并采用Grep输出
nmap -sP 192.168.1.0/24 -oG /tmp/ip_output.txt
网络唤醒
# 安装
sudo apt install etherwake
# -b MAC地址 -i 本机对应网卡
/usr/sbin/etherwake -b xx:xx:xx:xx:xx:xx -i ens224
iperf3测速
- 服务端
# 设置监控报告时间间隔为5s(默认为1s),端口为8888
iperf3 -s -i 5 -p 8888
- 客户端
# 与192.168.1.1的8888端口建立连接,并测速30s,监控报告时间间隔5s
iperf3 -c 192.168.1.1 -p 8888 -t 30 -i 5
- 参数说明
-s
:指定为服务端-c
:指定为客户端(后跟服务端IP地址)-p
:指定服务端端口-i
:指定监控报告输出的时间间隔-t
:指定运行时间
文章作者 Evan Yu
上次更新 2022-09-28