原来的办法是ssh登录到某个主机IP,然后执行df -Th|grep disk
,如果磁盘空间不足,就删除某些文件。但是经常要检查几十台主机的磁盘状况,这种人工方法很乏味,也很费时。
了解到ssh命令是可以跟远程命令的, 即ssh root@ip df ..
,这样就无需登录到每台主机,直接在某台能用ssh连接所有主机的机器ops上执行即可。
先把所有要查看的主机IP列表以1行1个IP的格式保存在iplist文件中。
然后编辑以下脚本。
#!/bin/bash
# 检查iplist文件是否存在
if [ ! -f "iplist" ]; then
echo "错误:iplist文件不存在!"
exit 1
fi
# 逐行读取iplist文件中的IP地址
while read -r ip; do
# 跳过空行和以#开头的注释行
if [[ -z "$ip" || "$ip" == \#* ]]; then
continue
fi
echo "正在连接 $ip ..."
ssh "root@$ip" "df -Th|grep disk"
# 检查ssh命令是否成功执行
if [ $? -ne 0 ]; then
echo "连接到 $ip 失败!"
fi
echo "----------------------------------------"
done < "iplist"
在ops上输入bash check_disk.sh
,结果只检查了一台,输出:
正在连接 192.168.1.1 ...
/dev/sdg1 ext4 5.5T 3.2T 5.5T 61% /disk6
/dev/sdf1 ext4 5.5T 4.1T 5.5T 81% /disk5
----------------------------------------
然后就退出了。
既然循环ssh有问题,何不把这些ssh命令输出到一个脚本文件,然后执行脚本即可。
所以将check_disk.sh修改如下:
#!/bin/bash
# 检查iplist文件是否存在
if [ ! -f "iplist" ]; then
echo "错误:iplist文件不存在!"
exit 1
fi
# 逐行读取iplist文件中的IP地址
while read -r ip; do
# 跳过空行和以#开头的注释行
if [[ -z "$ip" || "$ip" == \#* ]]; then
continue
fi
echo "echo" '"#正在连接 ' "$ip" ' ..."'
echo "ssh" "root@$ip" "df -Th|grep disk"
# 检查ssh命令是否成功执行
if [ $? -ne 0 ]; then
echo "连接到 $ip 失败!"
fi
echo "echo" '"#----------------------------------------"'
done < "iplist"
注意:echo命令后面先跟一个双引号包裹的echo,然后用单引号包裹双引号,这样才能输出双引号,变量ip需要单独放在一对双引号中,不能用单引号包裹。
然后在ops上输入bash check_disk.sh >chsh.sh
,
得到的chsh.sh的内容如下:
echo "#正在连接 192.168.1.1 ..."
ssh root@192.168.1.1 df -Th|grep disk
echo "#----------------------------------------"
echo "#正在连接 192.168.1.2 ..."
ssh root@192.168.1.2 df -Th|grep disk
echo "#----------------------------------------"
...
再执行bash chsh.sh
就好了,输出如下:
#正在连接 192.168.1.1 ...
/dev/sdg1 ext4 5.5T 2.1G 5.5T 1% /disk6
/dev/sdi1 ext4 5.5T 3.2G 5.5T 1% /disk8
#----------------------------------------
#正在连接 192.168.1.2 ...
/dev/sdi1 ext4 5.5T 1.9G 5.5T 1% /disk8
/dev/sdj1 ext4 5.5T 2.5G 5.5T 1% /disk9
...
#正在连接 192.168.1.88 ...
/dev/sdc1 ext4 5.5T 89M 5.5T 1% /disk2
/dev/sdf1 ext4 5.5T 89M 5.5T 1% /disk5
当然,查看结果也可以用重定向到文件。