GUI 앱을 통해 사용자 비밀번호 변경

GUI 앱을 통해 사용자 비밀번호 변경

저는 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

관련 정보