Bash 스크립트로 사용자 계정과 비밀번호를 자동으로 추가하는 방법은 무엇입니까?


200

Linux (Fedora 10)에서 사용자 계정을 만들고 bash 스크립트 (또는 필요한 경우)를 통해 자동으로 암호를 할당 할 수 있어야합니다.

Bash를 통해 사용자를 쉽게 만들 수 있습니다. 예 :

[whoever@server ]#  /usr/sbin/useradd newuser

Bash에서 암호를 기능적으로 유사하지만 자동으로 지정할 수 있습니까?

[whoever@server ]# passwd newuser
Changing password for user testpass.
New UNIX password:
Retype new UNIX password: 
passwd: all authentication tokens updated successfully.
[whoever@server ]#

11
왜 이것이 주제가 아닌가?
OrangeTux

16
이 질문이 주제라고 생각합니다. 가장 강력한 트렌드 중 하나는 "코드로 구성"이라는 DevOps의 태도입니다. 즉, 플랫폼은 플랫폼을 부트 스트랩하는 일련의 관리 단계를 "프로그래밍"하여 생성됩니다. 스크립트 모드에서 사용자 관리를하는 것은 분명히이 프로그래밍의 일부입니다.
Dan Bergh Johnsson

2
DevOps로서 이것은 유용한 질문 (유용한 답변)이지만 SysAdmin 모자가 달린 것 같습니다. 이것을 슈퍼 유저로 옮기는 것이 더 합리적 일 수 있습니다.
Anthony Geoghegan


expect스크립트를 사용하여 해결할 수도 있습니다 .
Yaron

답변:


122

passwd 명령을 실행하여 파이프 입력을 보낼 수 있습니다. 따라서 다음과 같이하십시오.

echo thePassword | passwd theUsername --stdin

3
이 방법의 echo장점은 적어도 안전하다는 것입니다 /proc/.
Marian

8
나는 echo -e "password\npassword\n" | passwd13.04 에해야 했다
d0c_s4vage

31
최신 Linux 시스템에서는 --stdin이 더 이상 사용되지 않습니다. 대신 chpasswd를 사용하십시오.
wuxb

16
@MarkusOrreilly는 작동하지만 Ansible과 같은 프로비저닝 도구를 사용할 때는 작동하지 않습니다. @Nybble이 언급했듯이 chpasswd를 사용해야합니다. 그래서 여기에 효과가 있습니다 : echo 'myuser:mypass' | chpasswd. 희망이 도움이됩니다.
Amir Rustamzadeh

도커 파일에 넣을 수 있습니까? 도커에게는 먹을 수 있어야한다고 생각합니다.
qubsup

201

chpasswd 를 사용할 수도 있습니다 .

echo username:new_password | chpasswd

그래서, 당신은 사용자의 암호를 변경 username하는 new_password.


5
+1,이 직업에 맞는 도구입니다 : $ apropos chpasswd...chpasswd (8) - update passwords in batch mode
Steven K

이것은 또한 작동 busybox하지만 passwd그렇지 않습니다 ( --stdin옵션 은 없습니다 ).
Timmmm

83

나는 나 자신에게 같은 것을 요구하고 있었고, 파이썬 스크립트에 의존하고 싶지 않았다.

이것은 하나의 bash 행에 정의 된 비밀번호를 가진 사용자를 추가하는 행입니다.

useradd -p $(openssl passwd -1 $PASS) $USER

25
useradd -p $(openssl passwd -1 $PASS) $USER백틱이 더 이상 사용되지 않으므로 $()권장 되므로 더 현대적 입니다.
Bryson

내가 가진 문제 : zsh가 설치되지 않았다는 것을 깨닫지 못하고 zsh 쉘로 사용자를 만들었습니다. 암호를 입력하면 암호 로그인이 실패하므로 이것이 작동하지 않는다고 가정하기 전에 (오늘의 아치와 데비안 7에서 작동 할 것임) 완전히 새로 설치 한 경우 암호를 확인할 수 있습니다.
Bryson

2
useradd -m -p <password> -s /bin/bash <user>, -m Crates 홈 디렉토리, -s는 사용자가 쉘을 대체 password하고 user필요에 따라 대체 할 것을 지정 합니다.
ThorSummoner

