読者です 読者をやめる 読者になる 読者になる

ちくわ

ちくわにきゅうりを入れるとうまい

expect + scp でメタ文字(* : アスタリスク)を使用した際に失敗した時のメモ

Linux

以下の様に、expect を使用して、SSH や SCP を使用したときのパスワード入力を

自動化するシェルスクリプトを用意。

ローカルの /var/tmp/test_from/*.txt をごそっと SCP する動作期待しました。

$ cat test.sh

#!/bin/bash

# expect の function

func_expect (){

expect -c "

spawn $1

expect {

\"Are you sure you want to continue connecting (yes/no)?\" {

send \"yes\r\"

expect \"password:\"

send \"hogehoge\r\"

} \"password:\" {

send \"hogehoge\r\"

} \"root@localhost's password:\" {

send \"hogehoge\r\"

}

}

interact

"

}

# ファイルを SCP で送信

func_expect "scp /var/tmp/test_from/*.txt root@192.168.1.1:/var/tmp/test_to"

実行してみるとこんな感じにエラーになる

spawn scp /var/tmp/test_from/*.txt root@192.168.1.1:/var/tmp/test_to

root@192.168.1.1's password:

/var/tmp/test_from/*.txt: No such file or directory

Killed by signal 1.

/var/tmp/test_from/*.txt が無いと言われてるけど、

実際に手で実行すると行ける...なぜだ...

ぐぐってみると以下のサイトを発見

http://stackoverflow.com/questions/7487964/bash-expect-scp-problem-on-multiple-files

ワイルドカードをうまく認識してくれない?的な?

このサイトに習って spawn で呼び出されるところを以下のようにしたらいけた

func_expect "sh -c \"scp /var/tmp/test_from/*.txt root@192.168.1.1:/var/tmp/test_to\""