首页 > 解决方案 > 如何在 Bash/sh 中将用户帐户名称和目录分配给数组?

问题描述

我正在尝试在 Red Hat Enterprise Linux (RHEL) 系统上为 STIG 测试创建一个漏洞 ID V-72017 的 bash 脚本。我的任务是确保所有用户权限的八进制值不超过 0750

我有能力通过使用来收集用户的权限八进制值

    stat -c "%a" /home/$username

我正在尝试通过使用命令(输出系统上每个用户的名称)创建一个 $username (或目录)数组:

    eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)} | cut -d: -f1

我计划将此输出映射到一个数组,可能是一个while循环。这是一个可能的解决方案吗?

来自以下的语法错误:

    (eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)} | cut -d: -f1) | while read -r line
    do
      myarray+=line
      stat -c "%a" /home/$line
    done

所需的输出案例 1:

    Users:
    rob
    bob
    Exit Fail: bob has permission octal value 0755.

所需的输出案例 2:

    Users:
    rob
    bob
    Exit Pass: All users have permission octal value of 0750 or less.

标签: bashcommand-lineshrheluser-accounts

解决方案


您已找到所有登录用户。正则表达式可用于检查主目录的权限。

echo "Users: "                                                                   
(eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)} | cut -d: -f1) | while read -r line
do                                                                               
  echo $line                                                                     
  perm=$(stat -c "%a" /home/$line)                                               
  [[ "$perm" =~ [0-7][0,1,4,5][0] ]] || echo "Exit fail: $line has permission octal value $perm"                                                                            
done

也许您想调整输出形式。


推荐阅读