系统管理工具包: 使用 SSH 进行分布式管理
2008-11-12 08:30:42 来源:WEB开发网到目前为止,您主要关注于在一台远程计算机中运行单个的命令或者命令字符串。尽管在直接使用 SSH 执行远程管理时,交互会话技巧非常有用,但是您可能希望实现这个过程的自动化,这意味着交互的组成部分未必非常有用。
要在多台计算机中以远程的方式运行相同的命令,您需要为 SSH 命令和远程命令(您希望运行的远程命令,以便在每台远程计算机上重复该过程)构建一个简单的包装。
您可以使用一个非常简单的 for 循环来完成这项任务,如下面的清单 7 所示。
清单 7. 用于以远程的方式运行命令的 for 循环
for remote in mc@gentoo.vm mc@redhat; do echo $remote; ssh $remote 'df -h'; done
mc@gentoo.vm
Filesystem Size Used Avail Use% Mounted on
/dev/hda3 14G 4.1G 9.2G 31% /
udev 126M 564K 125M 1% /dev
/dev/hdc1 1.9G 56M 1.8G 4% /var/tmp
/dev/hdc2 1.9G 1.3G 558M 70% /usr/portage
/dev/hdc3 1.9G 35M 1.8G 2% /home/build
shm 126M 0 126M 0% /dev/shm
mc@redhat
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
7.1G 5.5G 1.3G 82% /
/dev/hda1 99M 13M 82M 14% /boot
none 125M 0 125M 0% /dev/shm
您可以很容易地将其转换为一个简单脚本,如清单 8 所示。
清单 8. 将 for 循环简化为简单的命令
#!/bin/bash
# Script to run a command across multiple machines
# Global options
TIMEOUT=10
ERRLOG=/tmp/remote-err-$$.log
OUTLOG=/tmp/remote-out-$$.log
# Extract the command line
MACHINES=$1;shift
COMMAND=$1;shift
for machine in $MACHINES
do
echo $machine
ssh -oConnectTimeout=$TIMEOUT $machine $COMMAND >>$OUTLOG 2 >>$ERRLOG
done
cat $OUTLOG
cat $ERRLOG >&2
rm -f $OUTLOG $ERRLOG
更多精彩
赞助商链接