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
呼び出しに加えて、現在のシェルスクリプトが実行する追加の作業も含める必要があります。