我使用来expect
在bash脚本中使用expect -c
,但是如何将参数传递给它呢?
这是我尝试过的:
FILE="myFile"
HOST="myhostname"
/usr/bin/expect -c $FILE $HOST '
set FILE [lindex $argv 0];
set HOST [lindex $argv 1];
send_user "$FILE $HOST"
spawn scp -r -o StrictHostKeyChecking=no $FILE root@$HOST:/tmp/
expect "assword:"
send "password\r"
interact'
如果我创建一个具有相同内容的单独的Expect脚本,但是像这样在bash中调用它:
myScript.expect $FILE $HOST
它可以工作,但是除了使用expect -c
选项外,我该如何做同样的事情?
更新:
还尝试了:
/usr/bin/expect -c '
set FILE [lindex $argv 0];
set HOST [lindex $argv 1];
send_user "$FILE $HOST"
spawn scp -r -o StrictHostKeyChecking=no $FILE root@$HOST:/tmp/
expect "assword:"
send "password\r"
interact' $FILE $HOST
你不能。在expect-5.45.4
我们的源代码中,找到exp_main_sub.c
第711行
case 'c': /* command */
exp_cmdlinecmds = TRUE;
rc = Tcl_Eval(interp,optarg);
...
处理-c
代码。$argv
和朋友仅在-c
评估开始于第850行之后创建
/* collect remaining args and make into argc, argv0, and argv */
sprintf(argc_rep,"%d",argc-optind);
Tcl_SetVar(interp,"argc",argc_rep,0);
expDiagLog("set argc %s\r\n",argc_rep);
...
Tcl_SetVar(interp,"argv",args,0);
因此$argv
在-c
代码运行时绝对不存在。
一种解决方法是在远程服务器上运行本地期望脚本?这需要在标准输入上传递TCL代码,然后读取expect
文件/dev/stdin
$ echo puts \[lindex \$argv 1\] | expect /dev/stdin blee bla blu
bla
另一个解决方法是扔掉外壳并用TCL编写整个内容
#!/usr/bin/env expect
set FILE [lindex $argv 0]
set HOST [lindex $argv 1]
...
然后chmod +x
运行它
./whatyoucalledtheabove somefile somehost
它需要在expect
调用之前包含您当前的shell脚本所做的任何其他事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句