我的最终目标是同时使用 ssh -f 和 sshpass,尽管它不太管用。ssh -f 尝试从 ssh 进程中分叉,并将 stdin 设置为从 /dev/null 读取 - 这使得事情变得困难,因为 sshpass 会收集 ssh 命令,执行它并将密码作为输入 (stdin) 传递给它。我不想使用 &,因为基本上这不是解决问题的优雅方法。此外,sshpass 不支持此事件。
命令示例:
sshpass -p pass1234 ssh -L 1234:127.0.0.1:5678 -N -f [email protected]
如果您删除“-f”标志或删除“sshpass”命令,您会发现它运行良好。
有人知道如何解决此事件吗?谢谢。
答案1
请勿使用sshpass
。它已损坏。而且不仅仅是出于安全考虑。
sshpass
通过创建一个伪终端来运行。 +ssh
的问题在于,它首先验证用户身份,派生一个子进程来处理连接,然后退出。 但是,一旦父进程退出,就会立即将子进程从其脚下抽走,在子进程有机会脱离终端( 创建的伪终端)之前,因此它将被信号杀死。sshpass
ssh -f
ssh -f
sshpass
ssh
sshpass
SIGHUP
一个解决方法是给孩子一点时间开始:
sshpass -p password sh -c 'ssh -f -N ... user@host && sleep .1'
顺便说一句,你可以几乎完美sshpass
模拟script(1)
:
{ sleep .1; echo password; } | script -q /dev/null -c 'ssh user@host cmd'
在 BSD 上,你script
有一个不同的语法:
{ sleep .1; echo password; } | script -q /dev/null ssh user@host cmd