Моя конечная цель - использовать одновременно 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 root@1.2.3.4
Если вы удалите флаг '-f' или удалите команду 'sshpass', вы увидите, что она отлично работает.
Есть у кого-нибудь идеи, как решить этот инцидент? Спасибо.
Не используй sshpass
. Оно сломано. И не только из соображений безопасности.
sshpass
работает, создавая псевдотерминал, в котором он запускается ssh
. Проблема с sshpass
+ ssh -f
в том, что ssh -f
сначала аутентифицирует пользователя, разветвляет дочерний элемент для обработки соединения, а затем завершает работу. Но sshpass
выдернет коврик из-под ребенка, как только родитель ssh
завершился, прежде чем у ребенка появилась возможность отсоединиться от терминала (псевдо-tty, созданный 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