내가 하고 싶은 것:
- 사용자 및 해당 홈 디렉터리 목록 가져오기
/etc/passwd
- 사용자 이름과 집 주소를 매개변수로 사용하고 이러한 디렉터리의 소유권을 해당 사용자로 변경합니다.
현재 출력:
잘린 출력: cat /etc/passwd
##
# User Database
#
# Note that this file is consulted directly only when the system is running
# in single-user mode. At other times this information is provided by
# Open Directory.
#
# See the opendirectoryd(8) man page for additional information about
# Open Directory.
##
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
_taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
_networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false
잘린 출력:cat /etc/passwd | grep "^[#;]" -v
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
_taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
_networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false
_installassistant:*:25:25:Install Assistant:/var/empty:/usr/bin/false
이제 선행 "_"을 제거해야 하므로 다음 명령을 사용했습니다.
잘린 출력:cat /etc/passwd | grep "^[#;]" -v | sed s/"_"//
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false
마지막으로 다음 명령을 사용하여 사용자 이름과 디렉터리를 가져왔습니다 awk
.
cat /etc/passwd | grep "^[#;]" -v | sed s/"_"// | awk -F\: '{print $1" "$6}'
(출력이 잘림)
nobody /var/empty
root /var/root
daemon /var/root
uucp /var/spool/uucp
taskgated /var/empty
networkd /var/networkd
installassistant /var/empty
lp /var/spool/cups
postfix /var/spool/postfix
scsd /var/empty
ces /var/empty
appstore /var/db/appstore
이것이 내가 더하고 싶은 일입니다!
가져가다첫 번째매개변수 및 소유권 할당두번째이에 대한 주장. 어떻게 진행해야 하나요?
답변1
마지막 파일은 다음과 같이 bash에서 처리될 수 있습니다.
cat YOURFILE | \
while read CMD; do
field1=${CMD% *}; # take first field
field2=${CMD#* }; # take second field
echo do $field1 with $field2; # do something with it
done
따라서 제대로 작동하려면 echo를 적절한 chown 명령으로 바꿔야 합니다. 에서 가져옴Bash 스크립트에서 한 줄씩 읽기
답변2
문제를 _
일으킬 수 있는 이 항목을 제거하려는지 확실하지 않습니다.chown: _user not found
chown
노력하다
awk -F: '/^#/ { next } {printf "chown %s \"%s\"\n",$1,$6} ' my_etc_passwd
어디
-F:
:
awk에게 구분 기호 로 사용하도록 지시/^#/ { next }
다음으로 시작하는 줄 건너뛰기#
/^_/ { next }
(필요한 경우)로 시작하는 줄 건너뛰기 에 추가_
- 다음 모드/작업은 chown 명령을 인쇄합니다.
결과가 좋아 보이면 다음으로 파이프하면 됩니다.bash
답변3
awk를 사용하면 다른 명령과 파이프가 많이 필요하지 않습니다. 올바른 작성 방법:
cat /etc/passwd | grep "^[#;]" -v | sed s/"_"// | awk -F\: '{print $1" "$6}'
예:
awk -F':' '!/^[#;]/{sub(/_/,""); print $1, $6}' /etc/passwd
그런 다음 셸에서 해당 출력을 사용합니다. :
--delimited 입력이 있으므로 awk 명령을 약간 수정하여 --delimited 출력을 생성하므로 :
입력 필드 값에 s가 없어야 합니다.:
while IFS=':' read -r user dir; do
echo chown -- "$user" "$dir"
done < <(awk 'BEGIN{FS=OFS=":"} !/^[#;]/{sub(/_/,""); print $1, $6}' /etc/passwd)
또는 원하는 경우:
awk 'BEGIN{FS=":"; OFS=ORS} !/^[#;]/{sub(/_/,""); print $1, $6}' /etc/passwd |
xargs -n 2 bash -c 'echo chown "$1" "$2"' bash
echo
테스트를 마치고 실제로 실행하고 싶을 때 제거하세요.chown
답변4
@Archemar의 답변을 사용하여 나에게 도움이 되는 다음 코드를 사용했습니다! _을(를) 삭제하면 오류가 발생할 수 있다는 점을 지적해 주셔서 감사합니다.
awk -F\: '/^#/{next}''{system("chown " $1" " $6)}' /etc/passwd