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 # python
wird die Version verwendet 2.7.14
, bei der Eingabe sudo python
jedoch die Version 2.7.5
. Wie kann ich sudo python
auf die Version verweisen 2.7.14
?
In der Ausgabe von sudo env | grep PATH
, /usr/local/bin
erscheint vorher /usr/bin
aber 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.14
aber 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
sudo type python
? (Ich vermute, dass Siepython
auf etwas anderes ausgerichtet sind oder irgendwo eine Funktion erstellt haben.)sudo: type: command not found
. Ich habe einen Alias erstellt, ihn aber entfernt, da er für sudosudo bash -c 'type python'
?python is /bin/python
Antworten:
Dies ist definitiv eine
sudo
und eineGNU/Linux
Frage, nicht wirklich einePython
Frage. Wenn Siesudo foo arg1 arg2
das System zum ersten Mal ausführen , wird eine Shell gestartet (die für root festgelegt ist, nicht für Sie), die als ausgeführt wirdroot
und dann "ausgeführt" wirdfoo arg1 arg2
. Dies ist nicht dasselbe wie Anmelden beiroot
und Eingebenfoo arg1 arg2
in 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 werdensudo env
. Du wirst etwas sehen wie:Und wenn es sich bei der Shell um eine Bash handelt, hat die Subshell wahrscheinlich den Inhalt der
/root/.bashrc
vorhandenen Shell eingelesen . Darüber hinaus führt diemy_user
Bash-Shell eine Alias-Erweiterung für das erste Element (dh das sudo insudo foo arg1 arg2
) und nicht für das zweite Element ( foo ) durch. Wennfoo
es sich also auch um einen Alias handelt, wird dieser nicht erweitert, und daher wird die Subshell, die als ausgeführtroot
wird,foo
als Literal ausgeführt und nichtfoo
als der Alias, unter dem Sie erstellt habenmy_user
. Es gibt verschiedene Möglichkeiten, um Ihr Problem zu beheben. Man definiert einen Alias fürsudo
mit einem abschließenden Leerzeichen: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/.bashrc
oder eine gleichwertige Datei zu bearbeiten und eine der folgenden Aktionen auszuführen:$PATH
Variable mit so etwas wieexport PATH=/path/to/foo:$PATH
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)
undroot
wird immer nur Ihremy_user/.bashrc
Datei als Quelle verwenden.quelle