Bin-Verzeichnis zu meinem Pfad hinzugefügt, kann darin keine Befehle mit dem Befehl 'sudo' ausführen.

7

Ich habe ein binVerzeichnis in meinem Home-Ordner erstellt, in dem ich alle meine Skripte ablege. Dann habe ich in meiner .bashrc Folgendes hinzugefügt:

export PATH=$PATH:/home/myusername/bin

So konnte ich von überall auf Dateien zugreifen, die ich dort abgelegt hatte. Einige der Skripte müssen jedoch als root ausgeführt werden. Also dachte ich, ich könnte meine .bashrc-Datei als root verknüpfen (wie in /root/.bashrc auf /home/myusername/.bashrc verweist, weiß nicht, ob dies klug ist), wenn ich ein Skript als root ausführen muss Ich kann einfach tun:

sudo program_that_requires_root

Aber dann bekomme ich ein:

sudo: program_that_requires_root: command not found

Wenn ich mich als root anmelde und das Programm ausführe, funktioniert es jedoch einwandfrei. Was ist also der richtige Weg, um das zu erreichen, was ich will?

Carlito
quelle
2
Meine Vermutung: verwendet sudowahrscheinlich secure_pathanstelle von Ihnen $PATH. Führen Sie sudo -Vals root (z. B. sudo sudo -V) aus und suchen Sie nach Zeilen, die enthalten PATH.
jw013
2
Ja, zumindest in Debian, öffnen Sie die Datei /etc/sudoersund suchen Sie diese Zeile: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin(Pfade können variieren) - Wenn Sie Ihren Benutzerpfad hinzufügen bin, funktioniert dies. (Vielleicht wird diese Lösung aus anderen Gründen nicht empfohlen; ich weiß es nicht.) Oh, in der erwähnten Datei heißt es, dass Sie sie nicht ändern sollten, aber ich habe es getan, und es funktioniert großartig, zumindest in Bezug auf das, was ich habe versucht zu erreichen (mit dem gleichen Problem wie Sie).
Emanuel Berg

Antworten:

4

Sie müssen sicherstellen, dass diese beiden Zeilen in der sudoers-Datei vorhanden sind.

Defaults        env_reset
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:$

Weitere Informationen finden Sie unter diesen URLs:


quelle
1
Ich denke, $am Ende der zweiten (Code-) Zeile, die beim Kopieren folgte - es sollte natürlich ein abschließendes Zitat sein. Außerdem muss der neue Pfad zu den Benutzer-Binärdateien (und anderen ausführbaren Dateien, wie von @Carlito erwähnt) hinzugefügt werden. (Sie haben das wahrscheinlich getan; wurden gerade abgehackt.)
Emanuel Berg
Danke, ich habe in der sudoers-Datei nachgesehen und meinen Pfad zur zweiten Zeile hinzugefügt, funktioniert super!
Carlito
1

sudoSetzt die PATHUmgebungsvariable in den meisten Konfigurationen auf einen integrierten oder vom Administrator bereitgestellten Standard zurück. Sie können also nicht nur tippen sudo myscript.

Sie könnten eine Wrapper-Funktion schreiben:

sudo () {
  local cmd
  case $1 in
    -*) :;; # there are options, change nothing
    */*) :;; # explicit path, change nothing
    *) # a command name, look it up in our $PATH
      cmd=$(type -p -- "$1")
      if [[ -n $cmd ]]; then shift; set -- "$c" "$@"; fi;;
  esac
  command sudo "$@"
}

(Dies ist für Bash; ändern Sie type -Pin type -pin ksh oder zsh.)

Gilles 'SO - hör auf böse zu sein'
quelle
Hm, obwohl ich nicht bezweifle, dass dies der Fall ist, scheint es ein bisschen kompliziert zu sein - gibt es tatsächlich einen versteckten Gewinn im Vergleich zur Bearbeitung /etc/sudoers, was eine viel einfachere Lösung zu sein scheint?
Emanuel Berg
1
@EmanuelBerg Wenn dies Ihr Computer ist, können Sie die sudoersDatei bearbeiten und ändern secure_path. Wenn es sich um einen gemeinsam genutzten Computer handelt, ist es unwahrscheinlich, dass der Administrator bereit ist, Sie zu unterstützen: Eine vom Benutzer gewählte secure_pathEinstellung oder das Neukompilieren von sudo ohne diese Option wäre ein Wartungsproblem.
Gilles 'SO - hör auf böse zu sein'
0

Standardmäßig setzt sudo die Umgebung zurück. Haben Sie versucht, den Pfad zu .bashrc von root hinzuzufügen? Oder rufen Sie sudo mit -E auf (was nur funktioniert, wenn setenv in sudoers gesetzt ist oder für den entsprechenden Befehl das SETENV-Tag gesetzt ist).

basteln
quelle
2
Das Ändern der .bashrcRoots hilft nicht: sudoStartet hier keine interaktive Bash-Instanz.
Gilles 'SO - hör auf böse zu sein'