我在尝试 SSH 连接到 Windows 服务器时遇到偶尔的问题(运行自由软件或者Win32的OpenSSH,结果相同)。当尝试运行非交互式命令(从带有 OpenSSH 客户端的 Debian Jessie)时,有时(但并非总是如此,并且间隔不同)远程命令会停止并需要按 才能ENTER继续。
例如:
ssh -4 -T somehost "mysqldump --master-data --all-databases" > backup.sql &
在某些 Windows 机器上,它可以正常完成(如果数据库足够小),但在较大的机器上,它通常会停止(立即停止,backup.sql
剩余大小为 0,或者在一段时间后,剩余backup.sql
大小从几兆字节到几百兆字节),然后 shell 会通知我 ssh 客户端进程正在等待输入:
[1]+ Stopped ssh -4 -T somehost "cat mysqldump --master-data --all-databases" > backup.sql
如果我将其带到fg
并按下ENTER,它将继续工作,即使我CTRL+Z和bg
它之后也是如此。有时它会在那时完成,有时它会在一段时间后再次停止。
strace 确认该进程正在等待 TTY 输入(在文件描述符 4 上,即打开的 RW/dev/pts/2
或生成 ssh 客户端的 shell 的类似 PTY),并且这就是进程停止的原因。
如果我从没有关联 TTY 的脚本运行 ssh,它就会死机(因为没有人按ENTER)。如果我提供-n
从 重定向 stdin 的选项/dev/null
,ssh 会在连接后立即死机。这会带来额外的问题,因为不是从终端运行的 ssh 连接(例如从 cron(8)/atd(8) 运行)将立即失败。
我发现的唯一接近的问题是这个但是提供的解决方法(强制使用 PTY)并不适用于我的情况(当检测到 PTY 时,相关程序会修改其行为,添加 ANSI 排序和自动换行等)。
不用说,连接到运行 OpenSSHD 服务器的数百个 Debian(和其他 GNU/Linux)系统的相同命令不会遇到任何问题(无论是否使用-n
)。只有当 sshd 服务器在 Microsoft Windows 上运行时才会出现问题。
有人知道如何修复或解决这个问题吗?我尝试过以下简单的方法:
yes '' | ssh -4 -T somehost "mysqldump --master-data --all-databases" > backup.sql &
但它效果不佳(虽然它修复了 ssh 等待键盘的问题,但它也会随机地在输出中插入换行符,这是不可接受的)。相关内容Windows 上的 OpenSSH 服务器即使在非交互模式下,如果没有 STDIN 也无法工作