Bash

如何使用“-c”選項將參數傳遞給 EXPECT?

  • March 2, 2018

我通過 usingexpect在我的 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和朋友只在-ceval 在第 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呼叫上方所做的任何其他事情……

引用自:https://unix.stackexchange.com/questions/427582