Bash
無法擴展 ssh 中的變數
我正在嘗試使用以下命令在遠端伺服器內搜尋格式為:“
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 系統,儘管您應該是能夠做類似的事情
pax
,star
(也可以自己做find
部分)或libarchivebsdtar
):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
時,會剝離目錄部分)。