(与这个问题有关)
在 Windows 上使用 sshd 服务器(Win32-OpenSSH)时(使用基于密钥的身份验证进行自动化),除非它具有 STDIN(或 PTY),否则它不起作用。例如,运行这个(从 Debian Jessie openssh 客户端)可以正常工作(返回 windows 用户名):
ssh -4 -T -o Batchmode=yes winserver whoami
但是,这两个没有(它们只是在不执行命令且不返回任何输出的情况下终止):
ssh -4 -T -o Batchmode=yes winserver whoami < /dev/null
ssh -4 -n -T -o Batchmode=yes winserver whoami
这会带来问题,因为无法从没有打开 STDIN 的程序(如cron(8)或atd(8))运行非交互式 ssh 命令。
当使用 Debian openssh 服务器时,它当然可以正常工作。问题只发生在 windows ssh 服务器上(Win32-OpenSSH和FreeSSHD失败。但是Bitvise SSHD似乎工作正常,但我们正在寻找 windows ssh 服务器的免费解决方案;开源、简单和维护是奖励)
这已经被报道了,但是在此期间有人有解决方案或解决方法吗?
最后,我编写了这个 ssh 包装器来解决有缺陷的 Windows OpenSSH 服务器,即使对于不使用它的非交互式命令也需要 STDIN:
它只使用带有参数的主机名和命令来运行,不允许使用其他参数(我将它们设置在 中
~/.ssh/config
),因此您将脚本(例如)作为myssh winserver whoami < /dev/null
. 它只是 ssh 客户端的包装器,它提供虚假的 STDIN,因此允许从cron(8)和atd(8)运行非交互式 ssh 会话感谢 Matija-Nalis 的问题和解决方案。为了他人的利益,这是一个粗略的 python 实现。
SSH.py
python ssh.py <user> <hostname> <command>
我的用例类似:Jenkins 作业无法执行远程命令。