Tengo una USERvariable en mi script y quiero ver su HOMEruta en función de la USERvariable. ¿Cómo puedo hacer eso?
Tengo una USERvariable en mi script y quiero ver su HOMEruta en función de la USERvariable. ¿Cómo puedo hacer eso?
Respuestas:
Hay una utilidad que buscará información del usuario independientemente de si esa información se almacena en archivos locales como /etc/passwdLDAP o algún otro método. Se llama getent.
Para obtener información del usuario, ejecuta getent passwd $USER. Obtendrá una línea de regreso que se ve así:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
Ahora puede simplemente cortar el directorio de inicio, por ejemplo, usando cut, así:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foocon variables bash. No directamente, de todos modos.
~embargo, parece expandirse por tabulación, y otro comportamiento especificado del prefijo tilde se reemplazará por un nombre de ruta del directorio de trabajo inicial asociado con el nombre de inicio de sesión obtenido utilizando la getpwnam()función y, por lo tanto, probablemente esa búsqueda sea bastante buena. Sin embargo, no me gustan las expansiones de pestañas, me gusta escribir pestañas.
Puede usar evalpara obtener el directorio personal de alguien.
eval echo "~$USER"
Al menos para los usuarios locales, esto funciona con seguridad. No sé si se manejan usuarios remotos como LDAP eval.
evalSe necesita @nwk an . Bash no se procesa ~foodespués de la expansión variable.
USER.
$USERse expande a solo una única cadena de caracteres alfabéticos.
El lugar habitual es /home/$USER, pero eso no tiene que ser universal. El lugar definitivo para buscar dicha información es dentro del archivo /etc/passwd.
Ese archivo es legible en todo el mundo (cualquiera podría leerlo), por lo que cualquier usuario tiene acceso a su contenido.
Si el $ USER existe en el archivo, la entrada anterior al último es el directorio HOME del usuario.
Esto seleccionará la entrada e imprimirá el directorio HOME:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
Para sistemas más complejos (remotos), getent es el comando habitual para obtener información de los usuarios del sistema NSS (bibliotecas de cambio de servicio de nombres).
Un comando de
echo $(getent passwd $USER )| cut -d : -f 6
Proporcionará información equivalente (si está disponible).
Si el usuario no existe, getentdevolverá un error.
Aquí hay una pequeña función de shell que no ignora el código de salida de getent:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
Aquí hay un ejemplo de uso:
da_home="$(get_home missing_user)" || {
echo 'User does NOT exist!'; exit 1
}
# Now do something with $da_home
echo "Home directory is: '$da_home'"
Si ha iniciado sesión como root, si conoce USERla contraseña o si USERno tiene contraseña, la siguiente es otra opción:
su -c 'echo ~' ${USER}
Bajo el sucomportamiento estándar , si USERno está definido o está vacío, suintentará ejecutar el comando como root.
Si el valor de USERno es un nombre de usuario válido, entonces se produce un error apropiado: su: user <user> does not exist.
Ya hay muchas buenas respuestas aquí, pero esto puede ayudar a alguien.