ばうあーろぐ TOP へ戻る

SSH パスフレーズの手動入力を強いられているんだ!

どうしても環境を変えられず SSH のパスフレーズを手動入力せざるをえないときってありますよね?

それが1回、2回であればまだ良いのですが、ある程度定期的に SSH でログインしてあれこれやらなきゃいけないってなると、もう発狂ものです。

こういったケースはときどき発生するのですが、実は自動入力出来る方法があるってことをふいに知ったのでメモっておきます。

※数ヶ月前の話ですが、それでもブログに記録を残しておいた方が良いと思ったので、タイミングずれましたが書いておきます。

SSH でのログインの仕方

先に、普通に SSH でログインする方法とベストな選択肢に触れておきます。

一番シンプルに使うのなら、以下の方法ですね。

ssh -p 12345 user@example.com

ユーザー名: user、ポート番号: 12345 のとき、パスフレーズなしで公開鍵認証の設定がしてあれば、このままログイン出来るはずです。

毎回やることが決まっているとき

これも今回のケースが解決してから知ったので余談になりますが、 ログイン先のサーバにて公開鍵を載せておくファイル、.ssh/authorized_keyscommand="command" といった形式でコマンドを書いておくと、ここに書かれたコマンドしか実行出来なくなるようです。

今度改めて調べてみようかな。

手動入力を強いられているんだ!

さて、上記の SSH によるログインで、パスフレーズが設定されていた場合、

user@example.com's password: 

こんな感じに、「パスフレーズを入力してね?」と表示されるわけですが、 毎回毎回与えられたパスフレーズをテキストファイルからコピってターミナルに貼付けて・・・とやっていると、段々と強いられている感がじわじわきて心情的にもよろしくありません。

実はこちら、expect, spawn, send あたりのコマンドを使うことにより、手動想定のインタラクティブな入力画面においても、自動で入力、その後のコマンドが実行できます。(全部使ったことなかった・・・)

expect コマンド

期待した入力と一致した場合に、任意のコマンドを実行できます。

-c オプションとともにコマンドを渡すことが出来ます。さらにこのコマンド内で interact コマンドを呼ぶと、処理をシェルに戻してくれると。

spawn コマンド

後に続くコマンドを送り先で実行します。expect コマンドとセットで使うこと前提なんですかね?

send コマンド

今回のようなケースでは、expect コマンドの後に実際の入力待ちで入力を行う場合などに使います。

組み合わせ例

expect -c "
spawn command arg1 arg2
expect \"user@example.com's password: \"
sleep 1
send \"passphrase123\n\"
interact
"

あとは、これを例えばシェルコマンドとしてファイルにまとめておいて、任意のタイミングで実行してあげれば良いだけですね。

内部の expect コマンドで「パスフレーズを入力してね?」と聞かれた際に、 予めこういうテキストが入力されたら、と用意されているところにマッチするので、パスフレーズを send コマンドで送ってくれます。自動化最高。

まとめ

『なぜ知らなかった』の一言に尽きます。

今度機会があれば、もうちょっと掘り下げて使えるようになりたいですね!

参考URL

もし記事内に誤りなどございましたら、 @girigiribauer までご一報いただけると助かります。