현재 로그인한 모든 사용자를 표시하고 각 사용자가 디렉토리에 특정 파일을 가지고 있는지 여부를 표시하는 쉘 스크립트를 작성하려고 합니다. 스크립트를 작성했지만 결과가 없습니다! 왜 그런 겁니까?
#!/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
다음 문제는 사용자의 홈 디렉터리에 대한 액세스 권한이 없으면 파일이 존재하는데도 스크립트가 존재하지 않는다고 보고한다는 것입니다. 따라서 루트로 실행할 수도 있고, 먼저 디렉터리에 액세스할 수 있는지 확인하고 그렇지 않은 경우 불평할 수도 있습니다.
#!/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