【问题标题】:List all valid users under home directory列出主目录下的所有有效用户
【发布时间】:2020-05-13 07:56:32
【问题描述】:

我在一个 AWS 实例上,需要列出该实例上的所有用户名。像这样简单的东西:

ls /home > users.txt

就足够了,但是我需要检查每个名称并检查它的 PID 号,如果用户没有 PID 号(即非零返回值),那么我想从那里删除它我创建的用户文本文件。

我尝试了以下方法,但收到很多错误:

#!/bin/bash

ls /home > users_inc.txt
while read line
do
    id -u $line
    if [$? -e 0]
    then
        echo $line > users.txt
    fi
done < users_inc.txt

对 bash 脚本相当陌生,如有任何帮助,将不胜感激。

【问题讨论】:

  • 您是否主用 UID(用户 ID)而不是 PID(进程 ID)?如果您已经知道要删除哪些 UID,为什么还要费心这个循环呢?

标签: bash loops scripting


【解决方案1】:

修改了你的脚本,修复了问题:

cd /home || { printf '%s\n' "Can't cd to /home" >&2; exit 1; }
for user in *; do
    if id -u "$user" >/dev/null 2>&1; then
        printf '%s\n' "$user"
    fi
done > /path/to/users.txt

假设您的意思是 ID 而不是 PID。

相关:

【讨论】:

  • 感谢您非常详细的回答。我对我的原始代码进行了一些编辑,并且能够让它工作,它更适合我正在尝试做的事情。
【解决方案2】:

使用awk的替代方法:

getent passwd|awk 'BEGIN{FS=":"}{if(match($6,"/home/"$1)&&$3>=1000)print$1}'
  • getent passwd:流账户记录数据库

  • awk 'awk script':执行awk脚本解析账户记录

awk 脚本:

BEGIN{
  FS=":"
}
{
  if (match($6, "/home/"$1) && $3>=1000)
    print $1
}
  • BEGIN{}: 为整个输入流执行一次 Awk 初始化块。

    • FS=":":将: 定义为F字段S分隔符
  • {}:为输入流的每一行或记录执行的主代码块。

    • if (match($6, "/home/"$1) &amp;&amp; $3&gt;=1000):如果字段#6 是主目录路径匹配/home/username(字段#1)&amp;&amp; 和字段#3 UID &gt;= 大于或等于1000(普通帐户的最低 UID)

    • print $1:然后从字段 #1 打印用户名。

【讨论】:

  • 这是一个非常聪明的解决方案。
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多