ExpectスクリプトSSHの例のチュートリアルを期待する。
「Expectスクリプト」は、素晴らしいLinux/Unixユーティリティです。私は毎日の生活で多くのUnixサーバーに関わる必要があります。それが仕事であるか、ホスティングサーバーであるかに関わらずです。そのため、多くのSSHユーザーの情報、パスワード、そしてSUユーザーとそのパスワードを覚えなければなりません。サーバーの数が多いと、少し混乱します。そこで、サーバーへの自動ログインを行うスクリプトの作成を考えました。最初に取り組んだ時、SSHパスワードの入力方法について分からず困りました。通常のUnixシェルにはログイン時にパスワードを送信する方法がありません。その後、プログラムが入力のためにターミナルを開くときに自動化することができる「Expectスクリプト」について知ることができました。
Expect スクリプト
Expect Scriptは非常に学びやすく、その名前が示すように、コマンドの出力を解析して指定された正規表現と一致した場合に、指定された命令を処理する仕組みです。
日本語では、以下の文章を一つのオプションで自然な表現に言い換えます:
「Expectスクリプトを使用したSSHの例」
以下は、SSHサーバーへの自動ログイン、スーパーユーザーでのログイン、そして簡単なコマンドの実行のために作成したスクリプトです。 sshsudologin.expect
#!/usr/bin/expect
#Usage sshsudologin.expect <host> <ssh user> <ssh password> <su user> <su password>
set timeout 60
spawn ssh [lindex $argv 1]@[lindex $argv 0]
expect "yes/no" {
send "yes\r"
expect "*?assword" { send "[lindex $argv 2]\r" }
} "*?assword" { send "[lindex $argv 2]\r" }
expect "# " { send "su - [lindex $argv 3]\r" }
expect ": " { send "[lindex $argv 4]\r" }
expect "# " { send "ls -ltr\r" }
interact
Expectスクリプトに関する重要なポイント
-
- 最初の行に注目してください。そこにはexpectスクリプトがインタプリタとして使用されることが指定されています。
-
- expectスクリプトのデフォルトのタイムアウトは10秒ですが、ログインプロンプトが表示されるまでに時間がかかる場合のタイムアウトの問題を避けるために、タイムアウトを60秒に設定しました。
-
- expectコマンド、正規表現、そして送信するべき応答が続くことに注目してください。最初のYes/Noの選択肢は、リモートサーバーのキーがまだインポートされていない場合に失敗しないようにするために追加されています。
-
- 他のexpectの正規表現はサーバーによって異なります。私のサーバーでは、それが「#」で終わりますが、他のサーバーでは「$」で終わる場合もありますので、それに応じて編集する必要があるかもしれません。チェックするのは、expectコマンドの正規表現が一致することで、それに応じたコマンドやパスワードを送信するためです。
- 最後のexpectコマンドは、サーバーにログインした後にコマンドも送信できることを示しています。
上記の期待されるスクリプトを正しいパラメータで実行した結果をこちらに示します。
scdev@Pankajs-MacBook-Pro:~$/Users/scdev/scripts/sshloginsudo.expect 'scdev.com' 'scdev' 'ssh_pwd' 'su_user' 'su_pwd'
spawn ssh scdev@scdev.com
scdev@scdev.com's password:
Last login: Sun Jun 9 19:54:17 2013 from c-67-161-57-160.hsd1.ca.comcast.net
scdev@journal [~]# su - su_user
Password:
su_user@journal [~]# ls -ltr
total 708
...
Expectスクリプトの追加のヒント
- すべての情報が引数として渡されるため、expectスクリプトは再利用することができますので、各情報のためにエイリアスを作成してクイックなログインを行い、すべてのパラメータを入力するときに時間を節約するのがベストです。例えば、alias journal=”/Users/scdev/scripts/sshloginsudo.expect ‘scdev.com’ ‘scdev’ ‘ssh_pwd’ ‘su_user’ ‘su_pwd'”です。パスワードには特殊文字が含まれることが多いため、引数を渡すときには常にシングルクォーテーションを使用するのがベストです。
上記のスクリプトは、Mac OSおよびLinuxシステムでテストされています。参照:SourceForgeページ