![如何使用“-c”选项将参数传递给 EXPECT?](https://linux22.com/image/128696/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E2%80%9C-c%E2%80%9D%E9%80%89%E9%A1%B9%E5%B0%86%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92%E7%BB%99%20EXPECT%EF%BC%9F.png)
我expect
在 bash 脚本中使用 using 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
答案1
你不能。在源代码中,我们在第 711 行expect-5.45.4
找到exp_main_sub.c
case 'c': /* command */
exp_cmdlinecmds = TRUE;
rc = Tcl_Eval(interp,optarg);
...
它处理-c
代码。只有在第 850 行之后的 eval 完成$argv
之后才会创建好友-c
/* 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
。
一种解决方法是在远程服务器上运行本地expect脚本?这需要在标准输入上传递 TCL 代码,然后读入expect
文件/dev/stdin
$ echo puts \[lindex \$argv 1\] | expect /dev/stdin blee bla blu
bla
另一种解决方法是扔掉 shell 并在 TCL 中编写整个内容
#!/usr/bin/env expect
set FILE [lindex $argv 0]
set HOST [lindex $argv 1]
...
然后chmod +x
运行它
./whatyoucalledtheabove somefile somehost
它需要包含当前 shell 脚本在expect
调用之上执行的任何其他操作...