我正在尝试编写一个 shell 脚本,显示此时所有登录的用户以及每个用户是否在一个目录中有一个特定文件。我写了一个脚本,但没有得到任何结果!这是为什么?
#!/usr/bin/env bash
Files=$( who | cut -d' ' -f1 | sort | uniq)
for file in $FILES
do
if [ -f ~/public_html/pub_key.asc ]; then
echo "user $file : Exists"
else
echo "user $file : Not exists!"
fi
done
答案1
您需要获取每个用户的主目录。如果您的所有用户的主页都位于/home/$USER
,那么这很简单:
#!/usr/bin/env bash
who | cut -d' ' -f1 | sort | uniq |
while read userName; do
file="/home/$userName/public_html/pub_key.asc"
if [ -f $file ]; then
echo "$file : Exists"
else
echo "$file : Does not exist!"
fi
done
/home/$USER
例如,如果您的用户的 HOME 不是,root
那么您需要首先找出他们的主目录。您可以通过以下方式执行此操作getent
:
#!/usr/bin/env bash
who | cut -d' ' -f1 | sort | uniq |
while read userName; do
homeDir=$(getent passwd "$userName" | cut -d: -f6)
file=public_html/pub_key.asc
if [[ -f "$homeDir"/"$file" ]]; then
echo "$file : Exists"
else
echo "$file : Does not exist!"
fi
done
下一个问题是,如果您无权访问用户的主目录,即使文件存在,脚本也会报告该文件不存在。因此,您可以以 root 身份运行它,或者您可以首先检查是否可以访问该目录,如果不能访问该目录,则进行投诉:
#!/usr/bin/env bash
file="public_html/pub_key.asc"
who | cut -d' ' -f1 | sort | uniq |
while read userName; do
homeDir=$(getent passwd "$userName" | cut -d: -f6)
if [ -x $homeDir ]; then
if [ -f "$homeDir/$file" ]; then
echo "$file : Exists"
else
echo "$file : Does not exist!"
fi
else
echo "No read access to $homeDir!"
fi
done
答案2
for I in $(who | cut -d' ' -f1 | sort -u ); do
echo -n "user '$I' ";
[[ -f ~${I}/public_html/pub_key.asc ]] \
&& echo -n "does " \
|| echo -n "does not ";
echo "have a public key: ~${I}/public_html/pub_key.asc";
done