2017-11-26 2 views
0

나는이 코드를 통해 사용자 계정 정보를 생성합니다. 문제는 사용자 이름을 입력하고 지정된 사용자 이름에 대한 정보 만 검색하는 사용자 이름 행이 있다는 것입니다. 코드는 시스템의 모든 사용자에 대한 정보를 검색합니다.리눅스에서 특정 사용자에 대한 정보 검색

#! /bin/bash 
#This script returns import information about the user name on the system 

echo "PLease enter name to continue:" 

read SuppliedName 
for user in $(cut -d: -f1 /etc/passwd) 
#while [ "$SuppliedName" == "$USER" ] 
do 
IFS=$'\n' 

userinfo=$(grep $user: /etc/passwd) 

comment=$(echo $userinfo | cut -d: -f5) 
home=$(echo $userinfo | cut -d: -f6) 
groups=$(groups $user | cut -d: -f2) 

#Skip users that do not have '/home' in the path to their home directory 
if [ $(echo "$home" | grep -v '/home/') ] 
then 
    continue 
fi 

echo "Username: $user" 
echo "User Info: $comment" 
echo "Home Directory: $home" 
echo "Groups: $groups" 

echo "Disk usage: $(du -sh $home)" 

last=$(last $user | head -1) 
if [ $(echo $last | wc -c) -gt 1 ] 
then 
    echo "Last login: " 
    echo "$last" 
else 
    echo "User has never logged in!" 
fi 
echo "" 
echo "--" 
echo "" 
done 

답변

2
  1. 당신은 $user$suppliedName의 비교를 놓치고, 당신은 모든 사용자 데이터를 얻을 수 /etc/passwd 반복되기 때문에, 당신은 그것을 인쇄 할 수 있습니다. '$ 사용자를'GECOS는 (올바른 정규식 ^$user:입니다)

  2. 이 코드는 로컬 사용자를 확인하여 그 이름으로 시작했다 이러한 사용자, 그래서 아무 LDAP 포함

  3. grep $user: /etc/passwd가 포함 된 모든 라인을 grep을합니다. 더 깨끗한 방법은 getent을 사용하는 것입니다.


모두 모두

, 난 이것에 대한 finger을 사용하는 것입니다. 또는 다시 메인 루프 : 당신은 훨씬 적은 노력으로이 다른 방법을하고 처리 할 수 ​​

getent passwd $suppliedName | ( 
    IFS=: 
    while read UNAME SHADOW UID_ GID GECOS HOME SHELL ; do 
     # Your code goes here 
    done) 
+0

그것은 일이 여전히'grep'를 고정되지 않는 문제가 – cookiemonster

1

, 더 우아하게 예를 조금 비는-일치

#!/bin/bash 

printf "PLease enter name to continue: " ## use printf 

read -r name 

info="$(grep "^$name" /etc/passwd)"   ## read line into info 

if [ -n "$info" ]; then  ## test that info is not empty, then call awk 
    awk -F : '{printf "Username: %s\nUser Info: %s\nHome Directory: %s\n", $1, $5, $6 }' \ 
    <<< "$info"    ## use herestring to feed data to awk 
    printf "Groups: %s\n" "$(groups "$name")"  ## use groups 
else 
    printf "error: name not found '%s'\n" "$name" ## handle error/no match 
fi 

사용 예/출력

$ bash getuser.sh 
PLease enter name to continue: david 
Username: david 
User Info: David C. Rankin 
Home Directory: /home/david 
Groups: david : david adm lp sys uucp wheel vboxusers 
+0

감사합니다. 'grep "^ $ user :"/ etc/passwd "를 사용하여 실수로 하위 문자열 일치를 찾지 않아야합니다. – tripleee

+0

좋은 눈, 좋은 잡으려고 - 정말 downvote 가치가 있었거나 그냥 그 밤 중 하나입니다 ... –

+0

그 생각은 당신이 정말로 * get * 사용해야합니다,하지만 그 중 하나와 함께 내 downvote를 제거했습니다. 또한 어쨌든 Bash 스크립트를 작성하는 경우'printf' +'read'보다'read -p'를 선호 할 수도 있습니다. – tripleee

관련 문제