如何在Bash脚本中使用Expect

6

这是我在下面的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登录?
我非常新手,开始尝试测试它(但失败了):
#!/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脚本中调用它,只处理登录、错误处理、执行和日志文件。

1个回答

9

好的,您需要运行两个单独的脚本,一个是调用Expect脚本的shell脚本:

#!/usr/bin/bash


set force_conservative 0  ;

将上述内容更改为

#!/usr/bin/expect

set force_conservative 0  ;

或者在您的shell脚本中,您可以使用expect -c命令来执行:

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

实际上,还有另一种选择:
#!/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

谢谢提供的替代方案,但我该怎么做才能将bash变量username、ipaddress和command9(uname -a; df -h)传递到expect中呢?有什么方法吗? - munish
你可以导出变量,然后像环境变量一样引用它。因此,可以这样导出VARIABLE1 = something,然后在expect部分尝试调用它。 - V H
3
导出变量MYVAR的值为"abc123":/export MYVAR="abc123"/使用expect脚本,获取环境变量MYVAR的值并将其赋给myvar变量,然后通过终端发送命令"echo $myvar \r":/usr/bin/expect <<EOF set myvar="$env(MYVAR)" send "echo $myvar \r" EOF - V H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接