如何通过 shell 脚本中的命令行传递 Expect 中的参数

我在 Expect 中通过 shell 脚本中的命令行传递参数。

我试过了

#!/usr/bin/expect -f
    

set arg1 [lindex $argv 0]
    

spawn lockdis -p
expect "password:" {send "$arg1\r"}
expect "password:" {send "$arg1\r"}
expect "$ "

但是没有用,我怎么才能修好它?

120550 次浏览

如果你想从参数中读取,你可以简单地通过

set username [lindex $argv 0];
set password [lindex $argv 1];

然后打印出来

send_user "$username $password"

剧本会印出来的

$ ./test.exp user1 pass1
user1 pass1

可以使用“调试”模式

$ ./test.exp -d user1 pass1

更好的办法可能是这样:

lassign $argv arg1 arg2 arg3

但是,您的方法也应该可以工作。检查是否检索到 arg1。例如,使用 send_user "arg1: $arg1\n"

注意,有时 argv0是正在调用的脚本的名称。所以如果这样运行,argv 0就不起作用。

对我来说,我跑步

expect script.exp  password

这使得 argv 1 = password 和 argv 0 = script.exp。

使用空格的参数是可以的,假设您想要的参数是脚本名称后面的第一个($0是脚本名称,$1是第一个参数,等等)

确保使用 "$ARG" $ARG,因为它将 包含空格,但是将它们分解成单独的参数。在 Bash 脚本中执行以下操作:

#!/bin/bash


ARG="$1"
echo WORD FROM BASH IS: "$ARG" #test for debugging


expect -d exp.expect "$ARG"


exit 0

另外,如 第一个答案所述,使用调试模式(-d标志)。它将输出您的 argv变量,因为 Expect 可以看到它们,并且应该向您显示正在发生的事情。

#!/usr/bin/expect
set username [lindex $argv 0]
set password [lindex $argv 1]
log_file -a "/tmp/expect.log"
set timeout 600
spawn /anyscript.sh
expect "username: " { send "$username\r" }
expect "password: " { send "$password\r" }
interact

我喜欢 这本指南提供的答案。

它创建一个解析参数进程。

#process to parse command line arguments into OPTS array
proc parseargs {argc argv} {
global OPTS
foreach {key val} $argv {
switch -exact -- $key {
"-username"   { set OPTS(username)   $val }
"-password"   { set OPTS(password)   $val }
}
}
}
parseargs $argc $argv
#print out parsed username and password arguments
puts -nonewline "username: $OPTS(username) password: $OPTS(password)"

以上只是一个片段。全面阅读指南并添加足够的用户参数检查非常重要。