Как ответить да на ключевой вопрос кеша plink в c # - PullRequest
1 голос
/ 17 марта 2011

Я использую plink из c # для подключения к серверам Linux и запуска некоторых программ.И консольная программа c #, и plink.exe находятся на одном компьютере с Windows.

Проблема в том, что когда я подключаюсь к серверу Linux в первый раз, plink спрашивает меня, хочу ли я принять и сохранить ключ SSH от сервера Linux.Я всегда хочу ответить «да» на это, потому что все серверы находятся в моей локальной сети, и нет проблем с безопасностью.

Я использую тип процесса c #, передаю правильный аргумент для plink, перенаправляю вывод и запускаю.Теперь проблема заключается в том, что когда plink запрашивает, process.StandardOutput.ReadToEnd ();зависает, и у меня нет никакого способа выяснить, предложено ли мне plink принять ключ или фактически вошел в систему на сервере Linux.

        string output = string.Empty;
        string error = string.Empty;
        string arguments = @" -ssh -pw password root@12.12.12.12 ./Install_xxx.bin";

        using (Process process = new Process())
        {
            ProcessStartInfo psi = new ProcessStartInfo();
            psi.FileName = "plink";
            psi.Arguments = arguments;
            psi.ErrorDialog = false;
            psi.UseShellExecute = false;
            psi.RedirectStandardError = true;
            psi.RedirectStandardInput = true;
            psi.RedirectStandardOutput = true;
            psi.CreateNoWindow = true;

            process.StartInfo = psi;
            process.Start();

            output = process.StandardOutput.ReadToEnd();
            error = process.StandardError.ReadToEnd();
        }

Спасибо

Ответы [ 3 ]

1 голос
/ 17 марта 2011

Ваша проблема с тупиком объяснена в документе Процесс .Когда процесс ожидает ввода, он не может закрыть стандартный ввод, поэтому он блокируется.StandardOutput не будет закрыт, потому что процесс все еще ждет вашего ввода от stdin: Deadlock.Вы можете использовать асинхронный apis для чтения построчно или использовать для другого потока другой поток.

0 голосов
/ 02 февраля 2012

Чтобы беспрепятственно подключаться к удаленному серверу через PLINK, в первый раз и в последующее время вам необходимо вручную согласовать ключи SSH. То есть используйте PUTTYGEN для создания файла закрытого ключа .ppk, который будет использовать PLINK, и заранее сохраните соответствующий открытый ключ в файле ~/.ssh/authorized_keys на сервере.

Вам также необходимо согласовать ключи хоста sshd, поэтому используйте PUTTYGEN для генерации набора файлов закрытых ключей ssh_host_rsa_key и ssh_host_dsa_key в /etc/ssh (посмотрите существующие файлы, чтобы выяснить, в какие форматы ключей экспортировать файлы ), а затем запустите ssh-keygen -y -f /etc/ssh/ssh_host_rsa_key > /etc/ssh/ssh_host_rsa_key.pub, чтобы создать соответствующие файлы открытого ключа (выполните то же самое, чтобы создать файл ssh_host_dsa_key.pub).

Если у вас есть несколько серверов, к которым вы хотите подключиться, и не против использовать один и тот же ключ для подключения ко всем из них (это будет зависеть от вашей локальной политики безопасности ИТ), просто скопируйте те же файлы ключей на каждый сервер.

ТОГДА на своей машине с Windows, на которой вы используете PLINK, вручную подключитесь к любому серверу с помощью PUTTY или PLINK и в интерактивном режиме примите ключ хоста. Как только вы это сделаете, PUTTY / PLINK сохранит этот ключ в реестре Windows под HKCU\Software\SimonTatham\PuTTY\SshHostKeys. Вы увидите запись типа rsa2@22:host, где host - имя хоста вашего сервера.

Теперь, суть процедуры, вам необходимо скопировать шестнадцатеричное значение REG_SZ 0x23,... в ваше приложение C #, где вам придется вручную использовать классы Microsoft.Win32.RegistryKey, чтобы записать это значение для всех других серверов, используя та же схема именования rsa2@22:host перед тем, как вы отправитесь в PLINK (считаете ли вы, что это значение реестра является чувствительным к безопасности, зависит от вас, поэтому защитите его как-нибудь в своем приложении C #, если потребуется).

Как и другие упоминали, вы можете рассмотреть возможность использования библиотеки SSH для получения более программной обратной связи о процессе подключения, но для использования PLINK это то, что вам нужно сделать.

0 голосов
/ 17 марта 2011

Вместо использования внешнего исполняемого файла для создания SSH-соединения, почему бы не использовать библиотеку SSH и не делать это (более надежно) с помощью кода?версия здесь ) - это C # -порт Jsch, лицензированной BSD библиотеки Java.Я очень успешно использовал его в своих проектах на C #;вы сможете программно обрабатывать все аспекты соединения SSH, включая согласование ключей.

...