答案1
这通常发生在不是 TTY 时。(我在评论中说错了,这与或stdin
无关)。stdout
stderr
SSH 客户端将自动确定其是否stdin
是 TTY,然后请求 SSH 服务器为此会话分配或不分配 PTY。
我怀疑您的本地 shell 没有 TTY ,或者您可能正在管道中stdin
使用等等...您可能想要修复它而不是覆盖的行为(如下所示)。ssh
ssh
如果你运行tty
,输出是“不是 tty“而不是像这样的路径/dev/pts/9
,那么这将证实我的怀疑。
在功能齐全的终端上尝试以下操作(替换ssh ${HOST}
将bash
得到类似的结果):
ssh ${HOST}
-应该为您提供一个标准的远程 shell,带有提示、历史记录等......- 因为您的终端的 TTY / PTY 是以
ssh
的形式提供的stdin
。
- 因为您的终端的 TTY / PTY 是以
cat | ssh ${HOST}
-应该给你一个“静音“shell 就像你正在报告的那样- 因为
cat
'sstdout
(不是 TTY)是作为ssh
's提供的stdin
。
- 因为
有几个命令行选项可以覆盖此自动行为:
ssh -t
-要求在服务器上分配 PTYcat | ssh -t ${HOST}
仍将导致“静音“shell,你会看到类似这样的消息”不会分配伪终端,因为 stdin 不是终端。“
ssh -tt
-力量在服务器上分配 PTYcat | ssh -tt ${HOST}
将导致会话最初看起来像“好的“,但你会发现事情实际上是相当不正常的......man ssh
不会填满屏幕,控制字符将会击中 SSH 客户端(或者可能更准确地说cat
)而不是远程应用程序,等等......
ssh -T
-禁用在服务器上分配 PTYssh -T ${HOST}
将导致“静音“ 壳
考虑运行一个可执行的 shell 脚本,其内容如下:
#!/bin/bash
echo "hello"
echo "world"
在这种情况下实际发生的情况是/bin/bash
执行,使用提供的文件stdin
(不是您的终端)。bash
将检测到stdin
不是 TTY,并且将抑制某些行为,例如在命令之间打印提示并将命令记录在您的历史记录中。