Linux shell 脚本 - 帮助编写脚本

Linux shell 脚本 - 帮助编写脚本

我正在尝试编写一个 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

相关内容