Shell-Script
在 ssh 會話中使用本地和遠端變數
我正在編寫一個腳本,它應該在遠端伺服器上處理一些文件後對我進行 scp。為此,我需要來自執行腳本的本地伺服器的變數,以及後來的遠端伺服器的一些變數。
我嘗試了幾種我發現的方法
Stack Exchange
,到目前為止沒有一個對我有用。這列出了初始腳本:
#!/bin/bash set -x export someID=$1 LOG=/folder/subfolder1/$someID/tmp/getResult.log export DIR=/folder/subfolder1/$someID export rc=0 export lServ=`hostname` case $lServ in test.server*) remoteServer=remote.test.server ;; prod.server*|backup.server*) remoteServer=remote.prod.server ;; esac cd $DIR ssh -v $remoteServer << 'EOF' >> $LOG 2>&1 cd $someID folders=`ls` for file in $folders; do case $file in *.1) scp -v $file/outputFolder/$file.someExt $lServ:$DIR/p.someExt rc=`expr $rc + $?` ;; *) export subID=`echo $file | awk -F"." '{print $2}' scp -v $file/outputFolder/$file.ext $lServ:$DIR/k$subID.someExt rc=`expr $rc + $?` ;; esac done case $rc in 0) cd .. rm -rfv $someID export rc=$? ;; *) echo "some Errormessage" rc=`expr $rc + 1` ;; esac EOF rc=`expr $rc + $?` exit $rc
由於公司限制,我無法發布真實姓名或文件夾結構。
您的腳本中缺少的部分似乎是 variable
rc
。您的腳本(大部分)在您的本地機器上執行,所以您可以
- 在重定向部分之外創建一個臨時文件名,
- 在重定向部分中使用該名稱,並且
- 回
$rc
顯到臨時文件中,並且- 讀取有向部分之外的變數。
對於臨時文件名,通常使用 完成
mktemp
,因此這些部分可能看起來像
- 外部
mytemp=$(mktemp) 陷阱“rm -f $mytemp” EXIT HUP INT QUIT
- 裡面
# 從 `SSH_CLIENT` 獲取我的 IP 地址 my_addr=\$(echo "\$SSH_CLIENT" |awk '{printf \$1;}') 結果=\$(mktemp) 迴聲“\$rc”>\$結果 scp \$result \$my_addr:$mytemp rm -f \$結果
- 外部
rc=$(cat $mytemp)
$someID
沒有從本地伺服器傳遞到遠端的原因是您的 here-document以ssh -v $remoteServer << 'EOF' >> $LOG 2>&1
引用了標記,告訴 shell 在將
'EOF'
字元串傳遞給ssh
命令之前不要擴展字元串。如果要擴展,請去掉引號。$
但是,當您這樣做時,您必須在希望遠端shell 擴展的每個字元之前放置一個反斜杠。對 ssh/scp使用 (quiet) 選項可能更簡單
-q
,並將腳本的輸出減少為可以輕鬆重定向到變數的內容。