通过 ssh 更新多台计算机的脚本中的错误

Errors in script for updating multiple machines through ssh

提问人:Jacob Rawls 提问时间:11/15/2023 最后编辑:BarmarJacob Rawls 更新时间:11/15/2023 访问量:65

问:

首先,请原谅我缺乏经验。

我正在尝试创建一个通过 ssh 升级多台计算机的脚本,但主要收到错误"upgrade-all.sh: 7: Bad substitution"

我试图修改我的原始脚本是从 Arjun G 从帖子文本中的回答中找到的

我的脚本是:

#!/bin/bash

USERNAMES="jed", "root", "cord"
HOSTS="***.***.***.***", "***.***.***.***", "***.***.***.***"
PASSWORDS="***", "***", "***"
SCRIPT="pwd; echo -e 'PASSWORD' | sudo apt update | sudo apt upgrade -y && sudo apt autoremove -y"
for i in ${!HOSTS[@]} ; do
        echo ${HOSTS[i]}
        SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}}
        sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}"
done

我尝试交换变量,但它没有清除错误。我发现自己无法用替换来做出有根据的猜测。${!HOSTS[@]}

感谢您的帮助!

Linux Bash Shell SSH APT

评论

3赞 Barmar 11/15/2023
您引用的原始脚本显示了创建数组的正确方法。你为什么要改变它?
1赞 Barmar 11/15/2023
您应该在第 3 行收到一个错误,指出 不是有效的命令。root,
3赞 Paul Hodges 11/15/2023
尝试 shellcheck 进行语法检查,并使用 GNU Bash 手册进行数组语法检查。
3赞 Mark Setchell 11/15/2023
也许考虑一下哪个是为这种事情设计的。ansible
1赞 Charles Duffy 11/15/2023
而我(抄送:@MarkSetchell)认为 ansible 很可怕,但鼓励任何人考虑 Chef。(是的,它是 Ruby;我对 Ruby 有着根深蒂固的厌恶,但我更不喜欢那些对我的用例来说不够强大的工具;至于 Ansible,它的设计并不严格——配置格式存在歧义,使得某些东西无法表示——而无代理设计会带来巨大的性能损失)。请注意,我认为 ansible(以及 Puppet、saltstack 和其他同时代人)很可怕,但不使用任何编排工具更糟糕。

答:

0赞 Bruno 11/15/2023 #1

这是相同的脚本,更正了 bash 语法(数组创建)和基本数组用法(主要是引用)。

我不在乎任何安全问题(命令行上的密码),在问题评论中进行了讨论。

#!/bin/bash

USERNAMES=("jed" "root" "cord")
HOSTS=("***.***.***.***" "***.***.***.***" "***.***.***.***")
PASSWORDS=("***" "***" "***")
SCRIPT="pwd; echo -e 'PASSWORD' | sudo apt update | sudo apt upgrade -y && sudo apt autoremove -y"
for i in "${!HOSTS[@]}" ; do
        echo "${HOSTS[i]}"
        SCR="${SCRIPT/PASSWORD/${PASSWORDS[i]}}"
        sshpass -p "${PASSWORDS[i]}" ssh -l "${USERNAMES[i]}" "${HOSTS[i]}" "${SCR}"
done