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