Nie można rozwinąć gwiazdki bez odpowiedniego pozwolenia

16

Czy ktoś może mi wyjaśnić, co następuje?

$ ls -ld /temp/sit/build/
dr-xr-s--- 3 asdf qwer 4096 Jan 31  2012 /temp/sit/build/

$ ls -ld /temp/sit/build/*
ls: /temp/sit/build/*: Permission denied

Tak więc przyuczeni nie mogę tutaj użyć gwiazdki. Wypróbowałem to z poleceniem sudo i pojawia się błąd „brak takiego pliku” zamiast „odmowa dostępu” ...

sudo ls -l /temp/sit/build/*
ls: /temp/sit/build/batch*: No such file or directory

ale w końcu działa, jeśli nie używam *

sudo ls -l /temp/sit/build/
total 4
dr-xr-s--- 11 asdf qwer 4096 Oct  3 23:31 file
imagineerThis
źródło

Odpowiedzi:

20

Powłoka, która dokonuje rozwinięcia *znaku wieloznacznego, jest powłoką, w której ją wpisujesz. Jeśli powłoka ma uprawnienia do odczytu listy plików w katalogu, a następnie rozszerza /temp/sit/build/*się /temp/sit/build/filei biegnie sudoz argumentami ls, -li /temp/sit/build/file. Jeśli powłoka nie jest w stanie znaleźć żadnego meczu dla /temp/sit/build/*(czy to dlatego, że nie istnieją żadne mecze, albo dlatego, że powłoka nie ma uprawnień do oglądania meczów), a następnie pozostawia wzór sam, a sudonazywa się z argumentami ls, -li /temp/sit/build/*.

Ponieważ nie ma wywołanego pliku /temp/sit/build/*, lspolecenie narzeka, jeśli podasz mu tę nazwę. Pamiętaj, że lsto nie rozwija symboli wieloznacznych, to zadanie powłoki.

Jeśli chcesz, aby interpretacja symboli wieloznacznych miała miejsce w katalogu, w którym nie masz uprawnień do odczytu, wówczas ekspansja musi nastąpić w powłoce, która została uruchomiona, sudozamiast w powłoce, która wywołuje sudo. sudonie uruchamia automatycznie powłoki, musisz to zrobić jawnie.

sudo sh -c 'ls -l /temp/sit/build/*'

Tutaj możesz oczywiście sudo ls -l /temp/sit/build/zamiast tego zrobić , ale to nie uogólnia na inne wzorce.

Gilles „SO- przestań być zły”
źródło
1

W niektórych rzadkich przypadkach musisz dokładnie sprawdzić, czy nie wyłączyłeś globowania dla swojej powłoki, co może dać ci No such file or directoryprzy próbie wyświetlenia listy za pomocą znaku wieloznacznego ( *).

Na przykład:

$ ls /tmp/sit/build/*
/tmp/sit/build/file
$ set -f
$ ls /tmp/sit/build/*
ls: cannot access /tmp/sit/build/*: No such file or directory
$ set +f
$ ls /tmp/sit/build/*
/tmp/sit/build/file

Sprawdź help setwięcej informacji.

kenorb
źródło