【SSH】【 C#,VB.net 】SSH接続をプログラムで実装

その他

概要

C#、VB.netを使って、SSH接続やSCP接続を行ってみたいと思います。パスワード入力など自動化できます。

まず、SSH接続のコマンドの方法は、以下の通りで、パスワードを入力する必要があります。

$ ssh username@192.168.100.10
username@192.168.100.10's password: 
Last login: Sun Feb  8 07:39:53 2015 from 192.168.100.10
[username@mylinux ~]$

SCP接続は、以下の通り、SSHと同様にパスワードを入力する必要があります。

scp /home/hoge/hoge.txt  username@192.168.100.10:/home/username/

NuGetパッケージ(SSHパッケージ)

「NuGetパッケージの管理」よりSSHのパッケージをインストールします。

SSHで検索すると、「Neon.SSH.NET」があります。これをインストールします。(「SSH.NET」パッケージもありますがSCPなど不具合があります)

ソースコード( C# )

SSH

SSH接続

mHostName(ホスト名)、mPortNumber(ポート番号)、mUserName(ユーザID)、mPassword(パスワード)、mCommandString(実行コマンド)とすると、以下のようなソースとなる。

// ソリューションエクスプローラ>参照>NuGetパッケージの管理>「Neon.SSH.NET」を追加
using Renci.SshNet;

~ 省 略 ~
try
{
   // コネクション情報
    ConnectionInfo info = new ConnectionInfo(
           mHostName,
         Convert.ToInt32(mPortNumber),
           mUserName,
           new AuthenticationMethod[] {
           new PasswordAuthenticationMethod(mUserName, mPassword)
            }
            );

   // SSHクライアントオブジェクトを生成し接続
   SshClient ssh = new SshClient(info);
   ssh.Connect();
   if (!ssh.IsConnected)
   {
      txtMsg("SSH接続に失敗しました",1);
    return false;
   }

   // SSHコマンド実行
   SshCommand cmd = ssh.CreateCommand(mCommandString);
   messageOutput("$ " + mCommandString,0);
   cmd.Execute();

   var stdOut = cmd.Result;
   var stdErr = cmd.Error;
   if (stdOut != string.Empty)
   {
      //コマンド実行結果を表示(デバック)
      messageOutput(stdOut);
   }

   if (cmd.ExitStatus != 0 && stdErr != string.Empty)
   {
      // エラー出力を表示
      txtMsg("SSHコマンドが失敗しました。",1);
      return false;
    }

     // 接続終了
     ssh.Disconnect();
 }
catch (Exception ex)
{
   MessageBox.Show(ex.ToString());
}

sudoコマンドによるパスワード入力

sudoコマンドによるパスワード入力は、以下のようにコマンド入力すれば良いです。

mCommandString = "echo \"" + mPassword + "\" | sudo -S -p \"\" cp " + "/home/hoge/abc.txt + "  " + "/home/root/abc.txt" + "\n";

SCP

mHostName(ホスト名)、mPortNumber(ポート番号)、mUserName(ユーザID)、mPassword(パスワード)、mUpFullPath(クライアントのファイルパス)、mUpRemotePath(リモートのファイルパス)とすると、以下のようなソースとなります。

// ソリューションエクスプローラ>参照>NuGetパッケージの管理>「Neon.SSH.NET」を追加
using Renci.SshNet;

~ 省 略 ~

//SCPクライアント
try
{
  using (var client = new ScpClient(mHostName, Convert.ToInt32(mPortNumber), mUserName, mPassword))
   {
        client.RemotePathTransformation = RemotePathTransformation.ShellQuote;
        client.Connect();
        client.Upload(new System.IO.FileInfo(mUpFullPath).OpenRead(), mUpRemotePath);
   }
}
catch (Exception ex)
{
   MessageBox.Show(ex.ToString());
}

ソースコード( VB.net)

SSH接続

Dim sshconn As New PasswordConnectionInfo("192.168.100.10", "student", "student")
Dim sshClient As New SshClient(sshconn)
Dim cmd As SshCommand

Try
    Using sshClient
      sshClient.Connect()
      cmd = sshClient.RunCommand("touch abc.txt")
      cmd.Result.Split(New Char() {Chr(10)}, StringSplitOptions.RemoveEmptyEntries)
      sshClient.Disconnect()
    End Using
Catch ex As Exception
    _Message.Text = ex.ToString()
End Try

SCP

Using scp As New ScpClient("192.168.100.10", "student", "student")
    scp.RemotePathTransformation = RemotePathTransformation.ShellQuote
    scp.Connect()

    scp.Upload(New System.IO.FileInfo("c:\\test\\file.txt").OpenRead(), "/home/student/toc/file.txt")
    scp.Disconnect()
End Using
スポンサーリンク
その他
Engineerをフォローする
レンサバ