Я хотел бы запустить команду по SSH из окна Windows, запущенного с помощью C # - PullRequest
9 голосов
/ 04 сентября 2010

Обратите внимание, что это должно быть в окне Windows, так как я использую c # для доступа к информации о Windows

(мне нужна информация как из окна Windows, так и из окна Linux, плюс я думаю, что создание программы/ Сценарий, который запускается без графического интерфейса пользователя и получает доступ к окнам из окна Linux без вмешательства пользователя, будет более сложным, если это не так, скажите, пожалуйста, я бы хотел запустить его на * nix только с той частью, которая работает с информацией о Windows.на окнах).

Есть хороший c # api для получения этой информации из windows, в * nix он достаточно прост, чтобы запустить команду и проанализировать вывод для моих нужд.

Кажется, не так многоприличные советы по использованию ssh из c #, sharpSSH и Granados, кажется, не обновлялись годами, они приличные?Должен ли я быть обеспокоен вопросами безопасности?

(информация, которую я извлекаю, не является конфиденциальной, но если реализация ssh могла иметь исправленные недостатки безопасности (если они не обновлялись годами), я беспокоюсь о том, что кто-то украл мои учетные данные.

Существуют ли другие приличные библиотеки c # ssh. Если вывод команды прост, я должен просто запустить plink / putty (сложно ли запустить оболочку windows cmd для plink и захватить вывод (и есть ли способ сделатьбез всплывающей оболочки)?

PS в то время как коммерческая библиотека кажется хорошей, я предпочитаю что-то бесплатное (как по стоимости, так и бесплатно в исходном коде, если это возможно).

Ответы [ 6 ]

6 голосов
/ 10 сентября 2010

Пример кода

Существует несколько коммерческих клиентских библиотек SSH для C #. В следующем коде показано, как подключиться к * nix блоку, выполнить команду и прочитать ответ, используя нашу Rebex SSH Shell .

// create client, connect and log in  
Ssh client = new Ssh();
client.Connect(hostname);
client.Login(username, password);

// run the 'uname' command to retrieve OS info 
string systemName = client.RunCommand("uname -a");
// display the output 
Console.WriteLine("OS info: {0}", systemName);

client.Disconnect();

Для расширенных сценариев (таких как интерактивные команды) см. Учебник SSH Shell .

Справочная информация и стабильность

Возможно, вы уже используете базовую библиотеку Rebex SSH, не зная об этом. Rebex SFTP (который использует эту библиотеку SSH в качестве транспортного уровня) используется Microsoft в нескольких продуктах, включая Expression Web и Visual Studio 2010. Оболочка Rebex SSH - это просто еще один слой поверх него (наиболее заметное дополнение - терминал эмулятор).

Вы можете загрузить пробную версию с http://www.rebex.net/ssh-shell.net/download.aspx. Форум поддержки использует движок, очень похожий на этот сайт, и работает на http://forum.rebex.net/

Отказ от ответственности: я участвую в разработке Rebex SSH

3 голосов
/ 14 сентября 2010

Довольно просто вызвать plink без всплывающей оболочки.

Хитрость, чтобы не показывать окно, состоит в том, чтобы установить ProcessStartInfo.CreateNoWindow = true.
Добавить некоторую обработку ошибок ви все готово.

--- PlinkWrapper.cs --- *

using System.Collections.Generic;
using System.Diagnostics;

namespace Stackoverflow_Test
{
    public class PlinkWrapper
    {
        private string host { get; set; }
        /// <summary>
        /// Initializes the <see cref="PlinkWrapper"/>
        /// Assumes the key for the user is already loaded in PageAnt.
        /// </summary>
        /// <param name="host">The host, on format user@host</param>
        public PlinkWrapper(string host)
        {
            this.host = host;
        }

        /// <summary>
        /// Runs a command and returns the output lines in a List&lt;string&gt;.
        /// </summary>
        /// <param name="command">The command to execute</param>
        /// <returns></returns>
        public List<string> RunCommand(string command)
        {
            List<string> result = new List<string>();

            ProcessStartInfo startInfo = new ProcessStartInfo("plink.exe");
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardOutput = true;
            startInfo.CreateNoWindow = true;
            startInfo.Arguments = host + " " + command;
            using (Process p = new Process())
            {
                p.StartInfo = startInfo;
                p.Start();
                while (p.StandardOutput.Peek() >= 0)
                {
                    result.Add(p.StandardOutput.ReadLine());
                }
                p.WaitForExit();
            }

            return result;
        }
    }
}

--- END PlinkWrapper.cs ---

Назовите это как

PlinkWrapper plink = new PlinkWrapper("albin@mazarin");
foreach (var str in plink.RunCommand("pwd"))
    Console.WriteLine("> " + str);

и результат будет примерно таким:

> /home/albin

Хорошая особенность plink в том, что он хорошо себя зарекомендовал и хорошо интегрируется с pageant.

2 голосов
/ 15 сентября 2010

Я использовал SharpSsh lib для создания программы асинхронной синхронизации каталогов между linux и windows box (я выбрал sftp для безопасного переноса файлов).Оставаться неизменным годами не значит, что он небезопасен.

он действительно прост в использовании:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tamir.SharpSsh;

namespace sftpex
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                SshExec exec = new SshExec(ipAddress, username, password);
                Console.Write("Connecting...");
                exec.Connect();
                Console.WriteLine("OK");
                if (exec.Connected)
                    Console.WriteLine(exec.Cipher);

                while (true)
                {
                    Console.Write("Enter a command to execute ['Enter' to cancel]: ");
                    string command = Console.ReadLine();
                    if (command == "") break;
                    string output = exec.RunCommand(command);
                    string[] m = output.Split('\n');
                    for(int i=0; i<m.Length; i++)
                        Console.WriteLine(m[i]);
                }
                Console.Write("Disconnecting...");
                exec.Close();
                Console.WriteLine("OK");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}
1 голос
/ 04 сентября 2010

Если вы не против взаимодействовать с библиотеками C, я считаю, что OpenSSH - одна из лучших библиотек, доступных для работы.

0 голосов
/ 16 сентября 2010

Существует коммерческое программное обеспечение IP * Works SSH, которое может выполнить эту работу.

0 голосов
/ 04 сентября 2010

В прошлом я использовал SharpSSH для выполнения команд на Linux-боксе.Есть довольно много ошибок, и мне пришлось изменить код, чтобы исправить некоторые из них, но в конце концов это отчасти сработало ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...