0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

私は普段Windowsを使用しているのですが、PowerShellを使ってサーバにsshした際「あれ?Tabを押しても接続先の候補が補完されないぞ? Linuxでは補完されたよな?」となりました。

PowerShellでsshした際に接続先候補が補完できるようにしたので、設定方法についてまとめていきたいと思います。

やったこと

やったことをまとめると以下になります。

  1. .ssh\configの作成
  2. スクリプトブロックに、.ssh\configからHost情報だけを抽出するスクリプトを記述
  3. Register-ArgumentCompleterを使用してタブ補完を登録
  4. タブ補完設定の永続化

.ssh\configの作成

例として、以下のような.ssh\configを使用します。

.ssh\config
Host SERVER_1
    HostName EXAMPLE1.JP
    User hoge1
    Port 22

Host SERVER_2
    HostName EXAMPLE2.JP
    User hoge2
    Port 22

Host情報を抽出するスクリプト作成

PowerShellプログラミング言語では、スクリプトをスクリプトブロックという1つのまとまりとして定義できるそうです。
詳細は公式の説明を参照してください。

作成したスクリプトブロックは以下になります。
<your\ssh\config\path>の部分を、読み取りたい.ssh\configのパスに書き換えてください。

$scriptBlock = {
    cat <your\ssh\config\path> | Where-Object {$_ -match "^host "} | ForEach-Object {$_.Remove(0, 5)}
    }

説明

スクリプトブロックでは、3つのコマンドをパイプでつなげて接続先の名称のみを抽出しています。

cat <your\ssh\config\path>
configに記述されている内容を取得しています。

Where-Object {$_ -match "^host "}
前処理で各行の記述内容がオブジェクトとして得られるため、正規表現の前方一致で "Host" から始まっている行のみを選択します。

ForEach-Object {$_.Remove(0, 5)}
前処理から得られた行に対して、先頭から5文字目まで("host" + 空白)を削除することで接続先名称のみを抽出します。

タブ補完の登録

PowerShellを開き、下記のように実行します。

PS> $scriptBlock = {
    cat <your\absolute\ssh\config\path> | Where-Object {$_ -match "^Host "} | ForEach-Object {$_.Remove(0, 5)}
    }

PS> Register-ArgumentCompleter -CommandName ssh -ScriptBlock $scriptBlock

説明

Register-ArgumentCompleterを使用して、sshコマンドのタブ補完を登録しています。
タブ補完で表示される候補は$scriptBlockより得られた値です。

上記コマンドを実行した場合、実行したPowerShellでしかタブ補完が使えません。
また、PowerShellを閉じるとタブ補完は使えなくなります。
次の手順ではタブ補完を永続化させる設定を実施します。

タブ補完設定の永続化

PowerShellプロファイルに先ほどのスクリプトを設定することで、タブ補完設定を永続化させます。それではタブ補完を永続化させる方法について説明していきます。

詳しくは公式の説明を見ていただきたいのですが、PowerShellプロファイルの種類と保存場所にはいくつか種類があるようです。
今回は、「現在のユーザー、現在のホスト」のプロファイルを使用したいと思います。

Microsoft.PowerShell_profile.ps1
$scriptBlock = {
    cat <your\absolute\ssh\config\path> | Where-Object {$_ -match "^Host "} | ForEach-Object {$_.Remove(0, 5)}
    }

Register-ArgumentCompleter -CommandName ssh -ScriptBlock $scriptBlock

おわりに

以上、PowerShellでsshした際のタブ補完設定についてまとめてみました。
sshコマンド以外にも応用できるので、タブ補完が使えないなと思った際には活用していきたいと思います。

参考サイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?