Tengo una USER
variable en mi script y quiero ver su HOME
ruta en función de la USER
variable. ¿Cómo puedo hacer eso?
Tengo una USER
variable en mi script y quiero ver su HOME
ruta en función de la USER
variable. ¿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/passwd
LDAP 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
~foo
con 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 eval
para 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
.
eval
Se necesita @nwk an . Bash no se procesa ~foo
después de la expansión variable.
USER
.
$USER
se 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, getent
devolverá 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 USER
la contraseña o si USER
no tiene contraseña, la siguiente es otra opción:
su -c 'echo ~' ${USER}
Bajo el su
comportamiento estándar , si USER
no está definido o está vacío, su
intentará ejecutar el comando como root.
Si el valor de USER
no 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.