2015-01-14 5 views
2

Это простейшая реализация sudo библиотеки SSH .Net, которую я могу найти. Однако я не могу заставить его работать.Команда Sudo в библиотеке C# SSH .Net

using (var ssh = new SshClient("hostname", "username", "password")) 
     { 
      ssh.Connect(); 
      var input = new MemoryStream(); 
      var sr = new StreamWriter(input); 
      var output = Console.OpenStandardOutput(); 

      var shell = ssh.CreateShell(input, output, output); 
      shell.Stopped += delegate 
      { 
       Console.WriteLine("\nDisconnected..."); 
      }; 

      shell.Start(); 
      sr.WriteLine("sudo ls"); 
      sr.Flush(); 
      Thread.Sleep(1000 * 1); 
      sr.WriteLine("password"); 
      sr.Flush(); 
      Thread.Sleep(1000 * 100); 
      shell.Stop(); 
     } 

Я получаю следующую ошибку каждый раз

Последнее посещение: Ср Янв 14 15:51:46 2015 от MYCOMPUTER


компании материал


SshNet.Logging Verbose: 1: ReceiveMessage с сервера: 'ChannelDataMessage': 'SSH_MSG_CHANNEL_DATA: # 0'. SshNet.Logging Verbose: 1: ReceiveMessage с сервера: 'ChannelDataMessage': 'SSH_MSG_CHANNEL_DATA: # 0'. [1; 36mThis является BASH [1; 31m4.1 [1; 36m- DISPLAY на [1; 31м: 0,0 [м

ср 14 января 2015 15:55:50 CST SshNet.Logging Многословный: 1: ReceiveMessage с сервера: 'ChannelDataMessage': 'SSH_MSG_CHANNEL_DATA: # 0'. SshNet.Logging Verbose: 1: ReceiveMessage с сервера: 'ChannelDataMessage': 'SSH_MSG_CHANNEL_DATA: # 0'. -bash: А ,: команда не найдена [0; 34musername @ хост [0; 31m [15:55:50]> [0м

ответ

6
 public void ExpectSSH (string address, string login, string password, string command) 
    { 
     try 
     { 
      SshClient sshClient = new SshClient(address, 22, login, password); 

      sshClient.Connect(); 
      IDictionary<Renci.SshNet.Common.TerminalModes, uint> termkvp = new Dictionary<Renci.SshNet.Common.TerminalModes, uint>(); 
      termkvp.Add(Renci.SshNet.Common.TerminalModes.ECHO, 53); 

      ShellStream shellStream = sshClient.CreateShellStream("xterm", 80,24, 800, 600, 1024, termkvp); 


      //Get logged in 
      string rep = shellStream.Expect(new Regex(@"[$>]")); //expect user prompt 
      this.writeOutput(results, rep); 

      //send command 
      shellStream.WriteLine(commandTxt.Text); 
      rep = shellStream.Expect(new Regex(@"([$#>:])")); //expect password or user prompt 
      this.writeOutput(results, rep); 

      //check to send password 
      if (rep.Contains(":")) 
      { 
       //send password 
       shellStream.WriteLine(password); 
       rep = shellStream.Expect(new Regex(@"[$#>]")); //expect user or root prompt 
       this.writeOutput(results, rep); 
      } 

      sshClient.Disconnect();  
     }//try to open connection 
     catch (Exception ex) 
     { 
      System.Console.WriteLine(ex.ToString()); 
      throw ex; 
     } 

    } 
+1

Это размещена в случае, если кто-то работает в этом вопросе , Это очень простой пример того, как ожидание может использоваться с библиотекой ssh ​​.net. Это действительно работает очень хорошо. Однако я не добавляю поддержку AIX или Solaris в ожидаемый. Кроме того, некоторые ежедневные сообщения сервера могут разорвать ожидание регулярного выражения. –

+0

Спасибо за публикацию рабочего примера. Я не пробовал оригинальный код, но вы когда-нибудь выяснили, почему он не работает? – redspidermkv

+0

Как вы знаете, когда команда завершила выполнение, если вы скажете, что вы выполняете ls -R /, это может занять довольно много времени, есть ли способ синхронизации на основе этого? –

Смежные вопросы