在处理转义字符时遇到了一个棘手问题,就是用单引号''
也无法将$
传递给程序,最终将$
用ASCII码\044
传递完美解决了问题。
如./execute-script.sh > mylog.txt 2> errorlog.txt
,程序实现的功能:
- 执行入口脚本
execute-script.sh
,将结果以覆盖形式输出到mylog.txt
,错误日志输出到errorlog.txt
。 - 在
execute-script.sh
中,将目标主机IP,以及用户名密码,和需要执行的命令,提供给auto_ssh_command.sh
函数。 auto_ssh_command.sh
函数,根据接收的主机IP以及用户名密码等,执行输入的命令。
1. execute-script.sh 主程序
mylist.txt
: 中存储了主机的IP地址auto_ssh_command.sh
: 是另一个脚本程序,用于SSH连接,以及将命令发送给目标主机$nm "USERID" "PASS\044WORD"
: 分别是主机IP,用户名和密码,另外\044
是$
的ASCII码command1
:这是传递给目标主机的命令
#!/bin/sh
mylist="mylist.txt"
. auto_ssh_command.sh
for nm in `cat $mylist`; do
echo "-------------------------------------------------------------"
echo $nm
auto_ssh_command $nm "USERID" "PASS\044WORD" "command1" "command2" "command3"
echo "--------------------------------------------------------------"
done
exit 0
2. auto_ssh_command.sh 被调用程序-执行SSH连接和传递命令
$1
:调用它传递过来的参数,比如这里就是$nmlocal
:指的是一个局部变量,只在当前block内有效expect,spawn,send
:与程序之间实现交互,新开启一个进程,expect中为预先设想的输入,如果被满足,则将send内的内容传递过去。详细参考使用Expect实现脚本自动化运行
#!/ bin/sh
auto_ssh_command() {
host=$1
id=$2
pass=$3
cmd1=$4
cmd2=$5
cmd3=$6
local PR='(#|\\$) $'
expect -c "
set timeout 3
spawn ssh ${id}@${host}
while (1) {
expect \".ssh/id_rsa':\"
send \"\r\"
expect \".ssh/id_dsa':\"
send \"\r\"
expect \"word:\"
send \"${pass}\r\"
expect -re \"$PR\"
send \"${cmd1}\r\"
expect -re \"$PR\"
send \"${cmd2}\r\"
expect -re \"$PR\"
send \"${cmd3}\r\"
expect -re \"$PR\"
send \"exit\n\"
} "
}