2
비밀번호에 소금을 칠 수도 있습니다 : useradd -m -p $(openssl passwd -1 -salt $SALT $PASS). 나는 이것이 나중에 우분투에서 필요하다고 생각합니다.
craigmj

55

아래 코드는 우분투 14.04에서 작동했습니다. 다른 버전 / 리눅스 변형에서 사용하기 전에 사용해보십시오.

# quietly add a user without password
adduser --quiet --disabled-password --shell /bin/bash --home /home/newuser --gecos "User" newuser

# set password
echo "newuser:newpassword" | chpasswd

3
이해가 안됩니다--gecos
Alban

11
en.wikipedia.org/wiki/Gecos_field gecos 필드 또는 GECOS 필드는 Unix 및 유사한 운영 체제에서 / etc / passwd 파일의 항목입니다. 일반적으로 실제 이름 및 전화 번호와 같은 계정 또는 사용자에 대한 일반 정보를 기록하는 데 사용됩니다. GECOS는 GE의 대규모 시스템 사업부가 Honeywell에 판매 될 때 GCOS로 이름이 변경된 General Electric Comprehensive Operating System을 의미합니다.
Ying

이것은 데비안 8에서 정답이었습니다. 서버 설정 bash 스크립트에서 매력처럼 작동했습니다!
levelzwo

GECOS 필드는 기본적으로 사용자 설명 필드입니다. 거기에 원하는 것을 쓰십시오.
Константин Ван

30

Tralemonkey의 접근 방식이 마음에 들었지만 echo thePassword | passwd theUsername --stdin서면으로는 제대로 작동하지 않았습니다. 그러나 이것은 나를 위해 일했습니다.

echo -e "$password\n$password\n" | sudo passwd $user

-e\n새 줄로 인식 하는 것입니다.

sudo 우분투에 대한 루트 액세스입니다.

큰 따옴표는 $변수 를 인식 하고 확장하는 것입니다.

위의 명령은 암호 및 새 줄, 두 번에 통과하는 passwd것입니다, passwd필요합니다.

변수를 사용하지 않으면 아마도 효과가 있다고 생각합니다.

echo -e 'password\npassword\n' | sudo passwd username

작은 따옴표로 충분합니다.


2
bash에서 아름답게 작동합니다. 그러나 sh에서 실행하면 -e 옵션이 작동하지 않습니다. 실제로 "-e"를 출력하는 어려운 방법을 찾았습니다. 다행히 sh에는 -e 옵션이 필요하지 않으며, 이스케이프가 기본값입니다. 이식 가능한 버전은 printf "password \ npassword \ n"| ... 대신.
Dan Bergh Johnsson

우분투에 대한 완벽한 답변.
Mashpy Rahman

23

다음은 저에게 효과적이며 Ubuntu 14.04에서 테스트되었습니다. 사용자 입력이 필요없는 하나의 라이너입니다.

sudo useradd -p $(openssl passwd -1 $PASS) $USERNAME

@Tralemonkey에서 가져온


13

-p 옵션을 사용할 수 있습니다.

useradd -p encrypted_password newuser

불행히도,이 경우 암호를 직접 해시해야합니다 (passwd가 암호를 대신 사용함). 불행히도 일부 데이터를 해시하는 표준 유틸리티가없는 것 같으므로 직접 작성해야합니다.

다음은 암호화를 위해 작성한 작은 Python 스크립트입니다. pcrypt라고 가정하면 위의 명령 줄을 다음과 같이 작성하십시오.

useradd -p $(pcrypt ${passwd}) newuser

알아야 할 몇 가지 경고.

  1. pcrypt가 실행되는 동안 일반 텍스트는 ps 명령을 통해 모든 사용자에게 표시됩니다.
  2. pcrypt는 이전 스타일의 crypt 기능을 사용합니다. MD5 해시와 같이 더 현대적인 것을 사용하는 경우 pcrypt를 변경해야합니다.

그리고 여기 pcrypt가 있습니다 :

#!/usr/bin/env python

import crypt
import sys
import random

saltchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

def salt():
    return random.choice(saltchars) + random.choice(saltchars)

def hash(plain):
    return crypt.crypt(arg, salt())

if __name__ == "__main__":
    random.seed()
    for arg in sys.argv[1:]:
        sys.stdout.write("%s\n" % (hash(arg),))

감사합니다 R Klatchko, 그게 효과가 있습니다. -p 옵션에 대해 몰랐다는 것을 믿을 수 없습니다. 나는 스스로 해싱을 처리 할 수있다 :)
ModernCarpentry

5
펄 -e '인쇄 토굴 ($ ARGV [0], "비밀번호")' 'mypassword'
mikewaters

나중에 해시 비밀번호가 아닌 비밀번호를 사용하는 방법에 대해 조금 설명해 주시겠습니까?
answerSeeker

12

홈 디렉토리 및 비밀번호로 sudo 사용자를 작성하는 단일 라이너.

useradd -m -p $(openssl passwd -1 ${PASSWORD}) -s /bin/bash -G sudo ${USERNAME}

대박. 배포 스크립트에서 잘 작동
TheRealChx101

7

--stdin데비안에서는 작동하지 않습니다. 그것은 말한다 :

`passwd: unrecognized option '--stdin'`

이것은 나를 위해 일했다 :

#useradd $USER
#echo "$USER:$SENHA" | chpasswd

여기에 다른 좋은 방법이 있습니다.


이것이 올바른 방법이며 섀도 스위트의 관리자가 공식적으로 지원하는 유일한 방법입니다. 이 버그 리포트를 참조하십시오 .
yardena

6

bash 스크립트에서 expect를 사용할 수 있습니다.

에서 http://www.seanodonnell.com/code/?id=21

#!/usr/bin/expect 
######################################### 
#$ file: htpasswd.sh 
#$ desc: Automated htpasswd shell script 
######################################### 
#$ 
#$ usage example: 
#$ 
#$ ./htpasswd.sh passwdpath username userpass 
#$ 
###################################### 

set htpasswdpath [lindex $argv 0] 
set username [lindex $argv 1] 
set userpass [lindex $argv 2] 

# spawn the htpasswd command process 
spawn htpasswd $htpasswdpath $username 

# Automate the 'New password' Procedure 
expect "New password:" 
send "$userpass\r" 

expect "Re-type new password:" 
send "$userpass\r"

5

나는 몇 년 후 내가 올 것이라는 것을 알고 있지만, 아무도 usermod를 제안하지 않았다.

usermod --password `perl -e "print crypt('password','sa');"` root

누군가 이전 HPUX에서이 작업을 수행하려는 경우 사용할 수 있습니다 usermod.sam.

/usr/sam/lbin/usermod.sam -F -p `perl -e "print crypt('password','sa');"` username

-F는 스크립트를 실행하는 사람이 현재 사용자 인 경우에만 필요합니다. 물론 해시를 만들기 위해 Perl을 사용할 필요는 없습니다. 그 대신 openssl 또는 다른 많은 명령을 사용할 수 있습니다.


3

여기 당신을 위해 그것을 할 스크립트가 있습니다 .....

원하는 경우 사용자 목록 (또는 한 명의 사용자)을 추가 할 수 있습니다. 한 번에 모두 암호가 다릅니다. 보너스로 스크립트 끝에 각 사용자 비밀번호 목록이 표시됩니다. .... 원하는 경우 사용자 유지 관리 옵션을 추가 할 수 있습니다

처럼:

chage -m 18 $user
chage -M 28 $user

암호 사용 기간 등을 설정하는 스크립트에

=======

#!/bin/bash

# Checks if you have the right privileges
if [ "$USER" = "root" ]
then

