web-dev-qa-db-ja.com

Bashスクリプトを使用してユーザーアカウントとパスワードを自動的に追加する方法

私は自分の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 ]#
171
ModernCarpentry

Passwdコマンドを実行してそれにパイプ入力を送信することができます。だから、のような何かをする:

echo thePassword | passwd theUsername --stdin
109
Tralemonkey

chpasswd を使うこともできます。

echo username:new_password | chpasswd

したがって、ユーザーusernameのパスワードをnew_passwordに変更します。

181
SilverDaemon

私は自分自身に同じことを尋ねていましたが、Pythonスクリプトに頼りたくはありませんでした。

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

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

以下のコードは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
48
Ying

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

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

-e\nを改行として認識することです。

Sudoname__は、Ubuntuのrootアクセスです。

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

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

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

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

一重引用符で十分です。

29
Paul S

以下は私のために働き、Ubuntu 14.04でテストされました。ユーザー入力を必要としない1つのライナーです。

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

@Tralemonkeyから取得した

22
cevaris

-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 __== "__main__":
    random.seed()
    for arg in sys.argv[1:]:
        sys.stdout.write("%s\n" % (hash(arg),))
13

--stdinはDebianでは動作しません。それは言います:

`passwd: unrecognized option '--stdin'`

これは私のために働いた:

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

ここで他の良い方法を見つけることができます。

7
Roger

ホームディレクトリとパスワードでSudoユーザーを作成するためのシングルライナー。

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

あなたの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"
6
Carlos Tasada

私はこの年後にやってくることを知っていますが、だれも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や他の多くのコマンドを使用できます。

4
Jeight

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

必要に応じて、ユーザーのリスト(または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

===========

お役に立てれば。

乾杯、カレル

3
Carel Lubbe

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)コマンドラインでパスワードを表示することを含みません。

2
Vietnhi Phuvan

私は自分のシェルスクリプトでテストしました。

  • $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"
2
user7040344

Tralemonkeyの解決策は私にも同様にうまくいきました…しかし、それほどではありませんでした。私はこのようにしてやってしまいました:

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

彼の解決策には含まれていなかった2つの重要な詳細、-nは暗号化されているパスワードに\nを追加することからの反響を防ぎ、私の場合は一重引用符がシェルによる解釈から保護されます。

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

1
slm

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
golem

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
Lefty G Balogh

使用法:./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;
0
hustljian
{ echo $password; echo $password; } | passwd $username 
0
edacval