Linux 쉘 스크립팅 - 스크립트 작성 도움말

Linux 쉘 스크립팅 - 스크립트 작성 도움말

현재 로그인한 모든 사용자를 표시하고 각 사용자가 디렉토리에 특정 파일을 가지고 있는지 여부를 표시하는 쉘 스크립트를 작성하려고 합니다. 스크립트를 작성했지만 결과가 없습니다! 왜 그런 겁니까?

#!/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

관련 정보