linux-如何在shell脚本中通过命令行传递expect参数
我正在外壳脚本中通过命令行在expect中传递参数
我试过了
#!/usr/bin/expect -f
set arg1 [lindex $argv 0]
spawn lockdis -p
expect "password:" {send "$arg1\r"}
expect "password:" {send "$arg1\r"}
expect "$ "
但它不起作用。 请帮我弄清楚。
谢谢
lk121 asked 2020-01-11T21:09:29Z
6个解决方案
77 votes
如果您想读取自变量,则可以通过以下方式轻松实现
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
bartimar answered 2020-01-11T21:10:00Z
5 votes
更好的方法可能是这样的:
lassign $argv arg1 arg2 arg3
但是,您的方法也应该起作用。 检查是否已检索到arg1。 例如,使用send_user "arg1: $arg1\n"。
spbnick answered 2020-01-11T21:10:24Z
2 votes
#!/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
user128364 answered 2020-01-11T21:10:40Z
1 votes
我喜欢本指南提供的答案。它创建一个解析参数过程。
#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 arguements
puts -nonewline "username: $OPTS(username) password: $OPTS(password)"
上面只是一个片段。 请务必通读本指南并添加足够的用户参数检查,这一点很重要。
Duffmannen answered 2020-01-11T21:11:04Z
-1 votes
注意,有时argv 0是您正在调用的脚本的名称。 因此,如果以这种方式运行,则argv 0不起作用,
我跑“>要求script.exp密码”
使argv 1 =密码argv 0 = script.exp
Sid Dakota answered 2020-01-11T21:11:33Z
-2 votes
带有空格的args很好,假设您想要的arg是脚本名称之后的第一个arg($0是脚本名称,-d是第一个arg,依此类推)
确保使用-d NOT argv,因为它不会包含空格,但将它们分解为单个的args。 在您的expect脚本中执行以下操作:
#!/bin/bash
ARG="$1"
echo WORD FROM BASH IS: "$ARG" #test for debugging
expect -d exp.expect "$ARG"
exit 0
另外,作为第一个答案状态,请使用调试模式(-d标志)当expect看到它们时,它将输出您的argv变量,应向您显示正在发生的情况。
eulerworks answered 2020-01-11T21:12:03Z