5

これは、次のBash スクリプトで使用しているコード スニペットです。

  for user_input in `awk '{print}' testfile_$$.txt`
    do
    ipaddress=`echo $user_input | cut -d';' -f 1`
    command="${config_mode}`echo $user_input | cut -d';' -f 2-`"
            ping -w 1 $ipaddress 1> /dev/null 2> $ERR_LOG_FILE 1> $LOG_FILE
    if [ $? -eq 0 ];then
            ssh "$USERNAME@$ipaddress" "$command"
                                                  >> $LOG_FILE


    fi
    done

このスクリプトで Expect を使用して SSH ログインを自動化するにはどうすればよいですか?

私はExpectを初めて使用し、これをテストし始めました(失敗しました):

#!/usr/bin/bash


set force_conservative 0  ;# Set to 1 to force conservative mode even if
                          ;# script wasn't run conservatively originally
if {$force_conservative} {
        set send_slow {1 .1}
        proc send {ignore arg} {
                sleep .1
                exp_send -s -- $arg
        }
}

#

set timeout -1
spawn ssh auto21@10.38.227.229 {uname -a; df -h}
match_max 100000
expect "*?assword: "
send -- "bar01\r"
expect eof

Expect スクリプトで Bash スクリプトを最初から書き直す必要がありますか? それとも、Bash スクリプト内で Expect を使用できますか?

それができる場合:

さらに、Bash 変数の$command$username$password、および$ipaddressを取得して、Expect 部分で使用する必要があります。

どのような解決策を提案しますか?

または、Expect スクリプトを作成して、ログイン、エラー処理、実行、およびログファイルのためだけに Bash スクリプトから呼び出すことはできますか。

4

1 に答える 1

8

つまり、Expect スクリプトを呼び出すシェル スクリプトです。

#!/usr/bin/bash


set force_conservative 0  ;

上記を次のように変更します

#!/usr/bin/expect

set force_conservative 0  ;

または、シェルスクリプトでフォーマットがわかりませんが、expect -c実行するコマンドで送信できます:

expect -c "send \"hello\n\"" -c "expect \"#\""
expect -c "send \"hello\n\"; expect \"#\""

実際には、もう 1 つの選択肢もあります。

#!/bin/bash

echo "shell script"

/usr/bin/expect<<EOF

set force_conservative 0  ;# Set to 1 to force conservative mode even if
                          ;# script wasn't run conservatively originally
if {$force_conservative} {
        set send_slow {1 .1}
        proc send {ignore arg} {
                sleep .1
                exp_send -s -- $arg
        }
}

#

set timeout -1
spawn ssh auto21@10.38.227.229 {uname -a; df -h}
match_max 100000
expect "*?assword: "
send -- "bar01\r"
expect eof
EOF
于 2013-02-28T11:13:43.673 に答える