概要
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