web-dev-qa-db-ja.com

'-c'オプションを使用してEXPECTにパラメーターを渡す方法は?

expect -cを使用してbashスクリプト内でexpectを使用していますが、それにパラメーターを渡すにはどうすればよいですか?

これは私が試したものです:

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
2
Katie

できません。 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は絶対に存在しません。

1つの回避策は リモートサーバーでローカルのexpectスクリプトを実行しますか? 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呼び出しの上に現在のシェルスクリプトが実行する他のことを含める必要があります...

4
thrig