- 论坛徽章:
- 0
|
本帖最后由 relvigour 于 2012-03-06 11:45 编辑
这个是我自己用的批量在多个主机上运行 Shell 的脚本 ,看有人求这个,就把这个帖出来一下,希望对大家有所帮助。 因为是自用,用着方便就好, 所以有些细节没有调整,就将就着用吧。
主要方便的是,所有的脚本式并行在所有的机器上跑的。 如果主机多的话,出结果会比较快点。缺点就是,各个机器回来的结果可能是交叉在一起的。
使用方法
1。在当前目录建立一个 all_linux.list 文件记录所有的linux 主机
每一行的格式为 "IP tag1 tag2 ... " ,
2。把其中所有的 IP 的 ssh 密钥登陆都搞好。
3。可以使用了。
方法一: allsh.sh " ls | wc "
从all_linux.list读取ip 信息,逐个运行 " ls | wc " 程序命令
方法二: grep tag1 all_linux.list | allsh.sh " w "
只针对含有 tag1 的行运行 "ls | wc" 命令
4。 结果会输出成这个样子
192.168.1.1 : 11:12:17 up 02:41, 2 users, load average: 0.00, 0.00, 0.00
192.168.1.1 : USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
192.168.1.1 : root pts/0 192.168.1.100 08:58 0.00s 0.02s 0.00s w
192.168.1.1 : root pts/1 192.168.1.100 08:59 15:09 0.04s 0.04s -bash
192.168.1.2 : 11:12:17 up 02:41, 2 users, load average: 0.00, 0.00, 0.00
192.168.1.2 : USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
192.168.1.2 : root pts/0 192.168.1.100 08:58 0.00s 0.02s 0.00s w
192.168.1.2 : root pts/1 192.168.1.100 08:59 15:09 0.04s 0.04s -bash
脚本如下:
###############################
#!/bin/sh
if [ $# -lt 1 ];then
echo "Please input a command "
exit
fi
DANGER=`echo $remotecmd | grep -E "(reboot|shutdown|init|poweroff)" | wc -l `
if [ $DANGER -gt 0 ]; then
echo "There is a danger command. Please run it one by one "
exit
fi
breakpsh()
{
#echo "Break Current Process List!!!!"
for ii in $PIDLIST ; do {
kill -15 $ii 2> /dev/null
} done
kill -15 `ps -T|grep ssh|gawk '{print $1}'`
echo "Some process may not close normally!!!" >&2
exit
}
waitclose()
{
# echo "Waitting for all process close"
for ii in $PIDLIST ; do wait $ii ; done
}
if [ -p /dev/stdin ] ; then
{
ALL_Linux_IPs=
while read -e pline ; do {
if echo $pline | grep -E '^([0-9]{1,3}\.){3}[0-9]{1,3}' -q ; then
{
ip=$(echo $pline | gawk '{print $1}' )
ALL_Linux_IPs="$ALL_Linux_IPs $ip"
} fi
} done
} else {
[ "x$HOSTIPFILE" == "x" ] && [ -f ./all_linux.list ] && HOSTIPFILE=./all_linux.list
[ "x$HOSTIPFILE" == "x" ] && echo " No host ip list " && exit
ALL_Linux_IPs=$(gawk '{ print $1}' $HOSTIPFILE | egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}')
} fi
trap 'breakpsh' 2 3 15
trap 'waitclose' exit
PIDLIST=
for ip in $ALL_Linux_IPs ; do
{
ssh $ip $remotecmd 2>&1 | gawk -v IP=$ip '{print IP"\t: " $0}' &
PIDLIST="$PIDLIST $!"
}
done
############################### |
评分
-
查看全部评分
|