**
iconv
功能:将文件内容字符集转成其他字符集
常用选项:
-l 列出所有已知的字符集
-f 原始文本编码
-t 输出编码
-o 输出到文件
-s 关闭警告
将文件内容转换 UTF8:
# iconv -f gbk -t utf8 old.txt -o new.txt
将 csv 文件转换 GBK:
# iconv -f utf8 -t gbk old.txt -o new.txt
解决邮件乱码:
echo $(echo "content" | iconv -f utf8 -t gbk) | mail -s "$(echo "title" | iconv -f
utf8 -t gbk)" example@mail.com
sshpass
功能:非交互 SSH 登录(需要安装)
常用选项
功能:非交互 SSH 登录(需要安装)
-f 从文件中获取密码
-d 用文件描述符数字获取密码
-p 指定 SSH 密码
-e 密码作为环境变量传递,变量名是 SSHPASS
免交互 SSH 登录:
# sshpass -p 123456 ssh root@192.168.1.10
免交互传输文件:
# sshpass -p 123456 scp a.txt 192.168.1.10:/root
密码传入系统变量:
# SSHPASS=123456 rsync -avz /etc/hosts -e "sshpass -e ssh" root@192.168.1.221:/opt
logger
功能:系统日志的 shell 命令行接口
常用选项:
-i 每行记录进程 ID
-f 指定输出日志到文件
-p 设置记录的优先级
-t 添加标签
示例:
logger -i -t “my_test” -p local3.notice “test_info”
ss
功能:比 netstat 更强大的 socket 查看工具
格式:ss [options] [ FILTER ]
常用选项:
-n 不解析名字
-a 显示所有 socket
-l 显示所有监听的 socket
-o 显示计时器
-e 显示 socket 详细信息
-m 显示 socket 内存使用
-p 显示进程使用的 socket
-i 显示内部 TCP 信息
-s 显示 socket 使用汇总
-4 只显示 IPV4 的 socket
-0 显示包 socket
-t 只显示 TCP socket
-u 只显示 UDP socket
-d 只显示 DCCP socket
-w 只显示 RAW socket
-x 只显示 Unix 域 socket
-f FAMILY 只显示 socket 族类型( unix, inet, inet6, link, netlink)
-A 查询 socket {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
-D 将原始的 TCP socket 转储到文件
-F 从文件中读取过滤信息
过滤:
-o state 显示 TCP 连接状态信息
示例:
显示所有 TCP 连接:
# ss -t -a
显示所有 UDP 连接:
# ss -u –a
显示 socket 使用汇总:
# ss -s
显示所有建立的连接:
# ss -o state established
显示所有的 TIME-WAIT 状态:
# ss -o state TIME-WAIT
搜索所有本地进程连接到 X Server:
# ss -x src /tmp/.X11-unix/*
lsof
功能:列出打开的文件
常用选项:
-i [i] 监听的网络地址,如果没有指定,默认列出所有。
[i]来自[46][protocol][@hostname|hostaddr][:service|port]
-U 列出 Unix 域 socket 文件
-p 指定 PID
-u 指定用户名或 UID 所有打开的文件
+D 递归搜索
列出所有打开的文件:
# lsof
查看哪个进程占用文件:
# lsof /etc/passwd
列出所有打开的监听地址和 unix 域 socket 文件:
# lsof -i -U
列出 80 端口监听的进程:
# lsof -i:80
列出端口 1-1024 之间的所有进程:
# lsof -i:1-1024
列出所有 TCP 网络连接:
# lsof -i tcp
列出所有 UDP 网络连接:
# lsof -i udp
根据文件描述符列出打开的文件:
# lsof -d 1
列出某个目录被打开的文件:
# lsof +D /var/log
列出进程 ID 打开的文件:
# lsof -p 5373
打开所有登录用户名 abc 或 user id 1234,或 PID 123 或 PID 456:
# lsof -p 123,456 -u 123,abc
列出 COMMAND 列中包含字符串 sshd:
# lsof -c sshd
vmstat
功能:报告虚拟内存、swap、io、上下文和 CPU 统计信息。
分析了这些文件:
/proc/meminfo
/proc/stat
/proc//stat
常用选项:
-a 打印活跃和不活跃的内存页
-d 打印硬盘统计信息
-D 打印硬盘表
-p 打印硬盘分区统计信息
-s 打印虚拟内存表
-m 打印内存分配(slab)信息
-t 添加时间戳到输出
-S 显示单位,默认 k、KB、m、M,大写是1024
示例:
每秒刷新一次,统计五次:
#vmstat -t 1 5
r:CPU 正在运行的进程数
b:在等待 I/O 的进程数
swpd:已经使用的交换内存(kb)
free:空闲的物理内存(kb)
buff:已经使用的缓冲区内存(kb);一般对设备数据缓存,写入到磁盘的数据
cache:已经使用的缓冲区内存(kb);一般对文件数据缓存,从磁盘读取的数据。
si:从磁盘交换到内存的交换页数量(kb/s)
so:从内存交换到磁盘的交换页数据(kb/s)
bi:块设备接收的块数量(kb/s)
bo:块设备发送的块数量(kb/s)
in:每秒 CPU 中断次数
cs:每秒 CPU 上下文切换次数
us:用户进程使用 CPU 时间(%)
sy:系统进程使用 CPU 时间(%)
id:CPU 空闲时间(%)
wa:等待 I/O 响应所消耗的 CPU 时间(%)
st:从虚拟设备中获得的时间(%)
sar
功能:查看系统资源综合方面利用率
常用选项:
-u, CPU
-r, memory
-b, disk
-n DEV, NIC traffic
-q, systemload
-b, TPS(Transaction Per Second,每秒事务处理量)
-o, output to file
示例:
# sar -u 2 3 #每两秒执行一次,采集三次
# sar -u 2 3 -o cpu.out
# sar -f cpu.out #读取文件
dstat
功能:查看系统资源综合方面利用率(需要安装)
常用选项:
-c cpu 统计
-d 磁盘统计
-m 内存统计
-n 网络统计
-s swap 统计
-l 负载统计
–tcp tcp 状态统计
–udp udp 状态统计
–socket socket 数量统计
-t 输出时间
–output 写入 csv 文件
插件:
–list 支持的插件
–top-bio-adv 详细显示 I/O 进程写入 block 量,包括 pid、r、w 和 cpu
–top-io-adv 进程写入磁盘总量
–top-cpu 占用 CPU 进程
–top-cpu-adv 查看最高 CPU 进程
–top-mem 内存进程
查看 CPU 利用率:
# dstat -c
查看 TCP 连接状态:
# dstat --tcp
nc
功能:TCP 和 UDP 连接和监听
常用选项:
-i interval 指定间隔时间发送和接受行文本
-l 监听模式,管理传入的连接
-n 不解析域名
-p 指定本地源端口
-s 指定本地源 IP 地址
-u 使用 udp 协议,默认是 tcp
-v 执行过程输出
-w timeout 连接超时时间
-x proxy_address[:port] 请求连接主机使用代理地址和端口
-z 指定扫描监听端口,不发送任何数据
端口扫描:
# nc -z 192.168.1.10 1-65535
TCP 协议连接到目标端口:
# nc -p 31337 -w 5 192.168.1.10 22
UDP 协议连接到目的端口:
# nc -u 192.168.1.10 53
指定本地 IP 连接:
# nc -s 192.168.1.9 192.168.1.10 22
探测端口是否开启:
# nc -z -w 2 192.168.1.10 22
创建监听 Unix 域 Socket:
# nc -lU /var/tmp/ncsocket
通过 HTTP 代理连接主机:
# nc -x10.2.3.4:8080 -Xconnect 10.0.0.10 22
监听端口捕获输出到文件:
# nc -l 1234 > filename.out
从文件读入到指定端口:
# nc host.example.com 1234 < filename.in
收发信息:
# nc -l 1234
# nc 127.0.0.1 1234
执行 memcahced 命令:printf "stats\n" |nc 127.0.0.1 11211
发送邮件:
# nc [-C] localhost 25 << EOF
HELO host.example.com
MAIL FROM: <user@host.example.com>
RCPT TO: <user2@host.example.com>
DATA
Body of email.
.
QUIT
EOF
# echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
eval
功能:执行参数作为 shell 命令
示例:
for i in $@; do
eval $i
done
echo —
echo $a
echo $b
# bash test.sh a=1 b=2
---
1
2
exec
exec COMMAND [ARGUMENTS]
exec 替换进程
在Bash Shell脚本中,您可以使用 exec 命令替换当前的Shell进程。这样做的效果是在脚本中执行完 exec 命令后,当前Shell进程将被替换为新的命令,原始脚本中的任何后续命令都将被忽略
#!/bin/bash
echo “”
exec echo “B”
echo “C”
exec 切换到不同的命令解释器
说到底还是切换命,替换进程
#!/bin/bash
echo "Before exec"
exec python
echo "This line will not be executed"
exec重定向标准输出
#!/bin/bash
exec > output.txt
# 输出到文件
echo "This line will be redirected to output.txt"
exec重定向标准输入
#!/bin/bash
exec 3<&0 #将标准输入定向到3
exec < input.txt
# 读取输入文件中的内容
while read line; do
echo "Line: $line"
done
exec 0<&3 3<&- 将3重新定向回0,关闭3这个文件描述符
exec 命令会替换当前进程,因此执行 exec 命令后,原始脚本中的后续命令将被忽略。确保在需要执行的所有命令之前使用 exec 命令。