저는 Linux에서 사용자와 그룹을 관리하기 위한 GUI 애플리케이션을 만들고 있었습니다!
새 사용자를 생성하는 부분은 끝났지만 새로 생성된 사용자에게 새 비밀번호를 제공하는 부분은 그대로 유지됩니다. 내 앱이 간단히 수행하는 작업은 GUI를 통해 필요한 입력(사용자 이름, 그룹 목록 및 비밀번호)을 취하고 이 정보를 인수로 전달하는 스크립트를 실행하는 것입니다. xyz라는 사용자 계정이 있다고 가정해 보겠습니다. 이 계정의 비밀번호를 변경하려면 다음 명령을 실행하기만 하면 됩니다.
passwd xyz
새 비밀번호를 묻는 메시지가 표시됩니다. 이제 모든 필수 정보가 명령줄에 전달되므로 스크립트를 사용하여 새 계정을 만들 수 있습니다.
useradd -m -G users -g "groups" -s /bin/bash "UserName"
Qt 앱을 통해 스크립트를 실행하고 사용자를 생성할 수 있지만 에서는 passwd cmd
다른 줄에서 입력을 요청합니다. 어떻게 처리합니까?
답변1
내 생각에 정답은 다음과 같다.명령줄 도구를 사용하지 말고 라이브러리 호출을 사용하세요.. 이렇게 하면 오류를 더 잘 처리할 수 있고 명령줄에서 비밀번호를 전달하는 위험을 피할 수 있습니다.
사용할 수 있는 라이브러리 중 하나는 다음과 같습니다.libuser, 비교적 간단하며 C 및 Python 바인딩이 있습니다.
답변2
루트로서 다음 방법을 사용하여 스크립트를 통해 사용자의 비밀번호를 체계적으로 설정할 수 있습니다.
$ echo -n "$passwd" | passwd "$uname" --stdin
비밀번호 생성
나는 명령줄 도구를 사용하는 것을 좋아합니다pwgen
비밀번호를 생성합니다.
$ passwd="`pwgen -1cny | sed 's/[\$\!]/%/g'`"
$ pwgen --help
Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]
Options supported by pwgen:
-c or --capitalize
Include at least one capital letter in the password
-A or --no-capitalize
Don't include capital letters in the password
-n or --numerals
Include at least one number in the password
-0 or --no-numerals
Don't include numbers in the password
-y or --symbols
Include at least one special symbol in the password
-s or --secure
Generate completely random passwords
-B or --ambiguous
Don't include ambiguous characters in the password
-h or --help
Print a help message
-H or --sha1=path/to/file[#seed]
Use sha1 hash of given file as a (not so) random generator
-C
Print the generated passwords in columns
-1
Don't print the generated passwords in columns
-v or --no-vowels
Do not use any vowels so as to avoid accidental nasty words
하지만 이건 불안한 것 아닌가요?
아니요. 비밀번호는 STDIN을 통해 전달되므로 passwd
누군가가 를 통해 프로세스를 스누핑하는 것이 가능할 수 있지만 ps
사용자가 루트 프로세스를 볼 수 없어도 비밀번호 전달은 passwd
차단됩니다.
예
한 터미널에서 루트로 이 명령을 실행한다고 가정해 보겠습니다.
$ ( sleep 10; echo "supersecret" | passwd "samtest" --stdin ) &
[1] 13989
ps
그런 다음 다른 터미널에서 실행합니다 .
$ ps -AOcmd | grep pass
14046 passwd samtest --stdin R pts/11 00:00:00 passwd samtest --stdin
첫 번째 터미널에서 비밀번호를 변경한 후:
[root@greeneggs ~]# Changing password for user samtest.
passwd: all authentication tokens updated successfully.
passwd에 대한 에코는 어떻습니까?
이 경우에도 비밀번호는 유출되지 않습니다. 이것을 보여주는 또 다른 테스트가 있습니다. 먼저 보조 터미널에서 이 명령을 시작합니다. 그러면 에서 출력이 수집됩니다 ps
.
$ while [ 1 ]; do ps -eaf2>&1 | grep -E "echo|pass";done | tee ps.txt
그런 다음 비밀번호 설정 명령을 실행합니다.
$ echo "supersecret" | passwd "samtest" --stdin &
[1] 20055
$ Changing password for user samtest.
passwd: all authentication tokens updated successfully.
[1]+ Done echo "supersecret" | passwd "samtest" --stdin
내용을 확인해 보니 ps.txt
비밀번호가 유출되지 않은 것으로 나타났습니다.
$ grep supersecret ps.txt
$
ps
우리가 사용하는 명령 을 변경해 ps -eaf
도 누출되지 않습니다.
답변3
passwd --help
내 상자에는 stdin에 새 비밀번호를 제공하기 위해 root
실행할 수 있음 이 표시됩니다.--stdin
답변4
chpasswd 명령은 명령줄에서 사용자 이름/암호 쌍 목록을 읽어 기존 사용자 그룹을 업데이트합니다. 각 줄은 다음과 같은 형식으로 되어 있습니다.
user_name:password
이 명령은 한 번에 많은 계정이 생성되는 대규모 시스템 환경에서 사용하기 위한 것입니다. 이 명령의 추가 옵션을 읽으려면 다음을 입력하십시오.
man chpasswd