4

私は期待に関連する問題を抱えています。

次の行を含むabc.shを実行すると

#!/usr/bin/expect
spawn scp /etc/httpd/conf/httpd.conf 192.168.0.12:/tmp
######################
expect {
-re "password:" {
exp_send "PASSWORD\r"
}
}
interact

その作品はうまくいきます

しかし、実行中のスクリプトで同様のコードを使用すると機能しません


#!/bin/bash
clear
while read -u3 LINE
do
code .........
code .......
code  ........

REMOTE_COMMANDS1="scp -r -v $BASE_DIRECTORY/$USERNAME $D_IPADDRESS:/home/"

spawn $REMOTE_COMMANDS1
######################
expect {
-re "password:" {
exp_send "redhat\r"
}
}
interact


done 3< /opt/sitelist.txt

それはエラーを与える

./script.sh: 62 行目: 予期しないトークン付近の構文エラー}' ./script.sh: line 62:}'

スクリプトの先頭に #!/usr/bin/expect を含めていないことが原因だと思いますが、これを使用してスクリプトを実行すると、何も実行されず、実行後にすべてのコードが端末に表示されます。#!/usr/bin/expect と #!/bin/bash を同時にインクルードできますか?

よろしく、 アディティア

4

1 に答える 1

10

もちろん、bash は、Java/Perl/Python 構文を解釈できないのと同様に、expect コマンドを解釈できません。いくつかのアプローチがあります。

Expect スクリプトを別のプログラムとして記述し、bash スクリプトから呼び出します。

#!/bin/bash
clear
while read -u3 LINE
do
    #...
    ./expect_scp.exp "$BASE_DIR" "$D_IPADDRESS" "$USERNAME" "$PASSWORD"
done 3< /opt/sitelist.txt

そしてexpect_scp.exp_

#!/usr/bin/expect

set base_dir  [lindex $argv 0]
set remote_ip [lindex $argv 1]
set username  [lindex $argv 2]
set password  [lindex $argv 3]
# or
foreach {base_dir remote_ip username password} $argv {break}

spawn scp -rv $base_dir/$username $remote_ip:/home/
expect -re "password:"
exp_send -- "$password\r"
interact

引用に適切な注意を払って、期待スクリプトをbashスクリプト内に配置できます。幸いなことに、一重引用符は特別なものではありません。

#!/bin/bash
clear
export BASE_DIR D_IPADDRESS USERNAME PASSWORD
while read -u3 LINE
do
    #...
    expect -c '
        spawn scp -rv $env(BASE_DIR)/$env(USERNAME) $env(D_IPADDRESS):/home/
        expect -re "password:"
        exp_send -- "$env(PASSWORD)\r"
        interact
    '
done 3< /opt/sitelist.txt
于 2012-06-15T15:12:08.433 に答える