方式一
1.nohup + ssh + &
nohup ssh root@10.0.0.101 "command01; command02; command03" &
2.setsid + ssh +&
setsid ssh root@10.0.0.101 "command01; command02; command03" &
方式二(推荐 适合多命令)
1.nohup + ssh +&
nohup ssh root@10.0.0.101<< EOF &
command01 选项1 选项2 ...
command02 选项1 选项2 ...
command03 选项1 选项2 ...
EOF
2.setsid + ssh +&
setsid ssh root@10.0.0.101 << EOF &
command01 选项1 选项2 ...
command02 选项1 选项2 ...
command03 选项1 选项2 ...
EOF
★脚本(确保后台守护进程全部执行完毕,才可执行后续的远程管理操作)
#!/bin/bash
cat > hosts.list << EOF
10.0.0.102 root a123456!
10.0.0.103 root a123456!
EOF
which expect || yum install -y expect
expect << EOF ##生成密钥自动应答
spawn ssh-keygen
expect {
"*:" {send "\r"; exp_continue}
"*(y/n)?"{send "n\r"; exp_continue}
eof
}
EOF
##传输密钥
cat hosts.list | while read hostinfo; do
host_ip=`echo $hostinfo | awk '{print $1}'`
host_user=`echo $hostinfo | awk '{print $2}'`
host_pass=`echo $hostinfo | awk '{print $3}'`
expect << EOF
spawn ssh-copy-id $host_user@$host_ip
expect {
"*(yes/no)?" {send "yes\n"; exp_continue}
"*passw0rd:" {send "$host_passwd\n"; exp_continue}
eof
}
EOF
done
##无口令ssh登陆的环境已经OK
unset pid_num
i="0"
while read hostinfo; do
host_ip=`echo $hostinfo | awk '{print $1}'`
host_user=`echo $hostinfo | awk '{print $2}'`
setsid ssh $host_user@$host_ip << EOF &
timeout 60 ping -q 127.0.0.1
EOF
pid_num[$i]="$!"
((i=i+1))
done < hosts.list
##开始检查后台执行的ssh远程管理是否全部执行结束
pid_sum=${#pid_num[*]}
while true; do
for i in ${pid_num[*]}; do
if ps -p $i; then
echo "$i pid仍然存在"
else
echo "$i pid已消失"
((pid_sum=pid_sum-1))
fi
done
if [[ $pid_sum -eq 0 ]]; then
echo "全部完成"
break
fi
done
## 正常执行后续的ssh远程管理操作
cat hosts.list | while read hostinfo; do
host_ip=`echo $hostinfo | awk '{print $1}'`
host_user=`echo $hostinfo | awk '{print $2}'`
ssh $host_user@$host_ip << EOF
echo "远程主机名 \$HOSTNAME 的当前系统时间为 \$(date)"
EOF
done
此代码为老师上课写出供学习shell脚本的
仅供学习,禁止用于其他用途