簡體   English   中英

如何使用 Bash 腳本自動添加用戶帳戶和密碼?

[英]How to automatically add user account AND password with a Bash script?

我需要能夠在我的 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 ]#

您也可以使用chpasswd

echo username:new_password | chpasswd

因此,您將用戶用戶username的密碼更改為new_password

您可以運行 passwd 命令並將其發送管道輸入。 因此,請執行以下操作:

echo thePassword | passwd theUsername --stdin

我問自己同樣的事情,不想依賴 Python 腳本。

這是在一個 bash 行中添加具有已定義密碼的用戶的行:

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

下面的代碼在 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

我喜歡 Tralemonkey 的echo thePassword | passwd theUsername --stdin echo thePassword | passwd theUsername --stdin雖然它對我來說並不像寫的那樣工作。 然而,這對我有用。

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

-e是將\n識別為新行。

sudo是 Ubuntu 的根訪問權限。

雙引號用於識別$並擴展變量。

上面的命令將密碼和一個新行兩次傳遞給passwd ,這是passwd所需要的。

如果不使用變量,我認為這可能有效。

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

單引號在這里就足夠了。

以下對我有用,並在 Ubuntu 14.04 上進行了測試。 這是一個不需要任何用戶輸入的單行。

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

取自@Tralemonkey

使用主目錄和密碼創建 sudo 用戶的單行。

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

您可以使用 -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),))

--stdin在 Debian 上不起作用。 它說:

`passwd: unrecognized option '--stdin'`

這對我有用:

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

在這里我們可以找到一些其他的好方法:

您可以在 bash 腳本中使用期望。

來自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"

我知道我會在幾年后來,但我不敢相信沒有人建議 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 或許多其他命令代替它。

我已經在自己的 shell 腳本中進行了測試。

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

這是一個可以為您完成的腳本.....

如果需要,您可以一次性添加用戶列表(或僅添加一個用戶),並且每個用戶都有不同的密碼。 作為獎勵,您會在腳本的末尾看到每個用戶密碼的列表。 ....如果您願意,您可以添加一些用戶維護選項

喜歡:

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

===========

希望這可以幫助。

干杯,卡雷爾

適用於 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

它可以有效地用作單線,但您必須自己在正確的位置指定密碼、鹽和用戶名:

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

來自 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) 不涉及在命令行上打印密碼。

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

對於 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

用法: ./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;

Tralemonkey 的解決方案幾乎也對我有用……但並不完全。 我最終這樣做了:

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

他的解決方案沒有包括 2 個關鍵細節, -n阻止 echo 將\n添加到正在加密的密碼中,並且在我的情況下,單引號保護內容不被 shell(bash)解釋。

順便說一句,我在 CentOS 5.6 系統上以 root 身份運行此命令,以防有人想知道。

請在具有 sudo 權限的腳本下運行以通過腳本創建用戶。

注意:此腳本支持所有 linux 操作系統,如 Redhat、Centos、Ubuntu、suse、kali、Arch、Bitname、BSD....等

#!/bin/bash
#author: bablish jaiswal
#purpos: Linux user creation with a storng password
clear
#echo "Hi, I am a function to create sudo user with strong password. Kindly share following information"
echo -e "\n\n\n"
printf "\e[6;33mHi, I am a function to create sudo user with a strong password. Kindly share following information\e[0m";echo
read -p "user name:- " name #input name
read -p "complete path for $name home directory? example: /home/$name :- " home #user home path
( useradd  -m -d $home $name -s /bin/bash ) > /dev/null 2>&1
pass=$(cat /dev/urandom |tr -dc "[[:graph:]]" |head -c16)
(echo -e "$pass\n$pass" | passwd $name ) > /dev/null 2>&1
echo " "
printf "\e[6;33m-----------------------------Copy below credentials-------------------------\e[0m";echo
echo -e "User:- $name\nHomeDir:- $home\npassword:- $pass"
#svalue=$(cat /etc/sudoers |grep -i root |grep -i all|tail -n1 |awk '{$1=""}1')
svalue=$(cat /etc/sudoers |grep -i root |grep -i all|tail -n1 |awk '{print $2}')
echo "${name} ${svalue} NOPASSWD:ALL" >> /etc/sudoers && echo “Remark:- User $name is a sudo user”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM