gpt4 book ai didi

linux - 使用 shell 脚本 ssh 到不同的节点

转载 作者:太空宇宙 更新时间:2023-11-04 10:23:30 26 4
gpt4 key购买 nike

我正在使用下面的代码通过 ssh 连接到不同的节点并查找用户是否存在。如果用户不存在,它将创建它。

如果我不执行 ssh,该脚本可以正常工作,但如果我执行 ssh,它就会失败。

如何使用此脚本遍历不同的节点?

for node in `nodes.txt`
usr=root

ssh $usr@$node
do
if [ $(id -u) -eq 0 ]; then
read -p "Enter username : " username
read -s -p "Enter password : " password
egrep "^$username" /etc/passwd >/dev/null
if [ $? -eq 0 ]; then
echo "$username exists!"
exit 1
else
pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
useradd -m -p $pass $username
[ $? -eq 0 ] && echo "User has been added to system!" || echo "F
ailed to add a user!"
fi
else
echo "Only root may add a user to the system"
exit 2
fi
done

最佳答案

您的脚本有严重的语法错误。我猜开头的 for 循环是您尝试添加的,但您在此过程中完全破坏了脚本。

循环文件中的行的语法是

while read -r line; do
.... # loop over "$line"
done <nodes.txt

(或者稍微for line in $(cat nodes.txt); do ...但这有多个问题;详情请参阅http://mywiki.wooledge.org/DontReadLinesWithFor)。

如果打算在 ssh 中实际运行脚本的其余部分,您需要将其传递给 ssh 命令。像这样:

while read -r node; do
read -p "Enter user name: " username
read -p -s "Enter password: "
ssh root@"$node" "
# Note addition of -q option and trailing :
egrep -q '^$username:' /etc/passwd ||
useradd -m -p \"\$(perl -e 'print crypt(\$ARGV[0], \"password\")' \"$password\")" '$username'" </dev/null
done <nodes.txt

诚然,您传递给 ssh 的命令可以任意复杂,但您会希望避免在具有 root 权限的远程脚本中进行交互式 I/O,并且通常确保远程命令是尽可能安静和坚固。

反模式命令;如果 [ $? -eq 0 ]; then ... 很笨拙但很常见。 if 的目的是运行一个命令并检查其结果代码,所以这是更好和更惯用的 if 命令;然后 ... (可以更简洁地编写 command && ...!command || ... 如果您只需要 thenelse 部分,分别是完整手写 if/then/else结构)。

关于linux - 使用 shell 脚本 ssh 到不同的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42763605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com