2016-10-19 10 views
1

私はリモートホストの設定を自動化しようとしています。これらのデバイスは数多くあります。通常はUSBプログラミングで行いますが、それをプログラム的に行うと、時間がなくなります。SSH.NETを使用したリモートホストへの接続

これらのデバイスはいくつかのタイプのLinux OSを実行しますが、正確にはわかりませんが、PuTTYなどのユーティリティを使用して最初に接続すると、SSHが有効になり、サーバのホスト鍵を確認します。

今のところ、私はデバイスとのSSHセッションを開始しようとしています。私はかなりの研究をしており、これを思いついた:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Renci.SshNet; 
using Renci.SshNet.Common; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Connection information 
      string user = "admin"; 
      string pass = "********"; 
      string host = "IP Address"; 

      //Set up the SSH connection 
      using (var client = new SshClient(host, user, pass)) 
      { 

       //Accept Host key 
       client.HostKeyReceived += delegate (object sender, HostKeyEventArgs e) 
       { 
        e.CanTrust = true; 
       }; 

       //Start the connection 
       client.Connect(); 

       var output = client.RunCommand("show device details"); 


       client.Disconnect(); 
       Console.WriteLine(output.ToString()); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 

問題は、このコマンドが実行されていないようです。コンソールウィンドウが表示され、WebGUIで同じデバイスにアクセスし、ログファイルを見ると接続が確立されていることがわかりますが、実行を中断して変数値を見ると出力変数にnullが表示されます。

コンソールウィンドウを開いたままで実行すると(左上に点滅するカーソルが表示されます)、10分後に接続がタイムアウトして接続が失われ、デバイスログにも表示されます。

なぜ、これは実行コマンドを実行して結果を出力変数に格納していないようですか?

+0

これらのデバイスは、ssh exec要求をサポートしていない可能性があります。コマンド行から 'ssh admin @ host 'show device details''を実行して、期待される出力が得られるかどうか確認してください。 – Kenster

答えて

1

Renci.SshNet.SshClient型のオブジェクトに対してRunCommand()メソッドを実行すると、その結果が変数として返されません。 代わりに、Renci.SshNet.SshCommand型のオブジェクトを返します。

問題は、結果のSshCommandオブジェクトをvarに収めることができないようです。

RunCommand()を実行したときに返されるこのRenci.SshNet.SshCommandには、いくつかのプロパティとメソッドが含まれます。 プロパティは次のとおりです。

  • CommandTextを
  • CommandTimeoutの
  • 終了ステータス
  • のOutputStream
  • ExtendedOutputStream
  • 結果
  • エラー

それらはすべて役に立ちますが、他のすべてが機能しているように見える場合、唯一適切なものは「結果」です。 "Result"プロパティには、RunCommand()に提供したコマンドのホストストリームの結果となるStringが含まれます。

デバイスのログファイルが正常に接続されたことを記録しているので、接続が成功したように見えます。上に説明したように結果をつかむためには、適切な微調整をしなければならず、行かなくてはなりません。

補遺:オリジナルのポストのコードで

次の行:

var output = client.RunCommand("show device details"); 

は、このコードに置き換えてください:

var output = client.RunCommand("show device details").Result; 

これはResultプロパティを(割り当てられますString)をoutput varに変更します。これにより、望ましい結果が得られます。

+0

あなたのコードを共有してください – mwilson

+0

補足が回答に追加されました。 – Jon

関連する問題