입력 리다이렉션을 이용해 여러 명의 사용자에 대한 정보가 적힌 파일을 입력받아 사용자를 한 번에 생성해보는 코드 실습을 해보겠습니다.
먼저 users.csv
라는 파일에 사용자에 대한 정보들을 입력합니다.
(쉼표를 기준으로 userid, name
입니다)
$ cat users.csv
rich, Richard Blum
christine, Christine Bresnahan
barbara, Barbara Blum
tim, Timothy Bresnahan
스크립트의 내용은 아래와 같습니다.
$ cat test1
#!/bin/bash
input="users.csv"
while IFS=, read -r userid name
do
echo "adding $userid"
sudo useradd -c "$name" -m $userid
done < $input
코드 리뷰
IFS
를 통해,
를 기준으로 필드를 구분하도록 합니다.done
옆의 입력 리다이렉션을 통해users.csv
의 파일 내용을 읽어들이고,,
를 기준으로 구분한 뒤 0열을userid
, 1열을name
의 변수에 넣어 조회합니다.read -r
옵션은raw
모드로 백슬래시를 포함한 모든 이스케이프 문자를 있는 그대로 읽어들인다는 것을 의미합니다.useradd
명령은 루트 권한이 필요하므로sudo
를 붙였습니다.useradd -c "<comment>"
: 사용자를 생성할 때 코멘트를 입력하는 옵션입니다. 반드시 큰따옴표 안에 코멘트를 적습니다.useradd -m <userID>
: 사용자를 생성할 때 홈 디렉토리를 생성한다는 옵션입니다.
스크립트를 실행시켜 보겠습니다.
$ ./test1
adding rich
adding christine
adding barbara
adding tim
$ cat /etc/passwd | tail -5
git:x:1001:1001::/home/git:/usr/bin/git-shell
rich:x:1002:1002: Richard Blum:/home/rich:/bin/sh
christine:x:1003:1003: Christine Bresnahan:/home/christine:/bin/sh
barbara:x:1004:1004: Barbara Blum:/home/barbara:/bin/sh
tim:x:1005:1005: Timothy Bresnahan:/home/tim:/bin/sh
4
명의 유저가 추가로 생성된 것을 확인할 수 있습니다.
생성한 유저를 지워보겠습니다.
$ cat test1
#!/bin/bash
input="users.csv"
while IFS=, read -r userid name
do
echo "deleted $userid"
sudo userdel -r $userid
done < $input
코드 리뷰
userdel -r
: 사용자와 연관된 홈 디렉토리와 메일 스풀까지 모두 지우겠다는 옵션입니다.
스크립트를 실행해 보겠습니다.
$ ./test1
deleted rich
userdel: rich mail spool (/var/mail/rich) not found
deleted christine
userdel: christine mail spool (/var/mail/christine) not found
deleted barbara
userdel: barbara mail spool (/var/mail/barbara) not found
deleted tim
userdel: tim mail spool (/var/mail/tim) not found
$ cat /etc/passwd | tail -5
sshd:x:112:65534::/run/sshd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
hyeob:x:1000:1000:hyeob:/home/hyeob:/bin/bash
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false
git:x:1001:1001::/home/git:/usr/bin/git-shell
사용자와 홈 디렉토리까지 모두 지워졌습니다.
(사용자에 대한 메일 스풀이 없기 때문에 찾지 못했다는 문구가 뜹니다)