「-c」オプションを使用してEXPECTにパラメータを渡すにはどうすればよいですか?

「-c」オプションを使用してEXPECTにパラメータを渡すにはどうすればよいですか?

expectbashスクリプトで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$argv友達は850行が完了した後に評価した後にのみ作成されます。-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

一つの解決策はリモートサーバーでローカル推定スクリプトを実行しますか?これを行うには、標準入力に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呼び出しに加えて、現在のシェルスクリプトが実行する追加の作業も含める必要があります。

関連情報