【C#】SSH通信を行う最も簡単な方法

C#

本日はC#でSSH接続してコマンド実行するツールを作成したお話。SSH通信するライブラリでメジャー所はSSH.NETか、
SharpSSHあたりが有名ですが、後者はもうかなり前に開発が終了してるようなので今回はSSH.NETを利用し作成してみた。

SSH通信を行う為の下準備

SSH通信を行う為にSsh.NetをNugetでインストールを試みる。が、
‘SSH.NET’ にはすでに ‘SshNet.Security.Cryptography’ に対して定義された依存関係があります。
とポップアップが出現しインストール段階で即躓く。

nuget(VS自体)の更新が必要だった様で更新したら無事インストール出来たので、同じ症状が出た人は先ず更新すべし。

SSH接続(ユーザー名とパスワード)を行う

取り敢えずkssh通信を行うクラスを作成し、接続部分はこんな感じ↓

渡されたIPアドレス・ID・PASSにログインを試みて結果(strResult)を返す。
ssh.Connect()して、接続成功すればIsConnected=Trueとなりますが、失敗した場合はただFalseになってくれる訳では無く例外を吐くのでしっかり拾ってやる必要がある。

パスワード認証に失敗した場合はエラーメッセージでPermission denied (password).を返します。

切断処理を行う

続いて切断処理↓

接続後はしっかり切断も忘れず行うべし(かなり忘れがち)。実際に使う場合はこんな感じでクラス化して接続・コマンド実行・切断で分ける形になると思うので、不要になったらしっかりDisconnect&Disposeを!

コマンドを実行する

strCmdで渡されたコマンドを実行して結果(strResult)を返す。
ログインされてない状態でコマンドを実行するとエラーとなるため未ログインの状態ではこの関数は呼ばれないようにするか、事前に拾ってfalseで返す等の処置が必要。

最初のログインが遅い、時間が掛かる場合

TeraTermとかだとそんなに遅くないのに、ssh.netを用いたアプリの場合のみログインに時間が掛かる場合が有ります。
相手がサーバやPC等の場合はDNSでの名前解決に時間がかかっているケースが殆どで、その場合UseDNS=noの設定を入れると改善される。

だけどもIOT機器等でそんな設定が存在しない!って場合はDLLが古い可能性大なので更新してみましょう~(ᵔᴥᵔ)

コメント