Сервер 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ми.

  • Восстановить базу данных mysql innodb 'table не существует'
  • HTTP-authentication игнорируется, как в .htaccess, так и в httpd.conf
  • аудит изменений fileов (особенно для web.configs)
  • Рекомендуемая настройка DHCP и DNS
  • Как сделать аутентификацию домена с помощью serverа linux и клиентов Windows?
  • Windows 2008 R2 DHCP - клиент слишком часто обновляется
  • Случайная удаленная роль serverа IIS
  • Существует ли только эквивалентное условие, которое может применяться к classу Puppet или к команде «file» в манифесте?
  • Как переименовать компьютер Windows из command line?
  • Возможно ли и как установить исходящие отношения доверия из области resources без каких-либо утверждений в домене с пользователями?
  • linux 802.1x на проводной сети Windows