需要帮助编写 bash 循环来删除多个服务器上的一个用户

需要帮助编写 bash 循环来删除多个服务器上的一个用户

循环 bash 的新手。我需要一个脚本来读取 txt 文件并删除每个列出的服务器上的用户。这看起来怎么样?

for user in $(cat /tmp/server-list.txt); do userdel -f $USERID; done

它会触发,但在任何服务器上都找不到用户帐户(使用“ID”不存在)。我错了什么?

答案1

假设您是:

  1. 尝试循环遍历包含服务器 IP 地址列表的文本文件,每个地址占一个新行
  2. 以 ubuntu 用户身份通过​​ SSH 连接到每台服务器(随意更改为您的用户),并且您尝试删除每台计算机上的单个特定用户(假设为“john smith”)
  3. 全部为一行

USERID="john smith"; cat /tmp/server-list.txt | while read IP_ADDRESS; do ssh -q -n ubuntu@$IP_ADDRESS "userdel -f $USERID" ; done

如果您有多个用户和多个服务器,则需要使用嵌套循环或数组

答案2

鉴于这是 Bash,我们可以使用mapfile文件内容创建一个数组:

mapfile server </tmp/server-list.txt

然后我们可以循环这些服务器:

for s in "${server[@]}"
do
    #something
done

$s现在我们需要使用当我们编写代码时放置占位符“ ”的值#something(这可能有点棘手,因为“命令”参数ssh组合成一个字符串传递到sh -c服务器上):

    ssh "root@$s" "userdel -f '${USERID//\'/\'\\\'\'}''"

(假设$USERID在脚本之外的某个地方设置;这个棘手的替换是为了处理'否则会混淆远程 shell 的字符)

把它们放在一起:

read -p "Delete which user?" userid
mapfile server </tmp/server-list.txt
for s in "${server[@]}"
do
    ssh "root@$s" "userdel -f '${userid//\'/\'\\\'\'}''"
done

答案3

for user in $(cat /tmp/server-list.txt); do userdel -f $USERID; done

user是循环变量的名称。在循环的每次迭代中,您将其设置为/tmp/server-list.txt文件的下一行。

该变量不在循环中的任何地方使用。因此,循环将一遍又一遍地执行相同的语句,次数与文件中的行数相同。

$USERID读取USERID这段代码中未设置的变量。因此,假设您没有为该变量分配任何内容,则实际执行的代码将是

userdel -f

将文件“server-list.txt”中的行读取到变量“user”中并不是真正的错误,但仍然非常令人困惑。这是一个风格错误,如果你的循环增长到几个命令,它会让你很头痛。

相关内容