Czy ktoś może wyjaśnić, dlaczego sudo z symbolem wieloznacznym nie działa?

16
$ sudo -iu abc ls -ltr /sites/servers/server_instance/logs/access*
ls: cannot access /sites/servers/server_instance/logs/access*: No such file or directory

$ sudo -iu abc ls -ltr /sites/servers/server_instance/logs/
total 594812
-rwxrwxrwx 1 abc abc      45 Mar 21 12:42 old.log
-rwxrwxrwx 1 abc abc      304537970 Mar 24 12:45 console.log
-rwxrwxrwx 1 abc abc      304537970 Mar 24 13:20 access_nginx.log

Czy ktoś może wyjaśnić, dlaczego tak się dzieje? Z tego powodu utknąłem na skrypcie.

Faisal
źródło

Odpowiedzi:

29

Jedną z możliwości jest to, że nie masz uprawnień dostępu do jednego lub więcej katalogów w tej ścieżce ( /sites/servers/server_instance/logs). Rozwijanie symboli wieloznacznych jest wykonywane przez powłokę, a następnie rozwinięte ścieżki są przekazywane do sudopolecenia.

Jeśli użytkownik nie ma uprawnień, rozszerzenie nie będzie działać w pierwszym poleceniu. Zostałby uruchomiony jako-is ( ls -ltr /sites/servers/server_instance/logs/access*) i nie ma pliku o nazwie dosłownie access*). Jeśli abcma wymagane uprawnienia dla wszystkich katalogów na ścieżce, druga komenda, która nie miała żadnych symboli wieloznacznych, byłaby nietknięta przez twoją powłokę i działałaby dobrze.

$ sudo namei -lx foo/bar/baz
f: foo/bar/baz
drwxr-xr-x muru    muru    foo
drwx------ test    test    bar
drwxr-xr-x muru    muru    baz

$ sudo ls foo/bar/b*
ls: cannot access 'foo/bar/b*': No such file or directory

$ sudo -u test ls foo/bar/
baz
muru
źródło
dzięki Muru, twoja opinia była poprawna, zmieniłem pozwolenie na 755 i teraz działa dobrze.
Faisal
3
@Faisal: Myślę, że zmiana uprawnień nie jest właściwym lekarstwem, choć ujawnia, że ​​diagnoza jest prawidłowa. Wydaje się, że właściwym rozwiązaniem może być nie globowanie podczas przygotowywania polecenia sudo, ale raczej zniesienie go tutaj (przez zacytowanie argumentu ścieżki), przekazanie argumentu takim, jaki jest, do lspolecenia, które może wtedy (gdy zmiana tożsamości suzostała podjęta efekt) wykonaj globbing.
Marc van Leeuwen,
2
@MarcvanLeeuwen lsnie robi globalizacji.
muru
3
Możesz sprawić, że globbing będzie się odbywał w środowisku sudo, dodając sh -cdo wiersza poleceń.
Stig Hemmer
@Faisal, jeśli to odpowiada na twoje pytanie, rozważ zaakceptowanie go ...
clem steredenn
7

Możliwe, że masz wyłączone globbing.

Poszukaj czegoś takiego set -flub set -o noglobprzed tymi wierszami w skrypcie lub w interaktywnym uruchomieniu powłoki echo $-; jeśli jest fwyjście, globbing jest wyłączony:

$ echo $-
fhimBH

Aby to naprawić, usuń set -flub set -o noglobze skryptu lub w interaktywnym uruchomieniu powłoki set +flub set +o noglob:

$ set -f
$ echo $-
fhimBH
$ ls access*
ls: cannot access access*: No such file or directory
$ set +f
$ echo $-
himBH
$ ls access*
access
kos
źródło
Tak, ja jako mój indywidualny użytkownik nie mam dostępu do tej ścieżki. W skrypcie idę jako mój użytkownik (przez ssh) i uruchamiam to polecenie za pośrednictwem użytkownika produkcyjnego. Czy jest jakiś sposób na obejście tego? (Należy zauważyć, że nie muszę podawać hasła do zmiany użytkownika)
Faisal
@Faisal Co powiesz na uruchomienie skryptu jako użytkownik docelowy ( sudo -u abc /path/to/script)? W takim przypadku globowanie nie powinno zawieść. W każdym razie muru zasugerował problem ze ścieżką w swojej odpowiedzi, nie ja. Powinieneś rozważyć zaakceptowanie jego odpowiedzi ( askubuntu.com/help/accepted-answer ).
Kos
Właściwie uruchamiam to na zdalnym komputerze za pomocą skryptu, więc -i będzie potrzebne. Dziękuję również za odpowiedź.
Faisal