如何在bash脚本中使用expect

mun*_*ish 5 bash expect

这是我在以下 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
Run Code Online (Sandbox Code Playgroud)

我如何使用expect在此脚本中自动执行ssh登录.

我很期待并开始测试它(它失败了):

#!/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
Run Code Online (Sandbox Code Playgroud)

我是否需要在expect脚本中重新编写bash脚本,或者如果可以的话,它可以在bash脚本中使用:

更多我需要获取bash变量$ command,$ username,$ password,$ ipaddress并在期望部分中使用它

你会建议什么解决方案?或者我可以创建一个期望脚本并从bash脚本调用它只是为了登录,错误处理,执行,日志文件

Vin*_*yon 7

那么你需要运行两个单独的脚本一个调用expect脚本的shell脚本

#!/usr/bin/bash


set force_conservative 0  ;
Run Code Online (Sandbox Code Playgroud)

改为上面

#!/usr/bin/expect


set force_conservative 0  ;
Run Code Online (Sandbox Code Playgroud)

或者在你的shell脚本中,我不确定格式,但你可以发送expect -c with command来执行:

expect -c "send \"hello\n\"" -c "expect \"#\"" 
expect -c "send \"hello\n\"; expect \"#\"" 
Run Code Online (Sandbox Code Playgroud)

实际上还有另一种选择

#!/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
Run Code Online (Sandbox Code Playgroud)

  • export MYVAR="abc123" /usr/bin/expect &lt;&lt;EOF set myvar="$env(MYVAR)" 发送 "echo $myvar \r" EOF (3认同)