我每天工作在一個特定的客戶環境上,由5個AIX服務器組成,有時我需要在所有5個AIX服務器上發出相同的命令。Shell腳本調用ssh:如何解釋遠程服務器上的通配符
所以我建立了基於SSH密鑰的認證服務器之間,並颳起了該廣播命令所有的人一點點的ksh腳本:
#!/usr/bin/ksh
if [[ $# -eq 0 ]]; then
print "broadcast.ksh - broadcasts a command to the 5 XXXXXXXX environments and returns output for each"
print "usage: ./broadcast.ksh command_to_issue"
exit
fi
set -A CUST_HOSTS aaa bbb ccc ddd eee
for host in ${CUST_HOSTS[@]}; do
echo "============ $host ================"
if [[ `uname -n` = $host ]]; then
$*
continue
fi
ssh $host $*
done
echo "========================================="
echo "Finished"
現在,這個工作得很好,直到我想使用通配符在遠端,是這樣的:
./broadcast.ksh ls -l java*
因爲「*」是本地系統上展開,而不是遙控器。
現在,如果使用ssh遠程命令,我可以解決這個問題,通過使用單引號:
ssh [email protected] ls -l java* <-- will _not_ work as expected, since asterisk will be interpreted locally
ssh [email protected] 'ls -l java*' <-- _will_ work as expected, since asterisk will be interpreted on the remote end
現在,我試圖將此主題融入我的腳本,並試圖創建一個$命令變量由單引號包圍的$ *內容組成,但在ksh中逃避反斜槓和串聯嘗試的海洋中淹沒了,無濟於事。
我確定有一個簡單的解決方案,但我沒有發現它,所以認爲我會出來問。
感謝,
詹姆斯
將增加一倍報價工作更好? AFAIK他們將保留通配符,但仍然擴大$。 – Holloway
謝謝,@Trengot,但他們沒有。這是我測試過的東西之一,但爲了以防萬一,我繼續進行重新測試。它仍然解釋本地系統上的星號。 – James
@James這可能不會回答你的問題,但可以給你一個想法,而不是從頭開始創建自己的腳本。有一個名爲[** dsh **]的工具(http://www.netfort.gr.jp/~dancer/software/dsh.html.en),它是一個將多個shell命令執行到遠程主機的包裝器。此外,你可能想檢查[**本網站**](https://www.ibm.com/developerworks/aix/library/au-aix-run-commands/)關於如何使用* *並行SSH ** –