# CHANGE THIS PARAMETERS FOR A PARTICULAR USE
PERS_HOME="/home/"
PERS_SH="/bin/bash"

   # Checks if there is an argument
   [ $# -eq 0 ] && { echo >&2 ERROR: You may enter as an argument a text file containing users, one per line. ; exit 1; }
   # checks if there a regular file
   [ -f "$1" ] || { echo >&2 ERROR: The input file does not exists. ; exit 1; }
   TMPIN=$(mktemp)
   # Remove blank lines and delete duplicates 
   sed '/^$/d' "$1"| sort -g | uniq > "$TMPIN"

   NOW=$(date +"%Y-%m-%d-%X")
   LOGFILE="AMU-log-$NOW.log"

   for user in $(more "$TMPIN"); do
      # Checks if the user already exists.
      cut -d: -f1 /etc/passwd | grep "$user" > /dev/null
      OUT=$?
      if [ $OUT -eq 0 ];then
         echo >&2 "ERROR: User account: \"$user\" already exists."
         echo >&2 "ERROR: User account: \"$user\" already exists." >> "$LOGFILE"
      else
         # Create a new user
         /usr/sbin/useradd -d "$PERS_HOME""$user" -s "$PERS_SH" -m "$user"
         # passwdgen must be installed
         pass=$(passwdgen -paq --length 8)
         echo $pass | passwd --stdin $user
         # save user and password in a file
         echo -e $user"\t"$pass >> "$LOGFILE"
         echo "The user \"$user\" has been created and has the password: $pass"
      fi
   done
   rm -f "$TMPIN"
   exit 0
else
   echo >&2 "ERROR: You must be a root user to execute this script."
   exit 1
fi

===========

도움이 되었기를 바랍니다.

건배, 카렐


2

나는 내 자신의 쉘 스크립트에서 테스트했다.

  • $new_username 새로 만든 사용자를 의미
  • $new_password 새로 비밀번호를 의미

CentOS의 경우

echo "$new_password" | passwd --stdin "$new_username"

데비안 / 우분투

echo "$new_username:$new_password" | chpasswd

OpenSUSE의 경우

echo -e "$new_password\n$new_password" | passwd "$new_username"

1

Tralemonkey의 솔루션은 거의 나를 위해 거의 효과가 있었지만 ... 나는 이런 식으로 끝내었다.

echo -n '$#@password@#$' | passwd myusername --stdin

그의 솔루션에 포함되지 않은 두 가지 주요 세부 사항, 암호화되는 암호에 -n에코를 추가 하지 못하게 \n하고 작은 따옴표는 내 경우 쉘 (bash)에 의해 내용이 해석되지 않도록 보호합니다.

BTW 누군가가 궁금해하는 경우를 대비하여 CentOS 5.6 시스템 에서이 명령을 루트로 실행했습니다.


좋은 캐치, 다른 사람들이 어떻게 뉴 라인을 처리하도록 관리했는지 잘 모르겠습니다.
M03

1

데비안과 Red Hat 모두에서 작동하는 솔루션입니다. perl에 따라 sha-512 해시를 사용합니다.

cat userpassadd
    #!/usr/bin/env bash

    salt=$(cat /dev/urandom | tr -dc A-Za-z0-9/_- | head -c16)
    useradd -p $(perl -e "print crypt('$2', '\$6\$' . '$salt' . '\$')") $1

용법:

userpassadd jim jimslongpassword

효과적으로 하나의 라이너로 사용할 수 있지만 올바른 위치에 암호, 소금 및 사용자 이름을 지정해야합니다.

useradd -p $(perl -e "print crypt('pass', '\$6\$salt\$')") username


0
{ echo $password; echo $password; } | passwd $username 

이것이 이론적으로 질문에 대답 할 수 있지만 여기에 답의 필수 부분을 포함시키는 것이 바람직 합니다.
베르너

0

RedHat / CentOS의 경우 사용자를 생성하고 암호를 추가하며 사용자를 sudoer로 만드는 코드는 다음과 같습니다.

#!/bin/sh
echo -n "Enter username: "
read uname

echo -n "Enter password: "
read -s passwd

adduser "$uname"
echo $uname:$passwd | sudo chpasswd

gpasswd wheel -a $uname

0

용법: ./my_add_user.sh USER PASSWD

암호:

#!/bin/bash
# my_add_user.sh

if [ "$#" -lt 2 ] 
 then
       echo "$0 username passwd"
       exit
fi

user=$1
passwd=$2

useradd $user -d /data/home/$user  -m  ;
echo $passwd | passwd $user --stdin;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.