为什么“ssh localhost nohup echo hello”不起作用?

sam*_*yse 0 ssh nohup

我认为这概括了这一点:

# /usr/bin/nohup echo hello
/usr/bin/nohup: ignoring input and appending output to `nohup.out'

# ssh localhost /usr/bin/nohup echo hello
hello
Run Code Online (Sandbox Code Playgroud)

发生了什么事?

n.s*_*.st 5

显然

\n\n
\n

最新版本的 ssh 开始对非 TTY STDIO 使用管道

\n
\n\n

所以

\n\n
\n

bash 脚本无法判断是否ssh正在通过管道传输非 tty 命令。

\n
\n\n

因为只有当它检测到/连接到终端nohup时才会采取行动(并且当输出进入管道时不执行任何操作),并且启动它的方式看起来像是正在通过管道传输,因此您会得到您的行为正在看到。stdoutstderrssh

\n\n
\n\n

正如muru 指出的,您可以使用参数强制ssh分配 a :tty-t

\n\n
$ ssh -t localhost "/usr/bin/nohup /bin/echo foo"\n/usr/bin/nohup: ignoring input and appending output to \xe2\x80\x98nohup.out\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n