どうしても環境を変えられず SSH のパスフレーズを手動入力せざるをえないときってありますよね?
それが1回、2回であればまだ良いのですが、ある程度定期的に SSH でログインしてあれこれやらなきゃいけないってなると、もう発狂ものです。
こういったケースはときどき発生するのですが、実は自動入力出来る方法があるってことをふいに知ったのでメモっておきます。
※数ヶ月前の話ですが、それでもブログに記録を残しておいた方が良いと思ったので、タイミングずれましたが書いておきます。
先に、普通に SSH でログインする方法とベストな選択肢に触れておきます。
一番シンプルに使うのなら、以下の方法ですね。
ssh -p 12345 user@example.com
ユーザー名: user、ポート番号: 12345 のとき、パスフレーズなしで公開鍵認証の設定がしてあれば、このままログイン出来るはずです。
これも今回のケースが解決してから知ったので余談になりますが、 ログイン先のサーバにて公開鍵を載せておくファイル、.ssh/authorized_keys
に command="command"
といった形式でコマンドを書いておくと、ここに書かれたコマンドしか実行出来なくなるようです。
今度改めて調べてみようかな。
さて、上記の SSH によるログインで、パスフレーズが設定されていた場合、
user@example.com's password:
こんな感じに、「パスフレーズを入力してね?」と表示されるわけですが、 毎回毎回与えられたパスフレーズをテキストファイルからコピってターミナルに貼付けて・・・とやっていると、段々と強いられている感がじわじわきて心情的にもよろしくありません。
実はこちら、expect, spawn, send あたりのコマンドを使うことにより、手動想定のインタラクティブな入力画面においても、自動で入力、その後のコマンドが実行できます。(全部使ったことなかった・・・)
期待した入力と一致した場合に、任意のコマンドを実行できます。
-c オプションとともにコマンドを渡すことが出来ます。さらにこのコマンド内で interact コマンドを呼ぶと、処理をシェルに戻してくれると。
後に続くコマンドを送り先で実行します。expect コマンドとセットで使うこと前提なんですかね?
今回のようなケースでは、expect コマンドの後に実際の入力待ちで入力を行う場合などに使います。
expect -c "
spawn command arg1 arg2
expect \"user@example.com's password: \"
sleep 1
send \"passphrase123\n\"
interact
"
あとは、これを例えばシェルコマンドとしてファイルにまとめておいて、任意のタイミングで実行してあげれば良いだけですね。
内部の expect コマンドで「パスフレーズを入力してね?」と聞かれた際に、 予めこういうテキストが入力されたら、と用意されているところにマッチするので、パスフレーズを send コマンドで送ってくれます。自動化最高。
『なぜ知らなかった』の一言に尽きます。
今度機会があれば、もうちょっと掘り下げて使えるようになりたいですね!
この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります