У меня возникают спорадические проблемы при попытке установить ssh на серверы Windows (либо freesshd или Win32-OpenSSH, результаты те же). При попытке запустить неинтерактивные команды (из Debian Jessie с клиентом OpenSSH) иногда (но не всегда и через разные промежутки времени) удаленная команда останавливается и требует нажатия ВОЙТИ продолжать.
Например:
ssh -4 -T somehost "mysqldump --master-data --all-databases" > backup.sql &
на некоторых компьютерах с Windows он завершается нормально (если базы данных достаточно малы), но на более крупных он обычно останавливается (либо сразу, с backup.sql
остающийся с размером 0 или через некоторое время с backup.sql
имея от нескольких мегабайт до нескольких сотен мегабайт), а затем оболочка сообщит мне, что процесс клиента ssh ожидает ввода:
[1]+ Stopped ssh -4 -T somehost "cat mysqldump --master-data --all-databases" > backup.sql
если я принесу это fg
и нажмите ВОЙТИ, он будет продолжать работать даже после того, как я CTRL+Z и bg
Это. Иногда он заканчивается тогда, иногда он снова останавливается через некоторое время.
strace подтверждает, что процесс ожидает ввода TTY (на файловом дескрипторе 4, который открыт RW /dev/pts/2
или аналогичный PTY оболочки, порождающей клиента ssh), и именно поэтому процесс был остановлен.
Если я запустил ssh из скрипта без связанного TTY, он умрет (так как некому нажимать ВОЙТИ). Если я предоставлю -n
возможность перенаправить stdin из /dev/null
, ssh прекратит работу сразу после подключения. Это создает дополнительную проблему, так как соединения ssh, которые запускаются не с терминала (а, например, с cron (8) / atd (8)), немедленно завершатся ошибкой.
Единственный близкий вопрос, который я нашел, это вот этот, но предоставленный обходной путь (принудительное использование PTY) не совсем применим в моем случае (рассматриваемые программы изменяют свое поведение при обнаружении PTY, добавляя упорядочение ANSI, перенос слов и т. д.).
Излишне говорить, что те же команды, которые подключаются к сотням систем Debian (и других GNU / Linux), на которых работают серверы OpenSSHD, не вызывают никаких проблем (использование погоды -n
или не). Проблемы возникают только тогда, когда sshd-сервер работает в Microsoft Windows.
Есть ли у кого-нибудь идеи, как исправить или обойти проблему? Я пробовал наивный подход:
yes '' | ssh -4 -T somehost "mysqldump --master-data --all-databases" > backup.sql &
но он не работает должным образом (хотя он исправляет ssh, ожидающий клавиатуры, ему также случайно удается вставить новые строки в вывод, что недопустимо). Также связанные Сервер OpenSSH в Windows отказывается работать без STDIN даже в неинтерактивном режиме