系统

查找文件

# 将目录下的所有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)
    • 2-10位都是由rwx构成:

      • r:读的权限,对应数字4
      • w:写的权限,对应数字2
      • x:执行权限,对应数字1
    • 修改权限可以用chmod命令:

      # 修改test文件权限为-rwxr-xr-x
      chmod 755 test
      # 修改testf/文件夹和其所有子文件夹中的文件权限为rwxr-xr-x
      chmod -R 755 testf/
      
  • 特殊权限:可执行位变为st

    • SUID:-rwsr-xr-x

      • 执行者将具有改程序拥有者的权限(比如普通用户执行的时候可以达到root的权限)
      • 仅对二进制程序有效
      • 执行者对于改程序需要具有x的可执行权限
      • 本权限仅限在改执行程序的过程中有效
    • SGID:-rwxrwsr-xdrwxrwsr-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
  • 默认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测速

  1. 服务端
# 设置监控报告时间间隔为5s(默认为1s),端口为8888
iperf3 -s -i 5 -p 8888
  1. 客户端
# 与192.168.1.1的8888端口建立连接,并测速30s,监控报告时间间隔5s
iperf3 -c 192.168.1.1 -p 8888 -t 30 -i 5
  1. 参数说明
    • -s:指定为服务端
    • -c:指定为客户端(后跟服务端IP地址)
    • -p:指定服务端端口
    • -i:指定监控报告输出的时间间隔
    • -t:指定运行时间