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 2013

16
この質問はトピックに関するものだと思います。現在最も強力なトレンドの1つは、「コードとしての構成」というDevOpsの姿勢です。つまり、プラットフォームは、プラットフォームをブートストラップする一連の管理手順を「プログラミング」することによって作成されます。スクリプトモードでユーザー管理を行うことは、間違いなくこのプログラミングの一部です。
Dan Bergh Johnsson 2013年

2
DevOpsとして、これは有用な質問(有用な回答も含む)だと思いますが、これは私のSysAdminの問題です。これをSuperUserに移動する方が理にかなっている可能性があります。
Anthony Geoghegan 14


これもexpectスクリプトで解決できます。
Yaron

回答:


122

passwdコマンドを実行して、パイプ入力を送信できます。だから、次のようなことをしてください:

echo thePassword | passwd theUsername --stdin

3
その方法のボーナスは、echo少なくともに関して、安全であることです(使用されているシェルに組み込まれていると想定されています)/proc/
マリアン

8
私がしなければならなかったecho -e "password\npassword\n" | passwd13.04に
d0c_s4vage

31
--stdinは新しいLinuxシステムでは非推奨になりました。代わりにchpasswdを使用してください。
wuxb 2014

16
@MarkusOrreillyは機能しますが、Ansibleのようなプロビジョニングツールを使用する場合は機能しません。@Nybbleが述べたように、chpasswdを使用する必要があります。だからここに何が働くかです:echo 'myuser:mypass' | chpasswd。お役に立てば幸いです。
アミールRustamzadeh 2014

これをDockerファイルに入れることができますか?私はそれがドッカーに食べられるべきだと思います。
qubsup 2017

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

私は同じことを自問していましたが、Pythonスクリプトに依存したくありませんでした。

これは、定義されたパスワードを持つユーザーを1つのbash行に追加する行です。

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

25
useradd -p $(openssl passwd -1 $PASS) $USERバックティックが廃止され、推奨されているため、よりモダン$()です。
ブライソン2014

私がこれで抱えていた問題:zshのシェルを使用してユーザーを作成しましたが、その時点ではzshがインストールされていなかったことに気付きませんでした。これを行うとパスワードログインが失敗するので、これが機能していないと想定する前に(今日のArchとDebian 7で確実に機能します)、新しいインストールで確認することができます。
ブライソン2014

2
useradd -m -p <password> -s /bin/bash <user>、-mクレートのホームディレクトリ、-sはユーザーのデフォルトシェルを指定し、代わりpasswordに使用userし、ニーズに合わせます。
ThorSummoner 2015

2
パスワードをソルトすることもできます:useradd -m -p $(openssl passwd -1 -salt $SALT $PASS)。これは後のUbuntuで必要になると思います。
craigmj 2017

55

以下のコードはUbuntu 14.04で動作しました。他のバージョン/ Linuxバリアントで使用する前に試してください。

# 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
アルバン

11
en.wikipedia.org/wiki/Gecos_field gecosフィールド、またはGECOSフィールドは、Unixおよび類似のオペレーティングシステムの/ etc / passwdファイルのエントリです。通常、本名や電話番号など、アカウントまたはそのユーザーに関する一般情報を記録するために使用されます。GECOSは、GEの大規模システム部門がHoneywellに売却されたときにGCOSに名前が変更されたGeneral Electricの包括的なオペレーティングシステムを意味します。
Ying

これは、Debian 8での私にとって正しい答えでした。私のサーバーセットアップbashスクリプトでは、魅力のように機能しました!
levelzwo 2018

GECOSフィールドは、基本的にユーザー説明フィールドです。そこに好きなように書いてください。
КонстантинВан

30

Tralemonkeyのアプローチは気に入りecho thePassword | passwd theUsername --stdinましたが、書いてあるようにはうまくいきませんでした。しかし、これは私にとってはうまくいきました。

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

-e\n新しい行として認識することです。

sudo Ubuntuのrootアクセスです。

二重引用符は$、変数を認識して展開するためのものです。

上記のコマンドは、パスワードと改行を2回に渡します。passwdこれがpasswd必要です。

変数を使用しない場合、これはおそらく機能すると思います。

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

ここでは一重引用符で十分です。


2
バッシュで美しく動作します。ただし、shで実行している場合、-eオプションは機能しません。実際に "-e"を出力する方法を見つけました。幸い、shでは-eオプションは必要ありません。エスケープはデフォルトで行われます。ポータブルバージョンでは、printf "password \ npassword \ n"を使用します。...代わりに。
Dan Bergh Johnsson 2013年

Ubuntuに最適な答えです。
Mashpy Rahman、2016

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 2010年

5
perl -e 'print crypt($ ARGV [0]、 "password")' 'mypassword'
mikewaters

後で、ハッシュされたパスワードではなくパスワードをどのように使用できるようになるのか、少し説明してもらえますか?
answerSeeker 2017

12

ホームディレクトリとパスワードを使用してsudoユーザーを作成する単一のライナー。

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

驚くばかり。配置スクリプトでうまく機能します
TheRealChx101

7

--stdinDebianでは動作しません。それは言う:

`passwd: unrecognized option '--stdin'`

これは私のために働きました:

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

ここで私たちは他のいくつかの良い方法を見つけることができます:


これは適切な方法であり、シャドウスイートのメンテナが公式にサポートしている唯一の方法です。このバグレポートを参照してください。
yardena 2011

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

これはあなたのためにそれを行うスクリプトです.....

必要に応じて、ユーザーのリスト(または1人のユーザーのみ)を追加できます。すべてを一度に行うと、それぞれに異なるパスワードが設定されます。おまけとして、スクリプトの最後に各ユーザーのパスワードのリストが表示されます。....必要に応じて、ユーザーメンテナンスオプションを追加できます

お気に入り:

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"

Debian / Ubuntuの場合

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

彼のソリューションに含まれていない2つの重要な詳細、-nエコーの追加による\n暗号化されているパスワードにを防止、および一重引用符は、私の場合、シェル(bash)によって内容が解釈されるのを防ぎます。

ところで、誰かが疑問に思っている場合に備えて、CentOS 5.6システムでrootとしてこのコマンドを実行しました。


良いキャッチ、他の人がどうやってそれをnewlineで動作させることができたかはわかりません。
M03

1

Debianと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

これは効果的にワンライナーとして使用できますが、パスワード、salt、およびユーザー名を適切な場所で自分で指定する必要があります。

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

1

IBMから(https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.cmds1/chpasswd.htm):

テキストファイルを作成し、たとえばtext.txtとし、次のようにuser:passwordペアを入力します。

user1:password1
user2:password2
...
usern:passwordn

text.txtファイルを保存して実行します

cat text.txt | chpassword

それでおしまい。解決策は、(a)スケーラブルであり、(b)コマンドラインでのパスワードの印刷を含まないことです。



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.