Corredor

ウェブ、プログラミングの勉強メモ。

SSH 接続のパスワード入力を自動化するシェルスクリプトを作ってコマンド化した

MacOS にて実施。

SSH 接続する際、とある理由で公開鍵認証方式が使えず、sshpass という便利なツールも導入できなかったので、他の方法でパスワード入力を自動化する方法を調べた。

expectspawnsend コマンドで作れる!

結論からいうと、以下のようなシェルスクリプトを作れば、SSH 接続とパスワード入力を自動化できる。

#!/bin/sh
 
expect -c "
set timeout 5
spawn ssh -p 22 【ユーザ名】@【接続先 URL】
expect \"Password:\"
send \"【パスワード文字列】\n\"
interact
"
  • expect -c で対話を自動化する。以降のコマンド全体をダブルクォートで囲んでいる
  • set timeout で応答がない場合のタイムアウト秒数を設定する
  • spawn で任意のコマンド入力を再現する
  • spawn 直後の expect で、指定の文言が出力されていることを確認する
    • 今回の場合、ssh コマンド実行後にパスワードを問われる「Password:」という文字列が出力されているかを確認している
    • ダブルクォートは \ でエスケープし、\" と書く
  • send でパスワード文字列の入力を再現している。エンターキーによる改行は \n を付与することで再現する
  • interact でプロセスの制御をユーザに渡し、ユーザからの標準入力を受け付けるようにする

というワケ。

こんなファイルを ~/myssh.sh に保存して、$ sh ~/myssh.sh という風に実行してやれば、自動 SSH ログインできるようになった。

コマンド化する

これだけでもだいぶ楽になったが、毎回 $ sh ~/myssh.sh とタイプするのは面倒だ。そこで、自作コマンドとして動作するようにする。

まずは PATH を確認する。最初から /usr/local/bin などに PATH が通っていると思うのでココに置いても良いが、今回はユーザホームの ~/bin/ 配下に自作コマンドを置きたいので、~/.bash_profile にて PATH を追加する。

# ~/.bash_profile
export PATH=~/bin:$PATH

このようにすると、~/ が展開されてユーザホームのフルパスを示すようになる。

$ echo $PATH
/Users/Neo/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

# 最初の「/Users/Neo/bin」がコレ。

編集後は $ . ~/.bash_profile で再読込する (ピリオド .source コマンドと同じ)。

次に、先程作った myssh.sh~/bin/ 配下に移動し、名前を拡張子なしの myssh にリネームする。

リネームできたら、コマンドラインから以下の要領で全ユーザに実行権限を付ける。

$ chmod a+x ~/bin/myssh

ココまでできたら完成。以降は $ myssh と打つだけで自動 SSH ログインできるようになる。やったぜ。

参考文献

sshpass については以下などを参照のこと。

OpenSSH[実践]入門 Software Design plus

OpenSSH[実践]入門 Software Design plus

実用SSH 第2版―セキュアシェル徹底活用ガイド

実用SSH 第2版―セキュアシェル徹底活用ガイド

  • 作者: Daniel J. Barrett,Richard E. Silverman,Robert G. Byrnes,小島肇,坂井順行,鹿田幸治,園田道夫,高橋基信,根津研介,宮本久仁男
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2006/11/22
  • メディア: 大型本
  • 購入: 2人 クリック: 79回
  • この商品を含むブログ (48件) を見る