web-dev-qa-db-ja.com

Unix AIXが変数と引数を渡して期待して生成する

scp一部のファイルにスクリプトを書き込んでいますが、ユーザーまたは別のスクリプトを介してファイルの場所を引数として渡す必要があります

#!/usr/bin/expect

set FILEPATH1 $1

spawn sh "scp $FILEPATH1 $USER@$Host:/destination/files"
        set pass "pass123"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }

スポーン前と#!/ usr/bin/expectの前にもこれを試しました

FILEPATH1=$1
5
OmAr

これはあなたが望むことをしていません:

set FILEPATH1 $1

Tcl(および期待)は、コマンドライン引数にアクセスするためのシェルスタイルの$1, $2, ...方法を使用しません。グローバル$argvリストを使用したい場合:

set FILEPATH1 [lindex $argv 0]

また、スポーンコールが正しくありません。 shは、「scp $ FILEPATH1 $ USER @ $ Host:/ destination/files」という名前のfileを探します。 scpを起動するためにシェルは必要ありません。

spawn scp $FILEPATH1 $USER@$Host:/destination/files

さて、ユーザーとホストはどこから来たのですか?それらは環境変数ですか?その場合:

spawn scp $FILEPATH1 $env(USER)@$env(Host):/destination/files

また、スクリプトが終了する前に、転送が実際に完了するのを待機していません。これを行う:

expect password:
send "$pass\r"
set timeout -1
expect eof

私はあなたがパスワードを一度だけ要求されると想定しています。複数回入力する必要がある場合は、

expect {
    password: {
        send "$pass\r"
        set timeout -1
        exp_continue
    }
    eof
}
7
glenn jackman