2016-08-16 142 views
0

我正在嘗試ssh到另一個shell腳本中的服務器並運行一些腳本。如何將本地shell變量導出到多命令ssh中?

目前我行看起來是這樣的:

ssh [email protected]$SERVER '$(typeset -a >> /dev/null); PROFILE_LOCATION=`locate db2profile| grep -i $INST_NAME| grep -v bak`; . $PROFILE_LOCATION; function1; function2;' 

我都試過'",以及使用這些材料的組合與\;或​​3210

如何使用變量我在我的ssh的當前shell腳本中插入另一臺服務器並運行多個命令?謝謝!!

+1

這已經被提出並回答 - 可能值得通過現有的知識庫進行查看。 –

+0

......這樣說,我不同意標記這個遷移到超級用戶的人 - 能夠在遠程服務器上運行功能是一個非常關注腳本的問題。 –

+0

順便說一句,考慮養成使用小寫shell變量名的習慣;請參閱http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html第四段中的環境變量名稱的POSIX約定(指定操作系統和shell使用大寫名稱,並且應用程序保證能夠使用小寫名稱而不會發生衝突)。環境變量和shell變量共享一個名稱空間(設置一個名稱與環境變量重疊的shell變量將覆蓋它),因此這些約定也適用於這些名稱空間。 –

回答

1

如果你想函數聲明,並且你的shell是bash,使用typeset -p而不是typeset -a(它將提供文本轉儲的變量而不是函數)。此外,您需要在本地評估的上下文中實際運行它(並確保您的遠程shell能夠理解它,而不是/bin/sh)。

以下命中所有這些點:

evaluate_db2profile() { 
    local db2profile 
    db2profile=$(locate db2profile | grep -i "$INST_NAME" | grep -v bak | head -n 1) 
    [ -n "$db2profile" ] && . "$db2profile" 
} 

ssh "[email protected]$SERVER" bash -s <<EOF 
$(typeset -p) 
evaluate_db2profile 
function1 
function2 
EOF 
  • 由於<<EOF而不是使用<<'EOF',所述typeset -p命令在本地運行並代入定界符。 (您也可以通過在單行公式中使用雙引號而不是單引號來完成此操作,但請參見下文)。
  • 在本地定義evaluate_db2profile作爲函數可確保typeset -p將以遠程shell可以評估的格式發出它,而無需擔心轉義。
  • 在遠程命令行上使用bash -s可確保解釋函數的shell是bash,而不是/bin/sh。如果您的代碼是爲ksh編寫的,請運行ksh -s以實現相同的效果。
相關問題