列出主目录下的所有有效用户



我在 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 脚本来说相当新,任何帮助将不胜感激。

使用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=":": 将:定义为Field S补偿器
  • {}:为输入流的每一行或每条记录执行主代码块。

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

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

修改了脚本,修复了以下问题:

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

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

相关:

  • 为什么在 Bash 中应该在"["之后和"]"之前有一个空格?
  • 在 Bash 中,双方括号 [[ ]] 是否比单方括号 [ ] 更可取?
  • 在 Bash 脚本中引发错误

最新更新