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 desudo
. - Lo siguiente se basa en el defecto configuración de
sudo
– cambiar su configuración puede hacer que se comporte de manera diferente – verman 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 -i
o-s
– sin especificar someExe ...
crea un interactivo cascarón:
-
-i
crea un acceso cáscara parasomeUser
, lo que implica lo siguiente:someUser
‘s se carga el perfil de shell específico del usuario, si está definido.$HOME
puntos asomeUser
directorio 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
someUser
directorio 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.
- 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,
Usar un caparazón significa que string Los argumentos pasados en la línea de comando PUEDEN ser sujeto a expansiones de caparazón – ver 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 aceptasudo -u root -s 'echo $SHELL - $USER - $HOME - $PWD'
directamente (sin necesidad deeval
), mientras que Linux no lo hace (a partir desudo 1.8.95p
). -
Versiones anteriores de
sudo
en Linux NO aplique expansiones de shell a los argumentos pasados a un shell; por ejemplo, consudo 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 desudo 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 antiguassudo
versiones, pase el comando completo como un solo argumento aeval
; 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's
Directorio $ 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
)