AWSの運用管理をWindows端末からしたいという要件は多いはず。PowerShellはまだ覚えなければいけないことが山積みだけど、対象にLinux混在も避け難い。色々検討した結果(実はそんなにしてないけど)、下記のモジュールを使ってSSHクライアントしてみることにした。今のところ問題なく動いている。

SSH from PowerShell using the SSH.NET library

他にも公開されているモジュールはあったのだけど、オープンソースで信頼性が高そうに見えたので、こちらを採用した。

PowerShellへのモジュール追加

まずはPowerShellのお勉強から。追加したいモジュールを配置するパスが決まっているらしい。

PS C:\> $env:PSModulePath
C:\Users\myuser\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\;C:\P
rogram Files (x86)\AWS Tools\PowerShell\

ひとまずSSHクライアントを使いたいユーザにだけ適用できれば良いので、ユーザプロファイルの下にフォルダを掘ってファイルを配置することにした。

モジュールのダウンロード

モジュールも同ページ内のこちらから。PowerShell v2用とv3、v4用に分かれているようだ。PowerShellのバージョン確認は毎度忘れるので下記の覚えやすいもので確認(他にも方法はある模様)。

PS C:\> $Host.Version

Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1

今回はPowerShellのバージョンが4.0なので、.NET 4.0 / PowerShell v3- and v4-compatible.をダウンロードする。後で怒られるので、ダウンロードしたzipファイルは解凍前にプロパティからブロックの解除をしておく。

モジュールの配置

zipファイルを解凍して、下記のように$env:PSModulePathに書いてあったパスに配置する。フォルダすら無かったのでまずはPowerShellっぽくフォルダを作成して。

PS C:\> New-Item $env:USERPROFILE\Documents\WindowsPowerShell\Modules -ItemType directory

 ディレクトリ: C:\Users\myuser\Documents\WindowsPowerShell

Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2015/04/20 21:15 Modules

配置した結果が以下。

PS C:\> Get-ChildItem -Recurse $env:USERPROFILE\Documents\WindowsPowerShell\Modules

 ディレクトリ: C:\Users\myuser\Documents\WindowsPowerShell\Modules

Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2015/04/20 21:18 SSH-Sessions

 ディレクトリ: C:\Users\myuser\Documents\WindowsPowerShell\Modules\SSH-Sessions

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2015/04/20 21:18 439808 Renci.SshNet.dll
-a--- 2015/04/20 21:18 5042 SSH-Sessions.psd1
-a--- 2015/04/20 21:18 35486 SSH-Sessions.psm1

モジュールのインポート

これでインポートの準備が整ったはずなので。インポートしてみる。

PS C:\> Get-Module -ListAvailable

 ディレクトリ: C:\Users\myuser\Documents\WindowsPowerShell\Modules

ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 1.0.0.4 SSH-Sessions {ConvertFrom-SecureToPlain, New-SshSession, Invoke-SshCommand, Enter-SshSession...}
:::
PS C:\> Import-Module SSH-Sessions
PS C:\> Get-Module

ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 3.1.0.0 Microsoft.PowerShell.Management {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest 3.1.0.0 Microsoft.PowerShell.Utility {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script 1.0.0.4 SSH-Sessions {ConvertFrom-SecureToPlain, Enter-SshSession, Get-SshSession, Invoke-SshCommand...}

無事インポートされた。もちろん実際にはそんなにスムーズに進んだわけではない。

SSH接続

こんなコマンドが使えるらしい。PSsessionと似た感じで使えるようだ。

PS C:\> Get-Command | Select-String "ssh"

Enter-SshSession
Get-SshSession
Invoke-SshCommand
New-SshSession
Remove-SshSession

Enter-SshSessionだと鍵認証が使えなかったので、New-SshSessionを使う。

PS C:\> New-SshSession -ComputerName bastion -Username ec2-user -KeyFile C:\Users\myuser\keys\ssh_key.pem -Port 22222
Key file specified. Will override password. Trying to read key file...
Successfully connected to bastion

PS C:\> Get-SshSession

ComputerName Connected
------------ ---------
bastion True

どうやら上手く行った。

SshSessionからコマンド実行

それではコマンド実行してみる。

PS C:\> Invoke-SshCommand -ComputerName bastion -Command "uname -n"
bastion: ip-172-16-0-208
ip-172-16-0-208

なかなか良さそう、と思いきや。実行したいスクリプトの実行に失敗した。何かと思ったら。

PS C:\> Invoke-SshCommand -ComputerName bastion -Command "echo `$PATH"
bastion: /usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/.rvm/bin
/usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/.rvm/bin

どうもユーザ環境設定ファイルが読み込まれていないということに気付いた。そういうことか。

PS C:\> Invoke-SshCommand -ComputerName bastion -Command "source .profile;echo `$PATH"
bastion: /usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/.rvm/bin:/home/ec2-user/.rvm/bin
/usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/.rvm/bin:/home/ec2-user/.rvm/bin

正しい回避方法かはわからないけど、ひとまず手動で.profileを読み込むことで問題解決した。

PowerShellの勉強そのものがまだまだ足りないけど、これでWindows、Linux問わず、一元管理できそうだ。

TOP