![](/img/trans.png)
[英]how to login to user account from shell script with password in the script?
[英]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 ]#
您可以運行 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
需要注意的幾個警告。
這是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
表示新密碼echo "$new_password" | passwd --stdin "$new_username"
echo "$new_username:$new_password" | chpasswd
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.