终止由bash脚本执行的SSH会话

时间:2011-08-16 21:44:49

标签: bash ssh

我有一个可以在本地运行以远程启动服务器的脚本:

#!/bin/bash
ssh user@host.com <<EOF
  nohup /path/to/run.sh &
EOF
echo 'done'

运行nohup后,它会挂起。我必须按ctrl-c退出脚本。

我尝试在here doc的末尾添加一个显式退出,并为ssh使用“-t”参数。两者都不起作用。如何立即退出此脚本?

编辑:客户端是OSX 10.6,服务器是Ubuntu。

4 个答案:

答案 0 :(得分:16)

我认为问题在于当你从ssh进来时nohup无法重定向输出,只有当它认为它连接到终端时它才会重定向到nohup.out,并且我的stdin覆盖你将会阻止它,甚至与-t

解决方法可能是自己重定向输出,然后ssh客户端可以断开连接 - 它不等待流关闭。类似的东西:

nohup /path/to/run.sh > run.log &

(这对我来说是一个从OS X客户端连接到Ubuntu服务器的简单测试。)

答案 1 :(得分:8)

问题可能是......

... ssh is respecting the POSIX standard when not closing the session 
if a process is still attached to the tty.

因此,解决方案可能是从tty中分离stdin nohup命令:

nohup /path/to/run.sh </dev/null &

请参阅:SSH Hangs On Exit When Using nohup

另一种方法可能是使用ssh -t -t来强制伪tty分配,即使stdin不是终端。

man ssh | less -Ip 'multiple -t'

ssh -t -t user@host.com <<EOF
  nohup /path/to/run.sh &
EOF

请参阅:BASH spawn subshell for SSH and continue with program flow

答案 2 :(得分:2)

在没有显式命令的情况下调用ssh时,从here文档重定向远程主机的stdin会导致消息:Pseudo-terminal will not be allocated because stdin is not a terminal.

要避免此消息,请使用ssh的{​​{1}}开关告诉远程主机不需要分配伪终端或明确指定命令(例如-T )远程主机执行here文档提供的命令。

如果给/bin/sh一个明确的命令,默认是以伪终端的形式提供登录shell,i。即指定命令时将没有正常的登录会话(请参阅ssh)。

另一方面,如果没有为man ssh指定的命令,默认设置是为远程主机上的交互式登录会话创建伪tty。

ssh

作为规则,只有在存在期望stdin / stdout成为终端的命令时才应使用- ssh user@host.com <<EOF + ssh -T user@host.com <<EOF + ssh user@host.com /bin/bash <<EOF 甚至ssh -t(例如ssh -t -ttop或者,如果在vim客户端命令完成执行时有必要终止远程shell及其子进程(请参阅:ssh command unexpectedly continues on other system after ssh terminates)。

据我所知,唯一的方法是组合一个ssh命令,该命令不分配伪tty和一个ssh命令,该命令写入远程主机上的nohup是让nohup.out命令在nohup机制创建的伪终端中执行。例如,可以使用ssh命令完成此操作,并且将避免script消息。

tcgetattr: Inappropriate ioctl for device

答案 3 :(得分:1)

您最后需要添加exit 0