ssh настаивает на чтении пароля из консоли, а не в stdin - PullRequest
2 голосов
/ 28 июля 2010

Вот что я делаю:

  ssh_ = new Process();
  ssh_.StartInfo.FileName = SshProvider;
  ssh_.StartInfo.Arguments = "-t -t " + Environment.UserName + "@" + serverName_;
  ssh_.StartInfo.UseShellExecute = false;
  ssh_.StartInfo.RedirectStandardInput = true;
  ssh_.StartInfo.RedirectStandardOutput = true;
  ssh_.StartInfo.RedirectStandardError = true;
  ssh_.StartInfo.CreateNoWindow = true;
  ssh_.Start();
  new Thread(new ThreadStart(ReadStdOut)).Start();
  new Thread(new ThreadStart(ReadStdErr)).Start();

Я хочу прочитать запрос пароля из stdout (или stderr) и записать пароль в stdin, но ssh пишет и читает с консоли, с которой я запустил мое моно приложение. Я не понимаю, почему это так, поскольку я перенаправил эти потоки в приведенном выше коде.

Ответы [ 4 ]

3 голосов
/ 28 июля 2010

ssh не читает со стандартного ввода.Это очень преднамеренное поведение, разработанное специально для того, чтобы люди не пытались передать пароли из сценариев или других программ.У них нет флага, чтобы отключить это поведение;изменить его невозможно.

Предполагаемый способ автоматического входа в систему заключается в использовании механизма закрытого / открытого ключа для обхода запроса пароля.Для этого необходимо выполнить следующие шаги высокого уровня:

  1. Запустить ssh-keygen на клиенте для создания пары открытый-закрытый ключ.
  2. Добавить содержимое файла открытого ключа (например,~/.ssh/id_rsa.pub) к файлу авторизованных хостов сервера (например, ~/.ssh/authorized_keys2).

Этим вы разрешаете клиенту подключаться к серверу с использованием его ключей, поэтому пароль не требуется.

2 голосов
/ 29 июля 2010

Мне следует использовать библиотеку C # SSH, такую ​​как SharpSSH или Granados, а не пытаться взаимодействовать с другим процессом.

0 голосов
/ 01 августа 2010

Это немного сложнее, чем это.

SSH и другие приложения ожидают несколько больше услуг для своего "ввода", чем поток байтов, они требуют, чтобы терминал был активным.

Терминал предлагает различные услуги, такие как включение и выключение символа «эхо» (вы отключаете его для ввода паролей, включаете его для обычной работы).Уметь захватывать определенные последовательности управления (выборочно игнорировать сигналы прерывания или приостановки), получать уведомления об изменениях на экране дисплея (ssh нуждается в этом, чтобы он, в свою очередь, мог уведомить удаленный конец об изменении размера терминала, и ваш удаленный редактор может правильно отобразить зановосам по себе).

Unix предоставляет сервис под названием «псевдо-терминалы» (сокращенно как «pty»), который предоставляет эту функцию, а Mono имеет привязку .NET, которая позволяет управлять процессами с помощью псевдо-терминалов, вы можете найти кодздесь:

http://github.com/mono/pty-sharp

Здесь есть образец.

0 голосов
/ 28 июля 2010

Пожалуйста, посмотрите на Python pexpect, который решает эту проблему.

pexpect.sourceforge.net

http://linux.byexamples.com/archives/346/python-how-to-access-ssh-with-pexpect/

Тахарка

...