Expect コマンドでパスワードなしでログインする方法(telnet,ssh,scp)

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