Shell-Script

在 ssh 會話中使用本地和遠端變數

  • August 9, 2016

我正在編寫一個腳本,它應該在遠端伺服器上處理一些文件後對我進行 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,並將腳本的輸出減少為可以輕鬆重定向到變數的內容。

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