我的问题如下:我正在编写一个脚本,其目的是并行运行不同服务器上的某些脚本。即,我想登录远程服务器,输入密码(由于老板这不可协商),启动脚本,在脚本仍在运行时关闭连接,连接到下一个服务器并再次完成整个舞蹈。我该怎么做?
答案 0 :(得分:1)
登录后,您可以使用屏幕实用程序启动新的终端会话,然后从中分离,例如:
[user@local]$ ssh machine
[user@machine]$ screen -S my_session
# you are now switched to new terminal session named "my_session"
# now you can start long operation, that you want to keep in background
[user@machine]$ yes
# press "Ctrl-a d" to detach, you will go back to original session
[detached from 11271.my_session]
# now you can leave ssh (your session with "yes" running will be kept in background)
# to list existing screen sessions run:
[user@machine]$ screen -list
There is a screen on:
11271.my_session (Detached)
1 Socket in /var/run/screen/S-user.
# to re-attach use -r
[user@machine]$ screen -r my_session
# you will be back to session with "yes" still running (press Ctrl-C to stop it)
一旦您了解屏幕的工作原理,您就可以尝试编写脚本;这是你在运行my_command的分离状态下启动屏幕会话的方法:
$ screen -d -m my_command
答案 1 :(得分:0)
expect
可以非常轻松地自动执行此操作:
#!/usr/bin/expect -f
set hosts {your list of hosts goes here ...}
foreach host $hosts {
spawn ssh -t user@$host screen ./script.sh
expect "assword:"
send -- "secret\r"
sleep 1
send -- "d"
expect eof
}
答案 2 :(得分:0)
假设bash是所有远程计算机上的目标shell,您可以为一台计算机执行此操作:
ssh user@host /path/to/script '&>/dev/null' '</dev/null' '&' disown
对于多台机器,您可以编写如下脚本:
hosts='user1@host1 user2@host2'
for host in $hosts
do
ssh $host /path/to/script '&>/dev/null' '</dev/null' '&' disown
done
这应该只是输入密码。
或者,如果您可以为多台计算机使用相同的密码,我建议您查看ClusterSSH。通过这种方式,您可以同时登录多台计算机,并在单个窗口中或在每个xterm窗口中单独键入要发送给所有计算机的命令。这样可以避免重复输入相同的密码。登录后,您可以运行上面的命令(没有ssh user@host
部分)并退出。
这里有一些额外的想法。首先,完全丢弃脚本输出可能不是一个好主意,因为如果出现问题,你永远不会知道发生了什么。您可以将其放在一个文件中,稍后通过将'&>/dev/null'
替换为'&>filename'
来查看。另一种方法是让远程机器通过电子邮件发送给您(如果它已正确设置为执行此操作):
host=user@host
ssh $host \(/path/to/script '2>&1' \| mail -s "$host output" me@me.com\) \
'&>/dev/null' '</dev/null' '&' disown
如果脚本位于本地主机上,则可以将其复制并在一个命令中执行。假设一个shell脚本,如果不只是用正确的解释器替换sh
</path/to/script ssh user@host \
cat \>script \; sh ./script '&>/dev/null' '</dev/null' '&' disown