linux - 在/etc/group文件中修改正确的组名和ID

标签 linux bash sh passwd etcpasswd

我将 2 个参数传递给 bash 脚本。第一个参数是组,第二个参数是组 ID。 我想编写一个 bash 脚本来检查 /etc/group 中是否存在组。 如果不存在,则脚本应将组和 gid 添加到 /etc/group 中。 如果存在,那么它应该与第二个参数的 gid 匹配。如果 gid 与第二个参数不匹配,那么它应该用第二个参数覆盖 gid。

简而言之,我传递给脚本的组名称和 gid 应该位于/etc/group 文件中。

我运行命令为:

./addgroup.sh groupa 123

假设/etc/group有一个条目:

groupa:x:345

运行命令后,当我浏览/etc/group时,它应该有值

groupa:x:123

到目前为止我已经编写了以下addgroup.sh:

if grep -q "^$1:" /etc/group
then
    echo "group $1 exists:SUCCESS"
else
    grep -q "^$1:" /etc/group || /bin/echo "$1:x:$2:" >> /etc/group
    cat /etc/group
    echo "group $1 added:SUCCESS"
fi

最佳答案

我相信这段代码满足您的需求并且更简单:

{ grep -v "^$1:" /etc/group; echo "$1:x:$2:"; } >/etc/group.tmp && mv /etc/group.tmp /etc/group

该问题表明您希望更新组 ID,即使组已存在。这里的代码具有该功能。

它是如何工作的:

  • grep -v "^$1:"/etc/group

    这将删除组 $1 的现有定义(如果存在)。

  • 回显“$1:x:$2:”

    这将使用正确的组 ID 添加回组 $1 的正确定义。

  • { ... } && mv/etc/group.tmp/etc/group

    如果大括号中的命令成功执行,则会更新/etc/group。

保留现有群组成员

正如 sjnarv 指出的那样,人们可能希望保留现有的组成员。在这种情况下:

awk -v g="$1" -v id="$2" -F: -i inplace '$1 == g{save=$4; next} {print} ENDFILE{print g, "x", id, save}' OFS=: /etc/group

这需要 GNU awk。 (在 Ubuntu 上,GNU awk 可用,但通常不是默认值。)对于标准 awk:

awk -v g="$1" -v id="$2" -F: '$1 == g{save=$4; next} {print} END{print g, "x", id, save}' OFS=: /etc/group > /etc/group.tmp && mv /etc/group.tmp /etc/group

它是如何工作的:

  • -v g="$1"-v id="$2"

    这里使用 shell 变量 $1$2 定义两个 awk 变量 gid

  • -F:

    这告诉 awk 我们的字段分隔符是 :

  • -i就位

    这告诉 awk 就地修改文件(仅限 GNU awk)。

  • $1 == g{保存=$4;下一个}

    如果我们在文件中遇到组 g 的现有定义,请将组成员(第四个字段)保存在变量 save 中,然后跳过其余命令并跳转到 next 行。

    这里,在 awk 脚本中,$1$4 是代表该行的第一个和第四个字段的 awk 变量。这些变量完全独立,与代表 shell 脚本参数的 shell 变量 $$4 无关。

  • 打印

    对于 /etc/group 中的所有其他行,我们只是按原样打印它们。

  • ENDFILE{print g, "x", id, save}

    到达/etc/group末尾后,我们打印组g的新定义以及组ID id和组成员save。 (对于标准 awk,我们使用 END 代替 ENDFILE。)

  • OFS=:

    这告诉 awk 使用 : 作为输出中的字段分隔符。

关于linux - 在/etc/group文件中修改正确的组名和ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45948795/

相关文章:

string - 在 Linux bash 中从 Windows 中形成的文本文件中读取内容

linux - Bash 从匹配特定文本的行的输出中排除一行

shell - 常规 shell/bin/sh(不是 bash)是否支持按位运算符

Python Flask 应用程序卡住没有响应

bash - Hadoop fs命令在命令行上运行,但不在shell脚本中运行

linux - 从动态生成的输出中获取特定字符串的索引

bash - shell 脚本对编码和行尾敏感吗?

java - 如何让 Java 应用程序检测到 Linux PC 已从挂起状态( sleep 模式)恢复?

c++ - ThreadSanitizer 说我的 Atomic Inc/Dec 存在数据争用,这是误报吗?

linux - Dropbox如何生成host_id链接