功能介绍
在面对大量的主机需要执行相同命令时,如果是人工机械的一台台登陆执行该命令的话不免显得太笨拙,这时可以利用shell脚本的方式实现,只要在本地输入远程主机ip就行,如果是在同一网段则只需要输入最后的ip号即可,这里用到了字符串拼接。
#!/bin/bash
i=1
#remotecommand="service zabbix_agentd start"
remotecommand="service zabbix_agentd start"
user="root"
ipprefix="192.168.212."
while [ i==1 ]
do
read ipsuffix
remoteip=$ipprefix$ipsuffix
ssh $user@$remoteip "$remotecommand"
done
来看看执行结果:
[root@beta-test-zabbix-1 local]# sh RunRemoteZabbix.sh
96
Starting zabbix_agentd: [ OK ]
97
Starting zabbix_agentd: [ OK ]
99
Starting zabbix_agentd: [ OK ]
字符串拼接demo:
#!/bin/bash
name="Shell"
url="http://c.biancheng.net/shell/"
str1=$name$url #中间不能有空格
str2="$name $url" #如果被双引号包围,那么中间可以有空格
str3=$name": "$url #中间可以出现别的字符串
str4="$name: $url" #这样写也可以
str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
输出结果:
Shellhttp://c.biancheng.net/shell/
Shell http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
ShellScript: http://c.biancheng.net/shell/index.html
改进
在面对连续的IP地址时,可以用变量自增的方式去执行,就不用一台台的输入IP了,先看看怎么实现变量自增
var=$((var+1))
((var=var+1))
((var+=1))
((var++))
let "var=var+1"
let "var+=1"
let "var++"
以上方法都可以实现自增,需要注意的是你需要用bash或者./来执行脚本而不是sh,会出现找不到let方法的报错
具体原因可以看看他们之间的区别:https://www.cnblogs.com/pcat/p/5467188.html
自增问题解决后就是循环了,循环条件涉及到变量的比对:
-eq # equal
-ne # not equal
-lt # less than
-le # less than or equal
-gt # greater than
-ge # greater than or equal
最终代码:
#!/bin/bash
i=1
#remotecommand="service zabbix_agentd start"
remotecommand="service zabbix_agentd start"
user="root"
ipprefix="192.168.212."
while [ "$i" -lt "5" ]
do
read ipsuffix
remoteip=$ipprefix$ipsuffix
let "i++"
ssh $user@$remoteip "$remotecommand"
done
自动输入密码
在上述远程执行命令时,自己还需要手动输入远程服务器的密码,现在通过脚本实现自动输入:
#!/usr/bin/expect
spawn ssh root@192.168.212.136 "ls /serice/iamthebest"
sleep 1
expect "Password:"
send "awifi@123\r"
sleep 1
interact
exit
注意执行时需要用expect而不是sh和bash,在需要输入密码的语句前加入spawn,这里interact是可以停留在远程机子上看执行结果,不然执行结果无法返回