Кто-нибудь может объяснить, почему 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
Другие вопросы по тегам