Shell-Script

Unix AIX 將變數和參數傳遞給期望和生成

  • May 5, 2019

我正在編寫一個腳本來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

這不是你想要的:

set FILEPATH1 $1

Tcl(和期望)不使用 shell 風格的$1, $2, ...方式來訪問命令行參數。您想使用全域$argv列表:

set FILEPATH1 [lindex $argv 0]

此外,您的 spawn 呼叫不正確。sh將尋找一個名為“scp $ FILEPATH1 $ USER@$HOST:/destination/files"。你不需要 shell 來生成 scp:

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

現在,USER 和 HOST 來自哪裡?它們是環境變數嗎?如果是這樣的話:

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
}

引用自:https://unix.stackexchange.com/questions/513847