Link symboliczny i sudo

10

Tworzę dowiązanie symboliczne:

ln -s /tmp/folder1 /tmp/folder2

Następnie przechodzę do / tmp / folder2 i uruchamiam pwd:

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

Dlaczego pwdz sudonadać oryginalny katalog? Piszę skrypt bash i potrzebuję bezwzględnej ścieżki do bieżącego katalogu. W przypadku sudo nie mogę uzyskać oryginalnego katalogu.

iDev247
źródło
Czy Twoim celem jest, aby pwd zwrócił ścieżkę fizyczną (/ tmp / folder1) czy ścieżkę logiczną (/ tmp / folder2) dla obu?
user9517
Celem jest zwrócenie logicznej ścieżki podczas korzystania z sudo
iDev247

Odpowiedzi:

14

Polecenie pwd jest zarówno wbudowane w powłokę, jak i / bin / pwd. W normalnych okolicznościach wbudowane będzie uruchamiane zamiast / bin / pwd. Polecenie pwd można wywołać jako pwd -Llub pwd -PZarówno wbudowane, jak i / bin / pwd domyślnie na pwd -Lstronie man

-L, --logiczne użycie PWD ze środowiska, nawet jeśli zawiera dowiązania symboliczne

więc kiedy uruchamiasz pwd, faktycznie uruchamiasz pwd -L, który w efekcie wypisuje $ PWD (jeśli istnieje). Po uruchomieniu sudo pwdsudo udostępnia tylko zmienne środowiskowe, o których kazano przekazywać za pośrednictwem env_keepdyrektyw. PWD zwykle nie znajduje się na tej liście, więc sudo pwd musi ustalić, gdzie się znajduje i w efekcie działa jakopwd -P

-P, --fizyczne unikaj wszystkich dowiązań symbolicznych

Rozwiązaniem problemu jest użycie go, pwd -Pjeśli chcesz, aby ścieżka fizycznego katalogu była konsekwentna, lub (jak mówi @Felix), aby dodać PWD do listy zmiennych środowiskowych i zachować w sudoers za pomocą dyrektywy env_keep

env_keep += "PWD"  
użytkownik9517
źródło
Pracuje! Po dodaniu PWD do env_keep muszę zrobić, sudo pwd -Laby uzyskać logiczną ścieżkę. sudo pwdzwraca ścieżkę fizyczną.
iDev247
6

W bash pwdjest wbudowany. /bin/pwddaje takie samo zachowanie jak sudo pwd.

Będziesz chciał

  1. use sudo pwd -L, który działa tylko, jeśli ty
  2. uwzględnij Defaults env_keep=PWDw swoim sudoerspliku
Felix Frank
źródło