BATファイルでパスワード付きSSH接続

c#

終了作業を自動化したいので考えて見ました。pythonで始めましたが何だか情報がまとまっていないしうまく行かない。そこで慣れ親しんでいるc#でやってみることに。
GUI用も作成中(※)ですが、まずはWindowsのBATファイルで実行できるコマンドラインに引数を扱えるものにしました。
※GUI版は自動で進捗結果の終了をメールでもLINE notifyでも(選択可)知らせてくれるものにしています。
●追加情報(2019.04.14)
c#で作成したパスワード認証のプログラム(sshex.exe)で認証キーでパスワードなしにしたサーバーに接続できる。ただしパスワードを誤ったものにすると接続できない・・・。ちょっとわからないな。
ex) sshex kuroyan lgs.jp pwdxxxx  ls -al
ssh kuroyan@lgs.jp <– password不要
ssh kuroyan@kuroyan.sakura.ne.jp <– password不要
ssh hoge <– config記述のHostName <– password不要

●使用方法
1.必要ファイル
 残念ながらexeだけではエラーで動作できませんでした。以下の(1)から(3)すべてをc:\sampleのようにフォルダを作成して置かないとなりません。元ファイルはc#が生成したものなので他のパソコンにコピーして動作するかは確認中です・・・。
(1)net.bat <– これは以下のソースを例にして作成します。
(2)Renci.SshNet
(3)sshex.exe

2.BATファイル作成
以下のBATファイルをnotepadでもなんでもいいですがエディターで作成します。
今回まずはWindowsのコマンドを実行し、その終了を待ってsshでワークステーションに接続しワークステーションのコマンドを実行させるものです。notepad.exeでnet.batを起動させてnet.batの編集を行わせていますがあくまで例題です。やりたいWindowsのコマンド(アプリケーション)との組み合わせについては使用に合わせてください。
userID:ssh接続先のID
URL: IPアドレスでもurl表示でも可(例192.168.1.24)または、sakura.ne.jp)
接続先での実行コマンド:今回は例として ls -al(
 ※コマンドはスペースで2つのものを想定したもの(lsと-al)となります。1つだけであればc#のソースを修正しないとなりません。コマンドの個数を自動認識するものに修正予定です。
net.bat

@echo off
call notepad.exe net.bat
sshex userID URL PASSWORD ls -al

if %ERRORLEVEL% equ 0 (
    echo 成功しています
)else (
    echo 接続エラーです
)
@echo.

以下c#のソースコードです
●c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using Renci.SshNet;

namespace sshex
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] Commands = System.Environment.GetCommandLineArgs();

            // サーバURL (IPアドレスも可"
            string url = Commands[2];
            //string url = "xxx.xxx.xxx.xxx";
            // サーバポート
            int port = 22;
            // ユーザ
            string username = Commands[1]; ;
            // パスワード
            string password = Commands[3];

            ConnectionInfo CInfo = new ConnectionInfo(url, port, username,
                new AuthenticationMethod[] {
                    new PasswordAuthenticationMethod(username, password)
                }
            );

            string command = Commands[4] + " " + Commands[5];

            // using (SshClient sshClient = new SshClient(url, port, username, password))
            try
            {
                using (SshClient sshClient = new SshClient(CInfo))
                {
                    sshClient.Connect();
                    string temp = "";
                    using (SshCommand cmd = sshClient.CreateCommand(command))
                    {
                        cmd.Execute();
                        temp = cmd.Result;
                    }
                    Console.WriteLine(temp);
                    sshClient.Disconnect();
                }
            }
            catch
            {
                Environment.Exit(-1); //-- connect error
                return;
            }
            Environment.Exit(0);
        }
    }
}

●開発環境
c#で使用できるSSHのライブラリはSSH.NETがうまくsshに接続してくれます。GUIでもコンソールアプリでも問題ありません。

ssh.netはnugetで入れるのでVisual Studio2017で行う。もう2010の時代ではないか。IDEがどんどん重くなるから2010は貴重なんだけど・・・。Windows7では4Gメモリでは限界だ。仕事にならない。2017に慣れた方がいいね。gitも使えるし結構優れものだ。メモリ増設でと思うけどWin7は2020年1月でサポート終了だから2017の使用頻度と相談かな。メモリそれほど高くないようだし。

No tags for this post.
タイトルとURLをコピーしました