#home目录下所有文件更新时间距现在时刻大于120分钟的文件删除(-mtime -3 表示3天以内)
find /home/* -mmin +120 -delete
#home目录下所有文件创建时间距现在时刻大于120分钟的文件删除(-ctime -3 表示3天以内)
find /home/* -cmin +120 -delete
#快速查找已删除但依旧占用的文件
find /proc/*/fd -ls 2>/dev/null | grep '(deleted)'
tar -zcf XXX.tar.gz XXX --remove-files #打包成tar包之后删除原文件
#替换jar内文件(包内要和包外的路径对应一致,不然会说没有这个文件)
jar -uvf XXX.jar 包内文件 包外文件
sort file1 file2 | uniq -u #去除两个文件重复部分
ln –s 源文件 目标文件 #软链接
ls --full-time filename #查看文件生成全部时间
ls -lR | grep "^-" | wc -l #查看当前目录下的文件数量(包含子目录中的文件) 注意:R,代表子目录
ls -l | grep "^-" | wc -l #查看当前目录下的文件数量(不包含子目录中的文件)
ls -l | grep "^d" | wc -l #查看当前目录下的文件夹数量(不包含子目录中的目录),同上述理,如果需要查看子目录的,加上R
#不解压筛选查看tar.gz包(或zgrep --binary-files=text "Read time out" X.tar.gz)
zcat XXX.tar.gz | grep --binary-files=text "Read time out"
#对于所有3306端口的TCP访问,一律转发到 192.168.7.51:3306 上
socat -d -d -lf /var/log/socat.log TCP4-LISTEN:3306,bind=0.0.0.0,reuseaddr,fork TCP4:192.168.7.51:3306
#screen命令用法
screen -S <session_name> #创建会话
screen -ls #列出会话
screen -r <session_name> #切换会话
Ctrl+A再按D #会话后台运行
Ctrl+D或执行exit #退出会话
# scp后台运行
ctrl+z #挂起当前任务
bg %1 #将编号为1的任务转后台运行
disown -h %1 #将编号为1这个作业忽略HUP信号,也就是可以退出终端不影响scp
#/home/test/下存放连接mysql的用户名密码文件.my.cnf,然后以安全方式连接mysql
HOME=/home/test mysql -e "sql语句" 或 mysql --defaults-file=/home/test/.my.cnf
#.my.cnf文件内容:
[client]
user=root
password=Aa.1234567
host=192.168.7.110
port=3306
#判断$var变量是否有值(有)
if [ -n "$var" ];then
#xargs 用作替换工具,读取输入数据重新格式化后输出
|xargs -i -t #-t 表示先打印命令,然后再执行;-i 一般是一行一行赋值给 {}
#Linux下清除文件系统缓存
1、sync
2、echo 3 > /proc/sys/vm/drop_caches
#修改max_user_watches值的方法,直接修改文件/proc/sys/fs/inotify/max_user_watches或
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -p
#大文件分割,test_line_、test_size_为新文件的前缀
split -l 5 large.txt test_line_ #指定行数分割
split -b 10k large.txt test_size_ #指定大小分割
#查看哪个安装包包含该库:
yum provides 库名
#yum只下载不安装并指定包存放路径
yum install --downloadonly --downloaddir=/tmp <package-name>
#inode使用率过高解决办法
for i in /*;do echo $i;find $i | wc -l;done
#调整swappiness参数来设置内存使用多少后开始使用swap分区
vim /etc/sysctl.conf 添加 vm.swappiness = 40 ,然后sysctl -p生效
cat /proc/sys/vm/swappiness 值为40,表示使用到 100-40=60% 的时候开始swap分区的使用
#打印出当前进程详细的情况,其中,内存是VmRSS
cat /proc/[pid]/status
#检测http状态
curl -I -m 10 -o /dev/null -s -w %{http_code} www.baidu.com
#查看证书有效期
openssl x509 -in /tmp/test.pem -noout -dates
#rsync减少主服务器的io占用,启动时设置降低IO使用
ionice -c 2 -n 7 rsync --daemon
#rsync同步目录,test目录后面有 "/",表示test这个目录下面的所有内容同步到目标目录dest_test下面
rsync -avH --progress --password-file=/etc/rsyncd.passwd /home/test/ abc@192.168.1.10::bak/dest_test
#/etc/rsyncd.passwd文件的权限为600
#rsync同步目录,test目录后面没有 "/",表示test这个目录本身同步到目标目录dest_test下面
rsync -avH --progress --password-file=/etc/rsyncd.passwd /home/test abc@192.168.1.10::bak/dest_test
#脚本中使用 inotifywait + rsync 实现实时文件同步,-r递归递归监视,-e文件事件
while inotifywait -r -e modify,create,delete,move /data/;do
rsync -avz /data/ root@172.16.5.222:/opt/data/
done
#使用parallel并行执行rsync,加速同步。下载地址:http://ftp.gnu.org/gnu/parallel/
find /root/parallel/* -maxdepth 0 -type d | parallel rsync -avH {} /tmp/
#创建一个指定大小的空文件,或者用于测试磁盘的读写性能(a.dat大小等于count乘以bs,oflag=direct直接I/O操作直接读写设备)
dd if=/dev/zero of=./a.dat bs=8k count=10 oflag=direct
#添加swap分区(创建swap文件、修改权限、设置交换空间、启用交换空间、开机自动挂载)
dd if=/dev/zero of=/tmp/swap bs=1MB count=1024
chmod 0600 /tmp/swap
mkswap /tmp/swap
swapon /tmp/swap
echo "/tmp/swap swap swap defaults 0 0" >> /etc/fstab
#查看当前目录下各文件夹占用空间,深度1。(-h后面可以指定目录参数)
du -h --max-depth=1
#查看目录下所有文件的大小并按照大小排序
du -sh * | sort -rh
#LVM根目录扩容(新盘/dev/sdb)
pvcreate /dev/sdb
vgextend VG名 /dev/sdb
lvextend -l +100%free LV对应的Path
xfs_growfs /dev/mapper/centos-root #XFS文件系统扩容
或
resize2fs /dev/mapper/centos-root #EXT4文件系统扩容
#非LVM方式扩容根目录文件系统方法1
fdisk /dev/sda
输入: p (便于记住起始和结束扇区)
输入: d (删除根分区,千万不能保存)
输入: n (重新创建起始和结束扇区)
输入: p (查看)
输入: w (保存)
重启机器
刷新根分区(使用 resize2fs或xfs_growfs)
#非LVM方式扩容根目录文件系统方法2
growpart /dev/vda 1 # 1是分区号,命令安装yum install cloud-utils-growpart
resize2fs /dev/vda1 # 扩容ext文件系统
xfs_growfs -d /mnt # 扩容xfs文件系统,注意mnt是挂载点不是设备
#开启重定向覆盖文件保护(比如重定向写入一个已经存在的文件时,给出一个警告并且不会执行该操作,需使用">|"才可以强制执行写入)
set -o noclobber
#用nsenter在宿主机上进入容器的命名空间,调试容器
nsenter -u -n -m -i -p -t $(docker inspect --format {{.State.Pid}} 容器ID)
或
nsenter -u -n -m -i -p -t $(nerdctl -n k8s.io inspect --format {{.State.Pid}} 容器ID)
或
nsenter -u -n -m -i -p -t $(crictl inspect -o go-template --template '{{.info.pid}}' 容器ID)
#快速设置用户密码
echo Aa.1234567 | passwd --stdin root
#快速定位系统IO阻塞问题(D的状态一般是I/O出现了问题,说明进程在等待I/O,可以是磁盘I/O,网络I/O或者其他)
ps -eo state,pid,cmd | grep "^D"
#查看进程的父进程ID
ps -p <pid> -o ppid=
#通过重定向符号在远程主机执行脚本
ssh root@192.168.7.50 'bash -s' < install.sh
#ssh隧道访问远程服务器上监听本地端口的服务(172.16.200.58目标主机)
ssh -N -L 18789:127.0.0.1:18789 root@172.16.200.58
#查询文件名对应的RPM包名
rpm -qf 文件名
#实时查看/tmp/a 输出到屏幕,并保存到/tmp/b
tail -f /tmp/a | tee /tmp/b
#递归持续监控/tmp目录下的事件(创建、修改、删除、写入后关闭)
inotifywait -m -r -e create,modify,delete,close_write /tmp
#--------------文件被误删后如何恢复?--------------
#1、被进程引用的文件,rm -rf之后可从内存恢复
cp /proc/进程pid/fd/序号 文件原路径
#2、未被进程引用的文件,rm -rf后如果源数据未被覆盖,用 ext4magic 命令:
#版本 ext4magic-0.3.2-3.10.x86_64.rpm,恢复的目的路径必须与/dev/sda1不在同一个分区
#列出 /dev/sda1 分区在/tmp/路径下已删除的文件
ext4magic /dev/sda1 -f /tmp/ | grep "< "
#--------------文件被误删后如何恢复?--------------
- 网络
#查看哪些端口正在被监听,以及是哪些进程在监听这些端口
ss -tlnp
#诊断到目标网络的连通性与性能,相当于结合了traceroute和ping。也可以通过-u或-T测试UDP和TCP
mtr -n -c 5 192.168.7.50 --report
#ping命令结果后面添加时间
ping www.baidu.com | awk '{print $0"\t" strftime("%Y-%m-%d %H:%M:%S",systime());fflush()}' > ping.log
#指定源ip(192.168.0.150)的ping
ping -I 192.168.0.150 www.baidu.com
#不分片发送1472字节的3个包到目标(测试MTU)
ping -M do -s 1472 -c 3 192.168.7.50
#抓包命令,-n不进行主机名解析,-q快速输出,-s 0表示包不截断抓完整的数据包
tcpdump -nq -s 0 -iany host 127.0.0.1 -XNnn
tcpdump -nq -s 0 -iany port 80 -XNnn
tcpdump -nq -s 0 -i eth0 icmp
#显示eth0网卡流量和网速
tcpdump -i eth0 -w - | pv -bert > /dev/null
#nc端口测试,-u UDP端口(不指定默认为TCP)
nc -u -lp 20682 #-l 开启监听模式
nc -u 192.168.7.51 20682 #与对端192.168.7.51可以交互
nc -u -vz 192.168.7.51 20682 #检测udp端口20862是否可通
echo "test" | nc -u 192.168.7.51 20682 #向udp端口发送一条test消息
#添加静态路由,到172.25.201.0/24的数据通过网关172.25.209.125路由转发;加上src可指定源IP
route add -net 172.25.201.0/24 gw 172.25.209.125
或
ip r add 172.25.201.0/24 via 172.25.209.125
#开机启动自动添加路由,eth0为网卡名
vim /etc/sysconfig/network-scripts/route-eth0
172.25.200.0/24 via 172.25.209.125 src 172.25.209.126
#DNAT 目地地址转换:将本机发出到10.9.6.7的数据包重定向到172.17.10.18
#在DNAT中,PREROUTING处理外部进入本机的数据包。而OUTPUT处理本机发往外部的包
iptables -t nat -A OUTPUT -d 10.9.6.7 -j DNAT --to-destination 172.17.10.18
#SNAT源地址转换:从172.25.209.29发出的数据包,且从eth0出口,如果目的地址不是172.25.0.0/16,则将源地址改为172.25.209.62
iptables -t nat -A POSTROUTING -d 172.25.0.0/16 -j RETURN
iptables -t nat -A POSTROUTING -s 172.25.209.29 -o eth0 -j SNAT --to-source 172.25.209.62
#MASQUERADE源地址转换:源地址是10.9.0.0/24的流量通过eth0访问目标172.22.0.0/16时,进行源地址转换(将其源IP自动替换为eth0接口的IP)
#与SNAT的区别是:MASQUERADE是动态的,可以自动选择IP;而SNAT静态的需要指定IP
iptables -t nat -A POSTROUTING -s 10.9.0.0/24 -d 172.22.0.0/16 -o eth0 -j MASQUERADE
#查看nat表下的规则(不加-t默认是filter表,-L不指定链默认列出所有链,--line-numbers显示行号)
iptables -vn -t nat -L --line-numbers
#通过行号删除规则
iptables -t nat -D PREROUTING 2
#在nat表PREROUTING链的行号为1的规则前插入规则
iptables -t nat -I PREROUTING 1 [规则详情]
#iptables的mangle表对某个端口设置白名单
iptables -t mangle -A PREROUTING -i lo -j ACCEPT
iptables -t mangle -A PREROUTING -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t mangle -A PREROUTING -s 172.16.200.53/32 -p tcp -m multiport --dports 5000 -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 5000 -j DROP
#firewall-cmd添加富规则(参数--permanent代表永久配置,重启后仍存在),添加后使用firewall-cmd --reload加载生效
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.7.50" port port="3389" protocol="tcp" accept'
# firewall-cmd --direct --get-all-rules #查看所有直接规则
# firewall-cmd --get-zones #查看所有可用区域列表
# firewall-cmd --get-active-zones #当前活动的防火墙区域及其接口
# firewall-cmd --get-default-zone #查看默认区域(当前生效的区域)
# firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -j ACCEPT #允许所有IPv4流量通过FORWARD路由转发
# firewall-cmd --permanent --zone=public --set-target=DROP #设置public区拒绝所有流入的包(ACCEPT则反之,REJECT拒绝所有流入并回复拒绝消息)
# firewall-cmd --permanent --new-zone=k8spod #创建新的区域
# firewall-cmd --permanent --zone=k8spod --add-interface=tunl0 #将网络接口tunl0永久地添加到名为k8spod的区域中
- Linux开机自动启动脚本的方法
# 1、通过/etc/rc.local实现
vim /etc/rc.local,添加以下内容:
bash /root/script/restart.sh
# 2、通过crontab实现
crontab -e,添加以下内容:
@reboot /root/script/restart.sh
# 3、通过systemd实现
vim /lib/systemd/system/restart.service,添加以下内容:
[Unit]
Description=restart
After=default.target
[Service]
Type=forking
ExecStart=/root/script/restart.sh
[Install]
WantedBy=default.target
- shell脚本字符串截取的8种方法
# 假设有变量 var=http://www.aaa.com/123.htm.
# 1. # 号截取,删除左边字符,保留右边字符。**
echo ${var#*``//}
# 其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
# 即删除 http://
# 结果是 :www.aaa.com/123.htm
# 2. ## 号截取,删除左边字符,保留右边字符。**
echo ${var##*/}
# \\##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
# 即删除 http://www.aaa.com/
# 结果是 123.htm
# 3. %号截取,删除右边字符,保留左边字符**
echo ${var%/*}
# %/* 表示从右边开始,删除第一个 / 号及右边的字符
# 结果是:http://www.aaa.com
# 4. %% 号截取,删除右边字符,保留左边字符**
echo ${var%%/*}
# %%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
# 结果是:http:
# 5. 从左边第几个字符开始,及字符的个数**
echo ${var:0:5}
# 其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
# 结果是:http:
# 6. 从左边第几个字符开始,一直到结束。**
echo ${var:7}
# 其中的 7 表示左边第8个字符开始,一直到结束。
# 结果是 :www.aaa.com/123.htm
# 7. 从右边第几个字符开始,及字符的个数**
echo ${var:0-7:3}
# 其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
# 结果是:123
# 8. 从右边第几个字符开始,一直到结束。**
echo ${var:0-7}
# 表示从右边第七个字符开始,一直到结束。
# 结果是:123.htm
# 注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
- AWK
#awk打印除某些列之外的所有列:
awk '{ $3="";$4=""; print $0 }' a.txt
#awk修改指定列的内容(以逗号分割):
awk 'BEGIN{FS=OFS=","} {if ($4==1700870) $4=1700888}1' test.txt
#默认每行按空格或TAB分割:
awk '{print $1,$4}' log.txt
#-F,指定分割字符:
awk -F : '{print $1,$4}' log.txt
#指定多个分割字符,先用:分割,然后再用,分割:
awk -F '[:,]' '{print $1,$4}' log.txt
#-v,指定变量:
awk -v a=1 -v b=s '{print $1,$1+a,$1b}' log.txt
#-f,调用awk脚本:
awk -f script.awk log.txt
#纯字符匹配,//:
awk '/dockerroot/' /etc/passwd
#纯字符不匹配,!//:
awk '!/dockerroot/' /etc/passwd
#匹配a1或a2,/|/:
awk '!/a1|a2/' /etc/passwd
#字段值匹配,~//:
awk '$1~/root/' /etc/passwd
#字段值不匹配,!~//:
awk -F : '$1!~/root/' /etc/passwd
#IF语句,必须用在{}中,且比较内容用()扩起来if...else...:
awk -F: '{if($1~/root/) {print $1} else {print $2}}' /etc/passwd
#test.txt文件以"|"分割,检查第12个字段是否等于"\N",是的话使第13列等于第11列
awk -F'|' '{if ($12 == "\\N") { $13 = $11 } print}' OFS='|' test.txt
#while语句:
awk -F: 'BEGIN{i=1} {while(i<8) print $i,i++}' /etc/passwd
#逻辑运算符:&&?||
#条件表达式:== != > >=
#NF、NR:NF代表每行字段数,NR代表行号```
