循环 bash 的新手。我需要一个脚本来读取 txt 文件并删除每个列出的服务器上的用户。这看起来怎么样?
for user in $(cat /tmp/server-list.txt); do userdel -f $USERID; done
它会触发,但在任何服务器上都找不到用户帐户(使用“ID”不存在)。我错了什么?
答案1
假设您是:
- 尝试循环遍历包含服务器 IP 地址列表的文本文件,每个地址占一个新行
- 以 ubuntu 用户身份通过 SSH 连接到每台服务器(随意更改为您的用户),并且您尝试删除每台计算机上的单个特定用户(假设为“john smith”)
- 全部为一行
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”中并不是真正的错误,但仍然非常令人困惑。这是一个风格错误,如果你的循环增长到几个命令,它会让你很头痛。