Shell
在 sshpass 會話中輸出遠端主機名
我創建了一個 shell 腳本來使用 sshpass 連接到伺服器列表並執行大約 30 個命令的列表。腳本的摘錄如下。
該腳本將獲得一個新的配置文件,但隨後我被困在嘗試用伺服器主機名替換配置文件中的變數。
我沒有獲得遠端伺服器主機名,只有本地主機名(在本例中為 MacBookPro!)會輸出。
#!/bin/bash while read PASSWORD SERVER do sshpass -p "$PASSWORD" ssh -t -p 1234 $SERVER << ! echo "Server: $SERVER" wget -N https://example.com/file.conf 2>&1 | grep -i "failed\|error\|saved"
嘗試1:
replace "variabletoreplace" "$HOSTNAME" -- file.conf
嘗試2:
sed -i "s/variabletoreplace/$(<file.conf)/" /proc/sys/kernel/hostname
腳本結束:
! done <./server_list.txt
我也嘗試過分配像 host= 這樣的變數 $ (hostname -f) or $ HOST,但什麼都不會顯示遠端主機。
我了解在普通的 ssh 命令中,此類問題可能歸結為使用雙引號而不是單引號,但我不確定如何修改我擁有的腳本,同時將其保留為命令列表。任何幫助表示讚賞。
您需要在變數(或命令)
$
之前轉義,以便它在遠端機器而不是本地機器上展開/執行:$HOSTNAME``$(hostname)
#!/bin/bash while read PASSWORD SERVER;do sshpass -p "$PASSWORD" ssh -t -p 1234 $SERVER << EOF wget -N https://example.com/file.conf 2>&1 | grep -i "failed\|error\|saved" sed -i "s/variabletoreplace/\$HOSTNAME/" file.conf EOF done
正如評論中提到的,使用 ssh 密鑰會比使用 ssh 密鑰要好得多
sshpass
,如果您要執行的所有這些命令都在遠端主機上的腳本中,那將會簡單得多。或者使用類似ansible
或puppet
可能更合適的工具。