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問わず、一元管理できそうだ。