Estoy tratando de crear un script donde agregue un nuevo usuario y contraseña y también verifique si ese usuario y contraseña ya existen, mientras se ejecuta en Root.

Entonces, mi script se está ejecutando y funciona bien. Solo se ejecuta en la raíz y verifica correctamente si ya se está utilizando un nombre de usuario. Pero parece que no puedo agregar un nuevo usuario y contraseña. El siguiente es mi script completo:

#!/bin/bash
#Creating a script that creates a new user

ROOT_UID=0      #Root has $UID 0
SUCCESS=0
E_USEREXISTS=70
E_NOTROOT=65        #Not root

#Run as root, and this checks to see if the creater is in root. If not, will not run
if [ "$UID" -ne "$ROOT_UID" ]; then
    echo "Sorry must be in root to run this script"
    exit $E_NOTROOT
fi

if [ $# -eq 2 ]; then
username=$1
pass=$2

grep -q "$username" /etc/passwd

if [ $? -eq $SUCCESS ]; then
    echo "User $username already exists"
    echo "Please choose another username"
    exit $E_USEREXISTS 
fi

echo $pass | passwd $username --stdin
echo "the account is setup"

else
    echo "this program needs 2 arguments and you have given $#"
    echo "you have to call the script $0 username and the pass"
fi

exit 0

Y no recibo un error directo, pero aquí hay un ejemplo de lo que está sucediendo: intento agregar a alguien (nombre de usuario y contraseña):

[root@localhost Documents]# ./Script dkong 123bif

Y la respuesta es:

passwd: Unknown user name 'dkong'
the account is setup

¿Podría alguien ayudarme a dirigirme? Quiero que cree un nuevo nombre de usuario y contraseña y no entiendo por qué no lo es.

Ha pasado un tiempo desde que utilicé los scripts, ¡lo siento si la respuesta es obvia! Solo necesito un poco de dirección. ¡Gracias de antemano!

2
user8915618 15 ene. 2018 a las 23:03

3 respuestas

La mejor respuesta

¡No importa! Lo tengo funcionando! Esta es mi solución:

useradd $username -d /home/$username -m ;
echo $passwd | passwd $username --stdin;
echo "the account is setup"
4
user8915618user8915618 15 ene. 2018 a las 21:01

Para empezar, nunca use identificadores en mayúsculas completos para las variables de usuario, ya que están reservados para su uso con el entorno de shell.

Así que

ROOT_UID=0

Debe ser

root_uid=0 # and so on

Crear un nombre de usuario requiere el comando useradd. Realiza automáticamente la verificación de antecedentes para ver si el usuario ya existe y, de ser así, aborta el proceso y solo necesita verificar el estado de salida del comando para ver si la creación del usuario fue exitosa.

Puede pasar el nombre de usuario como argumento al script, pero pasar la contraseña como texto sin formato no es bueno desde una perspectiva de seguridad. Las contraseñas de Linux se almacenan como hashes. El algoritmo de hash puede ser MD5, SHA-512, etc. Debe usar la función crypt, mencionada aquí, para ayudar a useradd a tratar el almacenamiento de la contraseña hash .

A continuación sería mi guión

#!/bin/bash
# Checking pre-requirements, the script should contain one argument
[ -z "$1" ] && echo "Usage : script user_name" && exit 1
username=$1
# Read password key and has silently using -s ie keystrokes are invisible
read -sp 'Enter password key - ' key
# Typically ask for a confirmation, but omitted for the sake of brevity
# I suppose you default password hash algorithm is MD5

# You need some characters for a salt. Read the content in link mentioned above
read -sp 'Read upto 8 characters for salt - ' salt
# You can sanitize the user input for salt to trim its length to 8 and use it like below
useradd -m -d /home/$username \
-p $(perl -e 'print crypt("$ARGV[0]", "\$1\$$ARGV[1]")' "$username" "${salt:0:8}")
# Check the exit status of the last command
[ $? -eq 0 ] && echo "User $username successfully created" || \
echo "Sorry ! User $username couldn't be created at the moment"
0
sjsam 15 ene. 2018 a las 22:03

El error radica en que necesita agregar el nombre de usuario a / etc / passwd después de verificar que esa línea no existe ya en esa línea 'grep -q "$ username" / etc / passwd' Entonces simplemente puede agregar esa línea 'useradd $ nombre de usuario 'después de la segunda condición if Exactamente antes de esa línea' echo $ pass | passwd $ username --stdin 'El error ocurre porque le dice a passwd que cree una contraseña para un usuario que aún no existe

1
mahmoudadel 15 ene. 2018 a las 21:04
48269919