PowerShellからSSH経由でLinuxに接続する

PowerShellからSSH経由でLinuxに接続する

管理人は会社で200+のVM(90%以上はWindows or Linux)が動作する環境を管理していますが、頻繁にVMのScrap & Buildが発生します。BuildしたらそのVMが通信”できるべき”相手との疎通確認を実施するべきなのですが、それが非常に面倒くさい…

PowerShellといえばWindows限定というイメージがありますが、実はSSH経由でLinuxに接続することも可能です。LinuxはSSH接続さえできれば大抵のタスクが実行できるので、うまくやればWindowsとLinux共通のタスクを単一のスクリプトで実施することさえできます。元々VM自体の自動展開スクリプトをPowerShellで書いていたので、運用環境をPowerShellに統一すべく今回挑戦してみました。

[事前作業] PowerShell 4.0に更新する

今回のクライアント環境(接続元)はWindows 7 SP1ですが、PowerShellのバージョンは以下の通りでした。プロンプトが普通のPowerShellとは異なりますが、これは管理人の環境にVMwareが公開しているPowerCLIが導入されているためです。

Windows 7のデフォルトのPowerShellのバージョンであるところのVer.2.0でした。今回作成するスクリプトはWindows Server 2012 = PowerShell Ver. 4.0でも動かす予定なので、念のためバージョンを合わせることにします。

PowerShell 4.0はWindows Management Framework 4.0という管理パッケージに同梱されているので、その導入を行います。.NET Framework 4.5が導入の前提条件となっているので、未導入でしたらこちらを先に導入しましょう。

Windows Management Framework 4.0を導入すると、PowerShellのバージョンが4.0に上がっているはずです。

PowerShellからSSHを利用するためのモジュールの追加

当然ではありますが、デフォルトの状態ではPowerShell(というかWindows)はSSHを話すことができません。PowerShellでSSHを公式にサポートするなんて話も聞こえてきますが、まだ開発初期段階とのことなので現時点ではなんとも言えません。ここでは、PowerShellからSSHしたい@AWS情報ブログを大いに参考にしながら、とりあえず接続ができるところまで作ってみます。

環境構築は、上記ブログの記事そのままで基本的にできるはずです。管理人のモジュールパスは以下の通りで、

かつC:\Program Files (x86)\WindowsPowerShell\Modulesが存在していたので(空でしたが)、そのディレクトリにダウンロード・解凍したSSH-SessionsPSv3.zipを置いただけで、PowerShellから認識されました。

Linuxホストにpingを打たせてその結果を取得する

サンプルとして、IP reachableなLinuxホストに接続してpingを実行させ、その結果を取得してみます。多少冗長ですが書いてみるとこんな感じになりました。

たとえばこれをExecute-LinuxPing_single.ps1という名前で保存した場合、

こんな感じの出力を得られるはずです。最後の条件分岐の部分は、リモートのLinuxの返し方に応じた修正が必要になります(今回の宛先はUbuntu Workstation 12.0.4 LTS)。

ちなみに、上の例では出力結果を受け取る時点で改行文字(PowerShellでは”¥”ではなく”`”でエスケープする)でsplitして$Resultに行単位で格納していますが、配布サイトには接続先ホストが単一の場合は実行結果はSystem.Stringで返されると書かれています。これは厳密に言うと、オブジェクト型の配列にString型で実行結果の文字列が格納されるということのようです。仮にsplitをしないで単純に$RawReturnに実行結果を代入したとしたら、$RawReturn.Countは1に、$RawReturn[0].Countは実行結果の文字数になります。

管理人はヘタレなので、これでしばらく悩みました…

 

コメントする