Shell

在 sshpass 會話中輸出遠端主機名

  • September 27, 2019

我創建了一個 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,如果您要執行的所有這些命令都在遠端主機上的腳本中,那將會簡單得多。或者使用類似ansiblepuppet可能更合適的工具。

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