Restez dans le même répertoire de travail lorsque vous passez à sudo

25

Lorsque je travaille sur la ligne de commande, je passe souvent à sudo en utilisant sudo -i. Cependant, mon répertoire de travail devient automatiquement /root. Je ne veux jamais y aller; Je veux rester où j'étais! Comment puis-je atteindre cet objectif?

Réintégrer Monica
la source

Réponses:

28

Vous pouvez utiliser à la sudo -splace, cela ne changerait pas votre répertoire actuel en /root, bien que certaines de vos variables d'environnement ne soient pas celles de root.

Cette page des forums Ubuntu a un joli résumé:

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

Cette page de la documentation d'Ubuntu contient beaucoup plus d' informations sur sudo .

Levon
la source
1
Beau! Merci beaucoup, simple mais super petit aperçu!
Rétablir Monica le
@ user1162541 Heureux de pouvoir aider.
Levon
sudo -iutravaille pour moi ubuntuforums.org/…
rofrol
Lors de mon test, env vars de sudo -iest toujours corrompu par les env vars de l'utilisateur. La seule façon d'éviter cela est d'utiliser su -l.
Simba
5

Si vous souhaitez utiliser su, il existe un moyen de rester dans le même répertoire.

su - utilisateur -c "cd` pwd`; bash "

Que se passe t-il ici:

  • su - user = se connecter en tant que user
  • -c ce qui signifie "exécuter une commande dans le shell du nouvel utilisateur"
  • -c "cd `pwd`"la commande que nous donnons est de basculer vers le répertoire courant ( `pwd`) - mais parce que nous utilisons les guillemets doubles entre guillemets, la pwdcommande est évaluée avant d'exécuter la sucommande, de sorte que nous basculons réellement vers le répertoire dans lequel nous sommes MAINTENANT comme l'ancien utilisateur.

    • En revanche, -c 'cd `pwd`'exécuterait la pwdcommande dans le nouveau shell, donc cela serait évalué cd /root, ce qui, bien sûr, n'accomplirait rien.

    Le seul problème ici est que le nouveau shell se ferme juste après l'exécution de la commande, alors nous ajoutons:

  • -c "cd `pwd`; bash"ce qui signifie "run bash(nouveau shell) après avoir exécuté la cdcommande. Le shell bash ne se ferme que lorsque nous nous déconnectons.

Notez que vous pouvez remplacer `pwd`par $(pwd). Ils sont fonctionnellement les mêmes, mais l'abondance de caractères de type citation peut devenir difficile à lire.

will.barley
la source
0

J'ai rencontré le même problème et je ne suis pas autorisé à exécuter autre chose que sudo su - devusersur un serveur de développement, c'est donc ce que j'ai trouvé:

  1. Dans le .profile de devuser, revenez à la page d'accueil de l'utilisateur précédent s'il est trouvé:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
        cd $prev_user_home
fi
  1. Un script pour déterminer un utilisateur précédent. Le script est placé dans le répertoire bin de devuser:
#!/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

Il monte une arborescence de processus et vérifie si l'utilisateur propriétaire du processus a changé.

reimai
la source