Назад | Перейти на главную страницу

SSH работает в фоновом режиме (-f) с sshpass

Моя конечная цель - использовать одновременно 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