從 bash 終端,我想登錄到計算節點并執行一些命令,例如,我這樣做是為了檢查正在運行的作業
ssh -t node1 'top -bn1 | grep R | grep -v top'
這將登錄node1并運行top命令和 grep 所需的輸出。
現在我想檢查節點的記憶體負載。我從這里獲取了此代碼https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'
現在,我不能只做
ssh -t node1 '<above command>'
因為有多個引號會影響命令。有沒有辦法執行上面的命令?
uj5u.com熱心網友回復:
例如與
ssh -t node1 'free -m | '"awk 'NR==2"'{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'
這里的想法是將字串分成幾部分。當您有一個包含單引號的序列時,請將其包裝成雙引號。包含變數擴展或雙引號的部分被包裹在單引號之間。
uj5u.com熱心網友回復:
您可以使用 here-doc 來避免參考問題:
ssh node1 << 'EOF'
free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'
EOF
注意 EOF 周圍的引號,以便按原樣傳遞內容。
-t如果我們只是直接運行命令,我們通常不會使用ssh
uj5u.com熱心網友回復:
您的命令包含單引號,因此您不能將此命令ssh作為單引號字串傳遞給(單引號不能在單引號內轉義)。
因此,您的選擇如下:
- 從命令中洗掉單引號并將其更改為僅使用雙引號。
- ...或通過命令
ssh在雙引號(ssh -t node1 "<above command>")。然后,您需要對中的特殊字符<above command>(如$或其他雙引號)進行轉義以防止本地擴展。
在您的特定情況下,您也可以通過不在awk遠程端運行,而是在本地運行來解決此問題。所以這將起作用:
ssh -t node1 'free -m' | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'
在許多情況下,這會導致更簡單、更易讀的解決方案。(但是,您需要注意,如果您在本地處理遠程資料,那么所有遠程資料都會首先通過 ssh 傳輸——因此當您需要 grep 大量資料時不要這樣做)。
uj5u.com熱心網友回復:
有沒有辦法執行上面的命令?
首先用要執行的命令定義一個函式。撰寫普通的格式良好的可讀代碼,只需在函式中即可。請記住使用 shellcheck 檢查常見錯誤。
f() {
free -m |
awk '
NR==2 {
printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3, $2, $3 * 100 / $2
}
'
}
然后你將需要一個簡單的小函式轉義函式,我也在這里發布:
sshqfunc() { echo "bash -c $(printf "%q" "$(declare -f "$1"); $1 \"\$@\"")"; };
那么只需:
ssh -t node1 "$(sshqfunc f)"
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/348045.html
下一篇:Bash查找丟失的檔案
