Bash
如何使用“-c”選項將參數傳遞給 EXPECT?
我通過 using
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'
如果我創建一個具有相同內容的單獨的期望腳本,但在 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
eval 在第 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
另一種解決方法是折騰shell並將整個東西寫在TCL中
#!/usr/bin/env expect set FILE [lindex $argv 0] set HOST [lindex $argv 1] ...
然後
chmod +x
執行它./whatyoucalledtheabove somefile somehost
它需要包含您目前的shell腳本在
expect
呼叫上方所做的任何其他事情……