我创建了一个 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
可能更合适。