Symbolische Verbindung und Sudo

10

Ich erstelle eine symbolische Verknüpfung:

ln -s /tmp/folder1 /tmp/folder2

Dann gehe ich zu / tmp / folder2 und starte pwd:

$ cd /tmp/folder2/
$ pwd
/tmp/folder2
$ sudo pwd
/tmp/folder1 # <-- This is the odd part

Warum gibt man pwdmit sudodas Originalverzeichnis? Ich schreibe ein Bash-Skript und benötige den absoluten Pfad des aktuellen Verzeichnisses. Mit sudo kann ich anscheinend nicht in der Lage sein, das ursprüngliche Verzeichnis zu erhalten.

iDev247
quelle
Ist es Ihr Ziel, dass pwd den physischen Pfad (/ tmp / folder1) oder den logischen Pfad (/ tmp / folder2) für beide zurückgibt?
user9517
Ziel ist es, den logischen Pfad bei Verwendung von sudo zurückzugeben
iDev247

Antworten:

14

Der Befehl pwd ist sowohl eine integrierte Shell als auch / bin / pwd. Unter normalen Umständen wird das eingebaute System bevorzugt gegenüber / bin / pwd ausgeführt. Der Befehl pwd kann aufgerufen werden , pwd -Loder pwd -Psowohl auf die builtin und / bin / pwd Standard pwd -Laus der Manpage

-L, --logical verwendet PWD aus der Umgebung, auch wenn es Symlinks enthält

Wenn Sie also pwd ausführen, führen Sie tatsächlich pwd -L aus, wodurch tatsächlich $ PWD gedruckt wird (falls vorhanden). Wenn Sie ausführen sudo pwd, stellt sudo nur die Umgebungsvariablen bereit, die über env_keepAnweisungen weitergegeben werden sollen. PWD ist normalerweise nicht in dieser Liste enthalten, daher muss sudo pwd herausfinden, wo es sich befindet, und läuft tatsächlich alspwd -P

-P, --physical vermeide alle Symlinks

Die Möglichkeit, das Problem zu lösen, besteht darin, entweder pwd -Pden physischen Verzeichnispfad zu verwenden oder (wie @Felix sagt) PWD zur Liste der Umgebungsvariablen hinzuzufügen, die über eine env_keep-Direktive in sudoers beibehalten werden sollen

env_keep += "PWD"  
user9517
quelle
Funktioniert! Nachdem PWD zu env_keep hinzugefügt wurde, muss ich sudo pwd -Lden logischen Pfad ermitteln. sudo pwdGibt den physischen Pfad zurück.
iDev247
6

In Bash pwdist ein eingebauter. /bin/pwdergibt das gleiche Verhalten wie sudo pwd.

Du wirst es wollen

  1. verwenden sudo pwd -L, was nur funktioniert, wenn Sie
  2. sind Defaults env_keep=PWDin Ihrer sudoersDatei
Felix Frank
quelle