일괄 처리를 사용하여 일부 사용자 계정 비밀번호를 설정하려고 합니다 chpasswd
. 비밀번호는 무작위로 생성되어 에 인쇄되어야 하며 stdout
(적어두거나 비밀번호 저장소에 넣어야 함) 에도 전달되어야 합니다 chpasswd
.
순진하게도 나는 이렇게 할 것이다
{
echo student1:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
echo student2:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
} | tee >(chpasswd)
그러나 새 비밀번호를 명령줄 인수로 전달하는 것이 걱정됩니다 echo
. 인수는 일반적으로 에서 다른 사용자에게 표시되기 때문입니다 ps -aux
(비록 echo
에서는 어떤 줄도 표시되지 않지만 ps
).
반환된 비밀번호 앞에 값을 추가한 다음 에 전달하는 다른 방법이 있습니까 chpasswd
?
답변1
echo
귀하의 코드 는 셸에 내장되어 있으므로 프로세스 테이블에 표시되지 않으므로 안전해야 합니다 .
대체 솔루션은 다음과 같습니다.
#!/bin/bash
n=20
paste -d : <( seq -f 'student%.0f' 1 "$n" ) \
<( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) |
tee secret.txt | chpasswd
n
그러면 명령을 사용하여 명령줄에 비밀번호를 전달하지 않고도 학생 이름과 비밀번호가 생성됩니다 .
이 paste
유틸리티는 여러 파일을 열로 함께 묶고 파일 사이에 구분 기호를 삽입합니다. 여기서는 구분 기호로 사용 :
하고 두 개의 "파일"(절차적 대체)을 제공합니다. 첫 번째에는 seq
20개의 학생 사용자 이름을 생성하는 명령의 출력이 포함되어 있고, 두 번째에는 길이가 13인 20개의 임의 문자열을 생성하는 파이프라인의 출력이 포함되어 있습니다.
생성된 사용자 이름이 포함된 파일이 있는 경우:
#!/bin/bash
n=$(wc -l <usernames.txt)
paste -d : usernames.txt \
<( tr -cd 'A-Za-z0-9' </dev/urandom | fold -w 13 | head -n "$n" ) |
tee secret.txt | chpasswd
secret.txt
생성된 비밀번호를 터미널에 표시하는 대신 비밀번호와 사용자 이름을 파일에 저장합니다 .
답변2
echo
아마도 셸에 내장되어 있으므로 ps
별도의 프로세스로 표시되지 않습니다.
그러나 명령 대체를 사용할 필요는 없으며 파이프의 출력을 다음으로 직접 보낼 수 있습니다 chpasswd
.
{ printf "%s:" "$username";
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''
} | chpasswd
한 번에 여러 개의 비밀번호를 변경하려면 chpasswd
기본 부분을 쉽게 반복할 수 있어야 합니다. 아니면 함수로 바꾸세요:
genpws() {
for user in "$@"; do
printf "%s:" "$user";
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13
echo
done
}
genpws username1 username2... | chpasswd
그런데: 라인 지향이 아니기 head /dev/urandom
때문에 좀 이상하게 느껴집니다 . urandom
너무 많은 바이트를 읽어 커널의 사용 가능한 엔트로피 개념에 영향을 미쳐 /dev/random
차단이 발생할 수 있습니다. 고정된 양의 데이터를 읽고 base64
임의의 바이트를 인쇄 가능한 문자로 변환하는 것과 같은 방법을 사용하는 것이 더 깔끔할 수 있습니다(얻은 바이트의 약 3/4을 버리는 대신).
이와 같은 것이 당신에게 대략적인 것을 줄 것입니다. 16자 및 숫자:
head -c 12 /dev/urandom | base64 | tr -dc A-Za-z0-9
(즉, 의 출력에서 와 문자 수를 뺍니다 +
. 각 문자가 나올 확률은 1/32이므로 올바른 조합을 하면 최소 14자가 남을 확률은 약 99%, 99.99%는 입니다. 기회는 적어도 12개를 남깁니다.)/
base64