Cuando trabajo en la línea de comando, a menudo cambio a sudo usando sudo -i
. Sin embargo, mi directorio de trabajo cambia automáticamente a /root
. Nunca quiero ir allí; ¡Quiero quedarme donde estaba! ¿Cómo puedo conseguir esto?
Cuando trabajo en la línea de comando, a menudo cambio a sudo usando sudo -i
. Sin embargo, mi directorio de trabajo cambia automáticamente a /root
. Nunca quiero ir allí; ¡Quiero quedarme donde estaba! ¿Cómo puedo conseguir esto?
Respuestas:
En su sudo -s
lugar, podría usar , no cambiaría su directorio actual /root
, aunque algunas de sus variables de entorno no serían las de la raíz.
Esta página de los foros de Ubuntu tiene un buen resumen:
Summary of the differences found
corrupted by user's
HOME=/root uses root's PATH env vars
sudo -i Y Y[2] N
sudo -s N Y[2] Y
sudo bash N Y[2] Y
sudo su Y N[1] Y
Esta página de la documentación de Ubuntu tiene mucha más información de fondo sobre sudo .
sudo -iu
funciona para mí ubuntuforums.org/…
sudo -i
todavía está dañado por los env env del usuario. La única forma de evitar esto es usarlo su -l
.
Si desea usar su
, hay una manera de permanecer en el mismo directorio.
su - usuario -c "cd` pwd`; bash "
Que está pasando aqui:
su - user
= iniciar sesión como user
-c
lo que significa "ejecutar un comando en el nuevo shell del usuario"-c "cd `pwd`"
el comando que damos es cambiar al directorio actual ( `pwd`
), pero debido a que usamos las comillas inversas entre comillas dobles, el pwd
comando se evalúa antes de ejecutar el su
comando, de modo que realmente cambiemos al directorio en el que estamos AHORA como el antiguo usuario.
-c 'cd `pwd`'
ejecutaría el pwd
comando en el nuevo shell, por lo que esto evaluaría cd /root
, lo que, por supuesto, no logrará nada.El único problema aquí es que el nuevo shell sale justo después de ejecutar el comando, por lo que agregamos:
-c "cd `pwd`; bash"
lo que significa "ejecutar bash
(nuevo shell) después de ejecutar el cd
comando. El shell bash no se cierra hasta que cerramos la sesión.Tenga en cuenta que puede reemplazar `pwd`
con $(pwd)
. Funcionalmente son iguales, pero la abundancia de caracteres tipo comillas puede ser difícil de leer.
Me he enfrentado al mismo problema y no se me permite ejecutar nada más que sudo su - devuser
en el servidor de desarrollo, así que esto es lo que se me ocurrió:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
#!/bin/bash
#brings you back home after sudo su
function get_owner {
pid=$1
echo $(ps ouid -p $pid h | tr -d ' ')
}
pid=$$
my_uid=$(get_owner $pid)
uid=$my_uid
i=0
while [[ $uid == $my_uid && $i -lt 20 ]] ; do
pid=$(ps -o ppid= $pid)
uid=$(get_owner $pid)
i=$((i+1))
done
user_home=$(getent passwd $uid | cut -d ':' -f '6')
if [[ -d $user_home && $uid != 0 ]] ; then
echo $user_home
fi
Sube un árbol de procesos y comprueba si el usuario propietario del proceso cambió.