Кто-нибудь может объяснить, почему sudo ls с подстановочным знаком не работает?
$ 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
Кто-нибудь может объяснить, почему это происходит? Я застрял в сценарии из-за этого.
2 ответа
Возможно, у вас нет прав доступа к одному или нескольким каталогам по этому пути (/sites/servers/server_instance/logs
). Расширение подстановочного знака выполняется вашей оболочкой, а затем расширенные пути передаются sudo
команда.
Если у вашего пользователя нет прав, расширение не будет работать в первой команде. Это будет работать как есть (ls -ltr /sites/servers/server_instance/logs/access*
), и нет файла с буквальным именем access*
). Если abc
имеет необходимые разрешения для всех каталогов в пути, вторая команда, которая не имеет подстановочных знаков, не будет затронута вашей оболочкой, и она будет работать нормально.
$ 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
Возможно, у вас отключена глобализация.
Искать что-то вроде set -f
или же set -o noglob
перед этими строками в скрипте, или если в интерактивной оболочке echo $-
; если есть f
на выходе отключена глобализация:
$ echo $-
fhimBH
Чтобы исправить это, удалите set -f
или же set -o noglob
из скрипта, или если в интерактивной оболочке запустить set +f
или же 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