Bash/xargs: 如何批量分配用户权限?
Bash/xargs: How to mass assign user privileges?
我创建了一个新用户。我当前的用户显然具有以下权限:
$ groups
max adm cdrom sudo dip plugdev lpadmin lxd sambashare
其中 max
是当前用户帐户的名称。
我尝试了参数扩展,但是 ${groups}
的输出是空的,所以我只是将组通过管道传送到 xargs
$ groups | xargs -I _ sudo usermod -aG _ new_user_name
我收到没有文件夹 max adm cdrom sudo dip plugdev lpadmin lxd sambashare
的错误消息,因为显然 groups
的输出没有被空格分隔。
但正如我所说,${groups}
是空的,所以我无法通过管道传输到 xargs。
第二次尝试:
my_arr=(adm cdrom sudo dip plugdev lpadmin lxd sambashare)
$ echo ${my_arr[@]} | xargs -I _ usermod -aG _ new_user_name
即使我没有将参数扩展放在双引号中,数组的参数也不会被拆分。
xargs 仍然将管道参数视为一个大字符串 adm cdrom sudo dip plugdev lpadmin lxd sambashare
什么是正确的解决方案?
usermod
一次将一个或多个用户添加到 一个组 ,因此您必须使用循环:
for g in "${my_arr[@]}"; do
usermod -aG "$g" new_user_name
done
请注意,xargs
默认情况下在提供的命令的一次调用中使用尽可能多的参数,因此如果您使用 xargs
,请将一次消耗的参数数量限制为一个(-n 1
):
echo "${my_arr[@]}" | xargs -n 1 -I _ usermod -aG _ new_user_name
您可以使用 xargs -i 标志。这将拆分您的字符串,在您的下一个语句中,您可以使用 {}
访问每个标记。这将 运行 每个组的 sudo 命令。
所以试试
groups | xargs -i sudo usermod -aG {} new_user_name
关键问题是你需要告诉xargs
一次读取一个参数。
不太重要的是,您可能不想在 usermod
.
的输入中包含 max
groups |
# Trim away first token (max)
sed 's/^[^ ]* //' |
# Pass to xargs with -n 1
xargs -n 1 -I _ sudo usermod -aG _ new_user_name
在 Linux 上,您可能需要将 --delimiter ' '
添加到 xargs
命令行。
我创建了一个新用户。我当前的用户显然具有以下权限:
$ groups
max adm cdrom sudo dip plugdev lpadmin lxd sambashare
其中 max
是当前用户帐户的名称。
我尝试了参数扩展,但是 ${groups}
的输出是空的,所以我只是将组通过管道传送到 xargs
$ groups | xargs -I _ sudo usermod -aG _ new_user_name
我收到没有文件夹 max adm cdrom sudo dip plugdev lpadmin lxd sambashare
的错误消息,因为显然 groups
的输出没有被空格分隔。
但正如我所说,${groups}
是空的,所以我无法通过管道传输到 xargs。
第二次尝试:
my_arr=(adm cdrom sudo dip plugdev lpadmin lxd sambashare)
$ echo ${my_arr[@]} | xargs -I _ usermod -aG _ new_user_name
即使我没有将参数扩展放在双引号中,数组的参数也不会被拆分。
xargs 仍然将管道参数视为一个大字符串 adm cdrom sudo dip plugdev lpadmin lxd sambashare
什么是正确的解决方案?
usermod
一次将一个或多个用户添加到 一个组 ,因此您必须使用循环:
for g in "${my_arr[@]}"; do
usermod -aG "$g" new_user_name
done
请注意,xargs
默认情况下在提供的命令的一次调用中使用尽可能多的参数,因此如果您使用 xargs
,请将一次消耗的参数数量限制为一个(-n 1
):
echo "${my_arr[@]}" | xargs -n 1 -I _ usermod -aG _ new_user_name
您可以使用 xargs -i 标志。这将拆分您的字符串,在您的下一个语句中,您可以使用 {}
访问每个标记。这将 运行 每个组的 sudo 命令。
所以试试
groups | xargs -i sudo usermod -aG {} new_user_name
关键问题是你需要告诉xargs
一次读取一个参数。
不太重要的是,您可能不想在 usermod
.
max
groups |
# Trim away first token (max)
sed 's/^[^ ]* //' |
# Pass to xargs with -n 1
xargs -n 1 -I _ sudo usermod -aG _ new_user_name
在 Linux 上,您可能需要将 --delimiter ' '
添加到 xargs
命令行。