- passwd와 Shadow a라는 두 개의 파일이 있습니다
. 두 파일 정렬
b. 두 파일을 한 줄씩 비교합니다
. i. 일치하는 사용자 이름이 세 번째 파일로 출력됩니다
. ii. 일치하는 항목이 없으면 네 번째 파일로 출력
iii. 사용자가 일치하지 않으면 사용자가 어떤 파일에 있는지 찾아보세요. - 비밀번호 또는 섀도우
- passwd 파일에 사용자가 없으면 /home/test123을 확인하십시오.
- 또한 시스템에서 홈 디렉토리를 찾으십시오. /home 아래에 없을 수도 있습니다.
- 홈 디렉터리가 있으면 사용자를 추가합니다.
- 사용자 추가추가
- 홈 디렉토리가 존재하지 않으면 섀도우 파일에서 해당 항목을 제거하십시오.
- userdel(xxx) 사용
- 홈 디렉토리가 /home이 아닌 다른 파일 시스템에 있는 경우 사용자를 생성하고
사용자 항목 a의 홈 디렉토리를 사용합니다. 전임자. /선택/무라드 - 변경이 완료되면 비교를 다시 실행해야 합니다.
- 이제 프로그래밍에서 모듈(셸 프로그래밍에서는 서브루틴이라고도 함)을 사용하고 Compare_files라는 모듈을 만드세요.
- Compare_files에 매개변수를 전달하세요.
- 두 개의 모듈을 만듭니다.
a. file()을 확인합니다.
i. 일치하는 항목이 없으면 비어 있습니다. - 출구
- 모듈 서브루틴 생성
비교해보았으나 할 수 있는 것은 그것뿐이다. 나는 붙어있다.
이것이 내가 지금까지 한 일입니다:
#!/bin/sh
password_file=pass.txt
password_file_sorted="sorted_$password_file"
shadow_file=shadow.txt
shadow_file_sorted="sorted_$shadow_file"
match_file="match_record.txt"
not_match_file="not_match_record.txt"
# empty target file
cp /dev/null $match_file
cp /dev/null $not_match_file
# check username is exist in file
check_file() {
username=$1
file=$2
exit_status=1 # username does not exist in file
# read line by line
while IFS=: read -r f1 f2 f3 f4 f5 f6 f7
do
if [ "$f1" = "$username" ]; then
exit_status=0 # username exist in file
fi
done <"$file"
return $exit_status
}
# create module compare_file
compare_file() {
file_1=$1
file_2=$2
# read line by line content of file_1
while IFS= read -r line
do
username=$(echo $line | awk -F: '{print $1}')
# check username in file_1 is exist on file_2
check_file "$username" "$file_2"
if [ $? -eq 0 ]; then
#if user exist, write record to match_record.txt file
target_file=$match_file
else
#if user does not exist, write record to not_match_record.txt file
target_file=$not_match_file
fi
echo $line >>$target_file
done <"$file_1"
}
# short password files
echo "short $password_file"
sort $password_file > $password_file_sorted
# short shadow files
echo "short $shadow_file"
sort $shadow_file > $shadow_file_sorted
# compare file password with shadow
echo "check username in $password_file is exist on $shadow_file"
compare_file $password_file_sorted $shadow_file_sorted
# compare file shadow with password
echo "check username in $shadow_file is exist on $password_file"
compare_file $shadow_file_sorted $password_file_sorted
# add or remove user
echo "for every mismatch username in $password_file, add user if home directory exist and remove user if home directory does not exist"
while IFS= read -r line
do
username=$(echo $line | awk -F: '{print $1}')
home_directory=$(echo $line | awk -F: '{print $6}')
# check user does not exist in passwd
num_entries_in_password=$(grep $username $password_file | wc -l)
if [ $num_entries_in_password -eq 0 ]; then
# check if /home/username directory exist
if [ -d "/home/$username" ] ; then
echo "/home/$username directory exist, add $username with command: useradd $username"
useradd $username
elif [ -d $home_directory ]; then
# add user with specific user directory
echo "$home_directory directory exist, add $username with command: useradd $username -b $home_directory"
useradd $username -b $home_directory
else
echo "remove user: $username"
userdel $username
fi
fi
echo "user: '$username' exist in $password_file"
done <"$not_match_file"
내가 얻는 결과는 매우 짧습니다. 왜 이런 일이 발생합니까?
답변1
이 스레드가 죽었을 가능성이 높지만 여전히 답변하겠습니다.
당신이 가진 문제는 당신의 문제입니다. 파일
에서 시작하여 passwd
루프에서 사용자를 두 그룹(배열 사용) 중 하나로 정렬합니다. 하나는 사용자 ID가 1000 미만인 사용자를 위한 배열이고, 다른 배열은 ID가 1000 이상인 사용자를 위한 것입니다. 1000명 미만의 사용자는 시스템 사용자이고, 나머지는 찾고 있는 사용자입니다.
다른 루프에서는 시스템 사용자를 필터링하고 섀도우 파일에 없는 사용자를 확인합니다.
참고: 사용된 모든 임시 파일은 tmp 디렉터리에 작성/저장되어야 합니다.
또한: 섀도우 파일에는 루트 액세스가 필요합니다.