Windows PowerShellでSSHを使う

Atomエディタで外部ターミナルを立ち上げたところ”Windwos PowerShell”が立ち上がるようになっていたので、どうせならということでSSHを使えるようにしました。

Windwos PowerShell向けOpenSSHのインストール

GitHubにMicrosoft公式のPowerShellレポジトリがあります。その中にOpenSSHプロジェクトがあるので、OSバージョンに合ったzipファイルをダウンロードし展開します。今回は”C:\ProgramFiles”に展開しました。

次にWindows PowerShellを管理者モードで起動します。

SSHモジュールのインストールにあたり、スクリプトの実行ポリシーGet-ExecutionPolicyコマンドで調べます。

Restricted(制限モード;実行不可)になっている場合、Set-ExectionPlicyコマンドでRemoteSigned(署名有りのみ実行可)へ変更します。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\WINDOWS\system32> Get-ExecutionPolicy
Restricted
PS C:\WINDOWS\system32> Set-ExecutionPolicy RemoteSigned
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、
about_Execution_Policiesのヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L) 
[S] 中断(S)  [?] ヘルプ (既定値は "N"): Y

PS C:\WINDOWS\system32> Get-ExecutionPolicy
RemoteSigned

続いて、先程OpenSSHファイルを展開したフォルダへ移動し、OpenSSHのインストールスクリプト「install-sshd.ps1」を実行します。実行後、一旦exitでターミナルを終了します。

PS C:\> cd 'C:\Program Files\OpenSSH-Win64'

PS C:\Program Files\OpenSSH-Win64> .\install-sshd.ps1
[SC] SetServiceObjectSecurity SUCCESS
[SC] ChangeServiceConfig SUCCESS
[SC] ChangeServiceConfig2 SUCCESS
sshd and ssh-agent services successfully installed
PS C:\Program Files\OpenSSH-Win64>
PS C:\Program Files\OpenSSH-Win64>exit

今回インストールしたssh系のコマンドをWindows PowerShell内で使えるようにするため、パスを通してやります。

Windowsボタン + Pauseによりシステムのプロパティを開き、
「システムの詳細設定」→詳細設定タブの「環境変数」→システム環境変数の一覧にある「Path」を編集で開き、「新規」でOpenSSHを展開したフォルダパスを追加します。
今回は”C:\Program Files\OpenSSH-Win64″に展開したので、ここのパスを追加します。

再び、Windows PowerShellを立ち上げ、”ssh”とだけコマンドを実行してみましょう。パスの設定が間違っていなければ、実行結果が表示されます。

PS C:\WINDOWS\system32> ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
           [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
           destination [command]
PS C:\WINDOWS\system32>

最後に、スクリプトの実行ポリシーを元の設定に戻しましょう。

PS C:\WINDOWS\system32> Set-ExecutionPolicy Restricted
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、
about_Execution_Policiesのヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L) 
[S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
PS C:\WINDOWS\system32> Get-ExecutionPolicy
Restricted
PS C:\WINDOWS\system32>

エイリアスの登録

この状態で、たとえば以下のようなSSHコマンドを実行すれば、Windows PowerShellからSSH接続を行います。

> ssh pi@192.168.0.6

とはいえ、できれば短いコマンドで接続できるようにしたいものです。Linux系ではよく使うエイリアスの手法ですが、PowerShellでもエイリアスが利用できます。

エイリアスファイルを置く場所は決まっています。Windows PowerShellを起動して、$profile コマンドを実行してみてください。

PS C:\Users\owner> $profile
C:\Users\owner\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PS C:\Users\owner>

ここで表示されるパスがエイリアスファイルを置く場所です。初期状態ではこのフォルダとファイルは存在しないため、New-Itemコマンドにオプションを付けることで自動作成することができます。

PS C:\Users\owner> New-Item -path $profile -type file -force

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

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018/03/01     11:48              0 Microsoft.PowerShell_profile.ps1

PS C:\Users\owner>

いま作成したファイルをエクスプローラでのぞきに行っても良いですが、notepadコマンドを使えばメモ帳で開くことができます。

PS C:\Users\owner> notepad $profile

開いたファイルにエイリアスを記述していけば良いのですが、Windows PowerShellは記述方法が独特です。次のようにfunctionで区切ってエイリアスを記述していきます。

#RaspberryPi Zero-W
function raspi-z {  
	ssh pi@192.168.0.5
}
#RaspberryPi 2
function raspi {
	ssh pi@192.168.0.6
}
#QNAP NAS
function qnap {
	ssh admin@192.168.0.10
}

記述が終わったら保存してメモ帳とWindows PowerShellを閉じます。

エイリアスで登録したコマンドを試すため、もう一度Windows PowerShellを起動します。すると以下のようなエラーが表示されると思います。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

. : このシステムではスクリプトの実行が無効になっているため、
ファイル C:\Users\owner\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
を読み込むことができません。詳細については、「about_Execution_Policies」
(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:3
+ . 'C:\Users\owner\Documents\WindowsPowerShell\Microsoft.PowerShell_pr ...
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

このエラー文にあるURLを参照してもらえば分かると思いますが、前節で変更したスクリプトの実行ポリシーがRestricted(制限モード;実行不可)になっているためです。

自作のプロファイルを使用する場合はSet-ExectionPlicyコマンドでRemoteSigned(署名有りのみ実行可)へ変更しておきます。変更は管理者モードで立ち上げたWindows PowerShellで行ってください。

PS C:\WINDOWS\system32> Set-ExecutionPolicy RemoteSigned
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、
about_Execution_Policiesのヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L) 
[S] 中断(S)  [?] ヘルプ (既定値は "N"): Y

PS C:\WINDOWS\system32> Get-ExecutionPolicy
RemoteSigned

もう一度、Windows PowerShellを立ち上げると、エラーメッセージは表示されないでしょう。最後にエイリアスが有効になっているか確かめてみます。

PS C:\Users\owner> raspi
pi@192.168.0.6's password:

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Feb 28 21:55:50 2018 from 192.168.0.11
pi@raspberrypi:~ $

うまくいきました。