Wie kann ich PATH für sudo hinzufügen / ändern?

1

Ich habe zwei Versionen von Python installiert.

  • Python 2.7.14 in /usr/local/bin
  • Python 2.7.5 in /usr/bin.

Bei der Eingabe # pythonwird die Version verwendet 2.7.14, bei der Eingabe sudo pythonjedoch die Version 2.7.5. Wie kann ich sudo pythonauf die Version verweisen 2.7.14?

In der Ausgabe von sudo env | grep PATH, /usr/local/binerscheint vorher /usr/binaber immer noch Python abholend /usr/bin.

PATH=/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Wenn ich tippe sudo su, um in die Root-Shell einzutreten, gibt es mir python 2.7.14aber in derselben Sitzung, wenn ich tippe sudo python, gibt es mir python 2.7.5.

Ich habe diese Frage durchgearbeitet, aber die akzeptierte Antwort gibt keine Antwort darauf, wie sichergestellt werden kann, dass sudo den richtigen Pfad verwendet.

So sieht der sichere Pfad aus:

secure_path = /usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Manoj
quelle
1
Was ist die Ausgabe von sudo type python? (Ich vermute, dass Sie pythonauf etwas anderes ausgerichtet sind oder irgendwo eine Funktion erstellt haben.)
Franklin Yu
@ Franklin das funktioniert bei mir nicht. Sagt sudo: type: command not found . Ich habe einen Alias ​​erstellt, ihn aber entfernt, da er für sudo
Manoj am
Alles klar, wie wäre es sudo bash -c 'type python'?
Franklin Yu
@ Franklin gibt es auspython is /bin/python
Manoj
Welches Betriebssystem verwenden Sie? Ist Bash die Anmelde-Shell für root oder eine andere Shell?
Franklin Yu

Antworten:

0

Dies ist definitiv eine sudound eine GNU/LinuxFrage, nicht wirklich eine PythonFrage. Wenn Sie sudo foo arg1 arg2das System zum ersten Mal ausführen , wird eine Shell gestartet (die für root festgelegt ist, nicht für Sie), die als ausgeführt wird rootund dann "ausgeführt" wird foo arg1 arg2. Dies ist nicht dasselbe wie Anmelden bei rootund Eingeben foo arg1 arg2in die Befehlszeile, sondern Schließen. Es gibt ausführbare Dateien, die es einem Benutzer mit Sudo-Berechtigung nicht ermöglichen, einige Dinge auszuführen, und einige zusätzliche Umgebungsvariablen, die für Sie festgelegt wurden und die Sie sehen können, wenn Sie ausgeführt werden sudo env. Du wirst etwas sehen wie:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PS1=%%
PS2=cont>
MAIL=/var/mail/root
LOGNAME=root
USER=root
USERNAME=root
HOME=/root
SHELL=/bin/bash
SUDO_COMMAND=/usr/bin/env
SUDO_USER=my_user
SUDO_USER=spt
SUDO_UID=1000
SUDO_GID=1000
SUDO_COMMAND=/usr/bin/env

Und wenn es sich bei der Shell um eine Bash handelt, hat die Subshell wahrscheinlich den Inhalt der /root/.bashrcvorhandenen Shell eingelesen . Darüber hinaus führt die my_userBash-Shell eine Alias-Erweiterung für das erste Element (dh das sudo in sudo foo arg1 arg2) und nicht für das zweite Element ( foo ) durch. Wenn fooes sich also auch um einen Alias ​​handelt, wird dieser nicht erweitert, und daher wird die Subshell, die als ausgeführt rootwird, fooals Literal ausgeführt und nicht fooals der Alias, unter dem Sie erstellt haben my_user. Es gibt verschiedene Möglichkeiten, um Ihr Problem zu beheben. Man definiert einen Alias ​​für sudomit einem abschließenden Leerzeichen:

alias='sudo '

Wie hier erklärt , wird das, was danach kommt sodo, ebenfalls alias-erweitert, bevor es zur Ausführung an die Subshell gesendet wird.

Eine andere Möglichkeit besteht darin, die /root/.bashrcoder eine gleichwertige Datei zu bearbeiten und eine der folgenden Aktionen auszuführen:

  1. Prepend die Position des gewünschten Python auf die $PATHVariable mit so etwas wieexport PATH=/path/to/foo:$PATH
  2. Definieren Sie dort den gewünschten Alias

Oder Sie könnten etwas (Mildes) Riskantes und Fauleres tun, aber es ist sehr effektiv und läuft einfach sudo (cd /root && ln -s /home/my_user/.bashrc)und rootwird immer nur Ihre my_user/.bashrcDatei als Quelle verwenden.

Gabe
quelle