Bash

無法擴展 ssh 中的變數

  • September 27, 2021

我正在嘗試使用以下命令在遠端伺服器內搜尋格式為:“ installation_xx_int_${type}_*log的文件:

ssh user@hostname 'file=$(find ~ -type f -name "installation_xx_int_${type}_*log" -mtime -1 -exec basename "{}" \;); cat "$file"' > ~/$file

但是,這裡的問題是變數:${type}$file在 ssh 命令中沒有得到擴展,因此無法將文件的輸出從遠端伺服器重定向到我的伺服器。

如果有任何其他方法可以更簡單的方式實現這一點,請告訴我們!

提前謝謝了!

Shell 變數不會神奇地通過ssh. 一些系統接受傳遞環境變數,只要它們的名稱以LC_AcceptEnv LC_*在它們中查找sshd_config)開頭,所以你可以這樣做:

LC_type="$type" ssh -o SendEnv=LC_type user@hostname '
 file=$(
   find ~ -type f -name "installation_xx_int_${LC_type}_*log" -mtime -1 \
     -exec basename "{}" \;
 )
 cat -- "$file"
' > ~/test.log

如果$type在遠端 shell 的語法中不包含雙引號內的特殊字元(如果遠端 shell 類似於 POSIX),則可以讓本地 shell 在程式碼參數中將其"擴展為:````$\ssh`

ssh user@hostname '
 file=$(
   find ~ -type f -name "installation_xx_int_'"$type"'_*log" -mtime -1 \
     -exec basename "{}" \;
 )
 cat -- "$file"
' > ~/test.log

為了發生這種擴展,我們需要擺脫單引號(對於本地 shell)並進入雙引號。

在所有這些中,如果$type包含萬用字元(*, ?, \, [...]),它們將被採用模式的find‘s處理-name,並且您需要將它們轉義\才能按字面意思理解。

我不清楚您為什麼要使用基本名稱而不僅僅是這樣做:

ssh user@hostname '
 find ~ -type f -name "installation_xx_int_'"$type"'_*log" -mtime -1 \
   -exec cat {} +
' > ~/test.log

如果,正如稍後對您的問題的編輯中所闡明的那樣,您希望將遠端文件的內容儲存到本地系統上同名的文件中,您會執行類似的操作(假設這些是 GNU 系統,儘管您應該是能夠做類似的事情paxstar(也可以自己做find部分)或libarchive bsdtar):

ssh user@hostname '
 find ~ -type f -name "installation_xx_int_'"$type"'_*log" -mtime -1 -print0 |
   tar --null -T - -cf - |
   gzip -1' | tar --transform='s:.*/::' -zxf -

也就是說,使用tar歸檔格式來儲存文件路徑和內容(在本地機器--transform上接收tar時,會剝離目錄部分)。

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