"-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호출 외에 현재 셸 스크립트가 수행하는 추가 작업이 포함되어야 합니다 .

관련 정보