前回、sshを使ってパスワードなしでログインする方法を書きましたが、linuxのコマンド"expect"を利用することでも、パスワードなしでログインできたのでメモします。
環境
前回と同じように、CygwinからUbunsuサーバに接続してみる。
- 接続先: ubuntu
- 接続元: cygwin
expectコマンドの紹介
expectコマンドは対話型シェルを実現するためのコマンド。デフォルトでは入っていないようなので、手に入れる。インストール方法は省略します。
覚えるべきコマンドは以下の5つ。
- set timeout
設定した秒数の間、標準入力から応答がないとexpectは、終了します。 - spawn
自動で実行したいコマンドを指定します。 - expect
指定された文字列を待ちます。 - send
指定された文字列(「”」に囲まれた文字)を先に実行したコマンドのジョブに送信します。 - interact
実行ジョブの標準入出力をキーボードと画面にします。端末からログインしたのと同じ状態になります。
サンプルスクリプト
telnet,ssh,scpでのパスワードなし接続方法を書きます。
ubuntuサーバにtsu-neraユーザでログインします。
telnet
#!/bin/bash
# ログイン情報を入力
hostname=ubuntu
username=tsu-nera
password=*********
# expect コマンドを実行
expect -c "
# タイムアウト値の指定
set timeout 20
# spawnで新しいジョブ生成
spawn telnet $hostname
# login
expect login:
send \"$username\n\"
expect Password:
send \"$password\n\"
# spawnジョブを通常の通信にする
interact
"
ssh
#!/bin/bash
# ログイン情報を入力
hostname=ubuntu
username=tsu-nera
password=*********
# expect コマンドを実行
expect -c "
# タイムアウト値の指定
set timeout 20
# spawnで新しいジョブ生成
spawn ssh -l $username $hostname
# login
expect password:
send \"$password\n\"
# spawnジョブを通常の通信にする
interact
"
scp
ファイルパスは第一引数で指定します。
#!/bin/bash
# ログイン情報を入力
hostname=ubuntu
username=tsu-nera
password=*********
# ファイルパスは第一引数で
if [ "$1" != "" ]; then
filepass=$1
else
echo "Error: Input File Path"
exit 1
fi
# expect コマンドを実行
expect -c "
# タイムアウト値の指定
set timeout 20
# spawnで新しいジョブ生成
spawn scp $username@$hostname:$filepass .
# login
expect password:
send \"$password\n\"
expect $
"
exit 0