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.