在 sshpass 会话中输出远程主机名

在 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) 或 $HOST 之类的变量,但不会显示远程主机。

我知道在普通的 ssh 命令中,这种类型的问题可能是由于使用双引号而不是单引号造成的,但我不确定如何修改我的脚本,同时将其保留为命令列表。任何帮助表示赞赏。

答案1

您需要转义变量(或命令)$之前的内容,以便它在远程计算机而不是本地计算机上展开/运行:$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 密钥会更好,sshpass如果您要运行的所有这些命令都在远程主机上的脚本中,那么会简单得多。或者使用类似ansible或 之类的工具puppet可能更合适。

相关内容