Saltar al contenido

¿Cómo obtener el directorio $ HOME de diferentes usuarios en el script bash?

Posterior a investigar en diversos repositorios y foros finalmente hemos hallado la respuesta que te mostraremos aquí.

Solución:

Actualizar: Según el título de esta pregunta, parece que la gente viene aquí solo buscando una manera de encontrar directorio de inicio de un usuario diferente, sin la necesidad de personificar ese usuario.

En ese caso, la solución más sencilla es utilizar expansión de tilde con el nombre de usuario de interés, combinado con eval (que es necesario, porque el nombre de usuario se debe dar como literal sin comillas para que la expansión de tilde funcione):

eval echo "~$different_user"    # prints $different_user's home dir.

Nota la advertencias habituales con respecto al uso de eval solicitar; en este caso, el supuesto es que usted controla el valor de $different_user y saber que es un mero nombre de usuario.

Por el contrario, el resto de esta respuesta se ocupa de personificando un usuario y realizar operaciones en el directorio de inicio de ese usuario.


Nota:

  • Administradores por defecto y otros usuarios si están autorizados a través del sudoers archivo puede hacerse pasar por otros usuarios a través de sudo.
  • Lo siguiente se basa en el defecto configuración de sudo – cambiar su configuración puede hacer que se comporte de manera diferente – ver man sudoers.

los forma básica de ejecutar un comando como otro usuario es:

sudo -H -u someUser someExe [arg1 ...]
  # Example:
sudo -H -u root env  # print the root user's environment

Nota:

  • Si te olvidas de especificar -H, el proceso de suplantación (el proceso invocado en el contexto del usuario especificado) informará el original directorio de inicio del usuario en $HOME.
  • El proceso de suplantación tendrá el mismo directorio de trabajo que el proceso de invocación.
  • El proceso de suplantación se realiza sin expansiones de caparazón sobre string literales pasados ​​como argumentos, ya que ningún shell está involucrado en el proceso de suplantación (a menos que someExe pasa a ser un caparazón) – expansiones por el invocando shell, antes de pasar al proceso de suplantación, obviamente todavía puede ocurrir.

Opcionalmente, puede tener un proceso de suplantación ejecutar como oa través de un shell (n suplantando), prefijando someExe ya sea con -io-s – sin especificar someExe ... crea un interactivo cascarón:

  • -i crea un acceso cáscara para someUser, lo que implica lo siguiente:

    • someUser‘s se carga el perfil de shell específico del usuario, si está definido.
    • $HOME puntos a someUserdirectorio de inicio, por lo que hay no hay necesidad de -H (aunque aún puede especificarlo)
    • El directorio de trabajo para el shell de suplantación es el someUserdirectorio de inicio de.
  • -s crea un shell sin inicio de sesión:

    • sin cáscara perfil se carga (a través de archivos de inicialización para interactivos no iniciar sesión las conchas son; p.ej, ~/.bashrc)
    • A menos que también especifique -H, el proceso de suplantación informará el original directorio de inicio del usuario en $HOME.
    • El shell de suplantación tendrá el mismo directorio de trabajo que el proceso de invocación.

Usar un caparazón significa que string Los argumentos pasados ​​en la línea de comando PUEDEN ser sujeto a expansiones de caparazónver las diferencias específicas de la plataforma a continuación – por el shell de suplantación (posiblemente después de la expansión inicial por el shell de invocación); compare los siguientes dos comandos (que usan soltero cotizaciones para evitar la expansión prematura por el invocando cascarón):

  # Run root's shell profile, change to root's home dir.
sudo -u root -i eval 'echo $SHELL - $USER - $HOME - $PWD'
  # Don't run root's shell profile, use current working dir.
  # Note the required -H to define $HOME as root`s home dir.
sudo -u root -H -s eval 'echo $SHELL - $USER - $HOME - $PWD'

Qué es el infierno se invoca está determinada por “la variable de entorno SHELL si está configurada o el shell como se especifica en passwd (5)” (de acuerdo con man sudo). Tenga en cuenta que con -s es el invocando entorno del usuario que importa, mientras que con -i es el suplantado usuario.

