前回、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