Сервер OpenSSH на Windows отказывается работать без STDIN даже в неинтерактивном режиме

(связанный с этим вопросом )

При использовании sshd-serverа ( Win32-OpenSSH ) в windowsх (с авторизацией на основе keyа для автоматизации) он не работает, если у него less STDIN (или PTY). Например, выполнение этого (от клиента Debian Jessie openssh) работает нормально (возвращает имя пользователя Windows):

ssh -4 -T -o Batchmode=yes winserver whoami 

Однако эти два не делают (они просто прекращаются без выполнения команды и без возврата какого-либо вывода):

 ssh -4 -T -o Batchmode=yes winserver whoami < /dev/null ssh -4 -n -T -o Batchmode=yes winserver whoami 

Это представляет проблему, поскольку невозможно запустить неинтерактивные команды ssh из программ, которые не имеют открытого STDIN (например, cron (8) или atd (8) ).

При использовании serverа Debian openssh он, конечно, работает без проблем. Проблема возникает только с serverами Windows ssh (Fails с Win32-OpenSSH и FreeSSHD . Bitvise SSHD, похоже, работает нормально, но мы смотрим на бесплатные решения для windows ssh-serverов, с открытым исходным кодом, простые и поддерживаемые бонусы)

Об этом сообщается , но есть ли у кого-нибудь решение или обходное решение?

2 Solutions collect form web for “Сервер OpenSSH на Windows отказывается работать без STDIN даже в неинтерактивном режиме”

Это конец, я написал эту оболочку ssh для работы с багги-serverами OpenSSH, которые требуют STDIN даже для неинтерактивных команд, которые его не используют:

 #!/usr/bin/perl use strict; use warnings; use Net::OpenSSH; my $HOSTNAME = shift; my $ssh = Net::OpenSSH->new($HOSTNAME); my ($in_pipe, undef, undef, $pid) = $ssh->open_ex( { stdin_pipe => 1 }, @ARGV) or die "open_ex failed: " . $ssh->error; waitpid($pid, 0); 

Он использует только имя хоста и команду с аргументами для запуска, другие parameters не разрешены (я их устанавливаю в ~/.ssh/config ), поэтому вы запускаете скрипт (например) как myssh winserver whoami < /dev/null . Это всего лишь обертка вокруг клиента ssh, которая обеспечивает поддельный STDIN и, таким образом, позволяет запускать неинтерактивные sessionы ssh из cron (8) и atd (8)

Спасибо Матиа-Налису за вопрос и решение. Для выгоды других, вот грубая реализация python.

ssh.py

 import sys import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(sys.argv[2], username=sys.argv[1]) stdin, stdout, stderr = client.exec_command(sys.argv[3]) errlines = stderr.readlines() outlines = stdout.readlines() for l in outlines: print l.rstrip() if len(errlines): print "WARNING: stderr generated:" for l in errlines: print l.rstrip() exit(stdout.channel.recv_exit_status()) 

python ssh.py <user> <hostname> <command>

Мой прецедент был похож: работа Jenkins не выполнялась удаленными commandми.

  • Установка HomePath на EmployeeNumber в качестве переменной
  • Должен ли я помещать все мои serverы в свой домен?
  • Файл PDF после удаления все еще отображается на serverе Windows 2008?
  • Очень странная скорость NFS
  • Брандмауэр Windows - управление сотнями serverов
  • Отfilterовать list доменов для inputа в Windows
  • Автоматическое rotation ОС с использованием GRUB
  • Восстановить fileы из корзины, расположенной в хранилище serverов перемещаемого профиля
  • Все жесткие ссылки NTFS исчезают, где хранятся эти жесткие ссылки 0KB на диске и как их восстановить?
  • Окно AOE Server / Target и Client / Initiator для Windows7 / 2012 или более поздних версий
  • Утвердить обновления WSUS для реплик WSUS с использованием Powershell