Tenga en cuenta que hay diferencias de plataforma con respecto al comportamiento relacionado con el shell (con -i o -s):

  • sudo en Linux aparentemente solo acepta un ejecutable o incorporado nombre como el primero argumento siguiente -s/-i, mientras que OSX permite pasar una línea de comandos de shell completa; por ejemplo, OSX acepta sudo -u root -s 'echo $SHELL - $USER - $HOME - $PWD' directamente (sin necesidad de eval), mientras que Linux no lo hace (a partir de sudo 1.8.95p).

  • Versiones anteriores de sudo en Linux NO aplique expansiones de shell a los argumentos pasados ​​a un shell; por ejemplo, con sudo 1.8.3p1 (por ejemplo, Ubuntu 12.04), sudo -u root -H -s echo '$HOME' simplemente se hace eco de la string literal “$ HOME” en lugar de expandir la referencia de variable en el contexto del usuario root. Al menos a partir de sudo 1.8.9p5 (por ejemplo, Ubuntu 14.04) esto se ha solucionado. Por lo tanto, para garantizar la expansión en Linux incluso con versiones más antiguas sudo versiones, pase el comando completo como un solo argumento a eval; p.ej: sudo -u root -H -s eval 'echo $HOME'. (Aunque no es necesario en OSX, esto también funcionará allí).

  • los root usuario $SHELL variable contiene /bin/sh en OSX 10.9, mientras que es /bin/bash en Ubuntu 12.04.

Ya sea que el proceso de suplantación involucre un shell o no, su entorno tendrá las siguientes variables configuradas, reflejando el usuario y el comando que invoca: SUDO_COMMAND, SUDO_USER, SUDO_UID=, SUDO_GID.

Ver man sudo y man sudoers para muchas más sutilezas.

Sugerencia del sombrero para @DavidW y @Andrew en busca de inspiración.

En BASH, puede encontrar un usuario $HOME directorio prefijando el ID de inicio de sesión del usuario con un carácter de tilde. Por ejemplo:

$ echo ~bob

Esto hará eco al usuario bob‘s $HOME directorio.

Sin embargo, dice que desea poder ejecutar un script como un usuario en particular. Para hacer eso, necesita configurar sudo. Este comando le permite ejecutar comandos particulares como un usuario en particular. Por ejemplo, para ejecutar foo como usuario bob:

$ sudo -i -ubob -sfoo

Esto iniciará un nuevo shell y el -i simulará un inicio de sesión con el entorno y el shell predeterminados del usuario (lo que significa que foo El comando se ejecutará desde el bob'sDirectorio $ HOME`.)

Sudo es un poco complejo de configurar, y debe ser un superusuario solo para poder ver el archivo de escalofríos (generalmente /etc/sudoers). Sin embargo, este archivo suele tener varios ejemplos que puede utilizar.

En este archivo, puede especificar los comandos que especifica quién puede ejecutar un comando, qué usuario y si ese usuario debe ingresar su contraseña antes de ejecutar ese comando. Este es normalmente el valor predeterminado (porque demuestra que este es el usuario y no alguien que vino mientras el usuario estaba obteniendo una Coca-Cola). Sin embargo, cuando ejecuta un script de shell, generalmente desea deshabilitar esta función.

En aras de una respuesta alternativa para aquellos que buscan una forma liviana de simplemente encontrar el directorio de inicio de un usuario …

En lugar de jugar con su hacks, o molestarse con la sobrecarga de lanzar otro bash shell solo para encontrar el $HOME Variable ambiental…

Consulta de Homedir simple y ligera a través de Bash

Hay un comando específicamente para esto: getent

getent passwd someuser | cut -f6 -d:

getent puede hacer mucho más … solo vea la página de manual. los passwd La base de datos nsswitch devolverá la entrada del usuario en /etc/passwd formato. Solo divídelo en el colon : para analizar los campos.

Debe instalarse en la mayoría de los sistemas Linux (o en cualquier sistema que utilice GNU Lib C (RHEL: glibc-common, Deb: libc-bin)

Sección de Reseñas y Valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *