username.txt
사용자 이름과 특정 그룹이 포함된 파일이 있습니다 . 현재 저는 각 사용자에 대한 계정을 생성하고 단일 명령으로 해당 사용자를 해당 그룹에 추가할 수 있는 bash 스크립트를 생성하려고 합니다.
이것은 현재 실패한 bash 스크립트입니다.
#!/bin/bash
sudo addgroup staff
sudo addgroup visitors
username="username.txt"
while read line; do
sudo useradd $-Eo '^[^,]+' $username;
if [grep staff $username]; then
sudo usermod -a -G staff
else
sudo usermod -a -G visitors
done < $username
내 파일에 있는 내용은 다음과 같습니다 username.txt
.
ellipsiscoterie,visitor
magnetcommonest,visitor
belateddefensive,staff
bobstercaramelize,staff
답변1
이것을 해결책으로 시도해 보십시오. 쉼표로 구분된 파일을 사용하고 있으므로 한 번에 두 개 이상의 그룹을 사용하려는 것으로 가정합니다. 당신이 하고 있는 일이 완전히 잘못된 것은 아니지만, if
else
더 많은 그룹이 필요할 경우 다시 작성해야 하므로 이 경우에는 사용하지 않을 것입니다. 그룹 생성도 루프 내에서 처리됩니다.
#!/bin/bash
while read config
do
USERTOCREATE=$(awk -F, '{print $1}' <(echo "$config"))
GROUPTOASSIGN=$(awk -F, '{print $2}' <(echo "$config"))
if [[ ! $(groups) =~ $GROUPTOCREATE ]]; then addgroup $GROUPTOASSIGN; fi
useradd $USERTOCREATE
usermod -a -G $GROUPTOASSIGN
done < users
while
이 코드는 두 개의 변수를 사용 USERTOCREATE
하고 awk를 사용하여 할당하는 간단한 루프입니다 GROUPTOASSIGN
. -F,
awk의 플래그는 필드 구분 FS
변수를 쉼표로 설정합니다. 이를 통해 awk는 입력을 변수 $1과 $2로 분할할 수 있습니다. 당신이 이것에 익숙할지 잘 모르겠지만 이것은 파일의 출력을 파일로 <()
처리할 수 있게 해주는 파일 설명자입니다 . 스크립트가 읽고 있는 파일의 줄만 있으면 됩니다.echo "$config"
$config
답변2
#!/bin/bash
i=0
n=$(wc -l <username.txt)
while [ $i -le $n ]
do
L=$(awk "NR==$i" username.txt)
if [ -n "$L" ]; then
user=$(echo "$L" | cut -d',' -f1)
group=$(echo "$L" | cut -d',' -f2)
useradd $user
groupadd $group
usermod -a -G $group $user
fi
i=$((i+1))
done
답변3
username.txt
필드 구분 기호를 사용하여 한 줄씩 구문 분석 할 수 있습니다 ,
.
#!/bin/bash
sudo addgroup staff
sudo addgroup visitors
while IFS=, read -r username maingroup
do
sudo adduser --ingroup "$maingroup" "$username"
done < username.txt
이는 쉼표로 구분된 토큰을 쉘 변수로 읽고 $username
명령 을 실행하여 기본 그룹이 있는 사용자를 $maingroup
생성합니다 .adduser
$username
$maingroup