Linux - utilisez "su -" mais conservez le répertoire courant

14

Lorsque je le fais su -pour accéder à root, mon répertoire actuel est défini sur home de root. Existe-t-il de toute façon de conserver le répertoire actuel dans lequel j'étais, un peu comme sudo -s. Ou est la réponse à utiliser sudo?

Rory
la source
5
Veuillez noter que je ne veux pas paraître grossier, mais pourquoi ce problème n'est pas résolu via "man su"?
Myrrdyn
1
@Rory s'il vous plaît lire le commentaire
Myrrdyn
J'aime utiliser sudo su -c "zsh", dans mon cas, me maintient dans le répertoire actuel et charge zsh en tant que shell avec l'utilisateur root. ctrl+daprès et vous revenez à l'utilisateur actuel. Pour le répertoire, ça marche directement sur les centos pour moi, mais peut-être que l'ajout de `&& cd $ (pwd)` dans la commande passée pourrait faire l'affaire.
GabLeRoux
@Myrrdyn Les documentations sont excellentes lorsque vous savez ce que vous recherchez. Dans le cas contraire, demander des conseils à des experts est plus rapide et plus didactique.
Romain Vincent

Réponses:

18

Il est toujours préférable d'utiliser sudo, si possible, car vous n'avez alors pas besoin de connaître (ou de donner à quelqu'un) le mot de passe root. Définissez le mot de passe root sur quelque chose de long et d'horrible, puis verrouillez-le dans un coffre-fort.

Si vous souhaitez refuser l'accès à quelqu'un plus tard, vous supprimez simplement son accès à sudo, plutôt que d'avoir à enseigner à tous les autres un nouveau mot de passe root.

Cependant - vous n'avez pas besoin d'utiliser le paramètre '-' si vous ne le souhaitez pas. Vous obtiendrez un shell en tant que root, ce ne sera tout simplement pas un shell de connexion (il n'exécutera donc pas le .profile de root.)

crb
la source
1
Dans mon cas, j'avais besoin d'un alias pour faire quelque chose comme ça asuser git reset --hard. Mais su - <user> -m -c "git reset --hard"et sudo -u <user> git reset --hardsauverait mon environnement et git essaierait de lire la configuration git de l'utilisateur actuel . Je voulais donc simplement dire que parfois la solution de user205705 utilisant su - <user> -c "cd pwd; bash" est meilleure.
ReFruity
16

Je suis d'accord que sudo est presque toujours une meilleure réponse mais pour répondre à l'autre partie de la question ...

Le «-» dans «su -» indique que vous souhaitez émuler une connexion de superutilisateur, plutôt que de simplement exécuter avec les privilèges de superutilisateur.

Si vous utilisez simplement «su» plutôt que «su -», vous resterez dans le même répertoire; Cependant, vous serez également exécuté dans le même environnement et devrez peut-être modifier votre chemin d'accès pour accéder à certaines commandes d'administration.

Russell Heilling
la source
9

Si vous utilisez susans le -, il devrait vous garder dans votre répertoire actuel. -, -lOu --login dire su à:

Fournissez un environnement similaire à celui auquel l'utilisateur s'attendrait s'il se connectait directement.

Ou utilisez simplement sudo, il a beaucoup d'autres avantages. Ou les touches ssh.

freiheit
la source
6

Vous devez absolument utiliser sudo.

su -m
-m (-p): ne réinitialise pas les variables d'environnement (généralement déconseillé)

Cela vous gardera dans le dossier lorsque vous passerez à root.

Avantages d'utiliser Sudo

Jindrich
la source
1
Je ne vois pas en quoi cela est différent de simplement "su" seul, à part le fait de ne pas réinitialiser l'environnement PATH, ce qui est un problème de sécurité possible.
David Pashley
@DavidPashley par exemple, il exécute le à .bashrcpartir de l'utilisateur externe, pas le root.
phil294
4

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

su - <user> -c "cd `pwd`; bash"

Que se passe t-il ici:

  • su - <user> = se connecter en tant que
  • -c ce qui signifie "exécuter une commande dans le nouveau shell
  • -c "cd `pwd`" la commande que nous donnons est de basculer vers le répertoire actuel ( pwd) - mais parce que nous utilisons les raccourcis, la pwdcommande est évaluée avant d'exécuter la sucommande afin que nous basculions réellement vers le répertoire dans lequel nous nous trouvons MAINTENANT en tant qu'ancien utilisateur. 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 et le shell bash ne se ferme que lorsque nous nous déconnectons.
will.barley
la source
1
C'est en fait la seule réponse à la question. Bon travail!
Cacahuete Frito
En fait, cela su - [user] -c "cd $(pwd); bash"pourrait être un peu mieux (changez les backticks en $()).
Cacahuete Frito
3

Utilisez sudo :). Sérieusement, vous n'avez pas besoin de su. 'sudo' est meilleur car vous ne l'utilisez que pour des commandes privilégiées et peut aider à éviter les erreurs. Vous obtenez également la responsabilité.

chmeee
la source
2

Si vous utilisez "su", cela fait un shell interactif. C'est la même chose que "sudo -s". "su -" crée un shell de connexion, qui remplacera l'environnement. "sudo -i" est l'équivalent de sudo. Si vous essayez d'obtenir un shell interactif, vous devez toujours utiliser le formulaire sudo -i (ou su -), ou il est possible de se retrouver avec des autorisations de fichier étranges dans le répertoire personnel d'un utilisateur.

David Pashley
la source
0

vous devez modifier la source de su pour que ce travail soit effectué. il y a un appel chdir dans une procédure d'initialisation des variables d'environnement. commenter ces déclarations inclus cet appel. et maintenant, vous pouvez faire "su -" mais conserve le répertoire courant.


la source