使用 sshpass 在后台运行 SSH(-f)

使用 sshpass 在后台运行 SSH(-f)

我的最终目标是同时使用 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的问题在于,它首先验证用户身份,派生一个子进程来处理连接,然后退出。 但是,一旦父进程退出,就会立即将子进程从其脚下抽走,在子进程有机会脱离终端( 创建的伪终端)之前,因此它将被信号杀死。sshpassssh -fssh -fsshpasssshsshpassSIGHUP

一个解决方法是给孩子一点时间开始:

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

相关内容