有人能解释为什么带有通配符的 sudo ls 不起作用吗?

有人能解释为什么带有通配符的 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

有人能解释为什么会发生这种情况吗?由于这个原因,我被困在脚本中。

答案1

一种可能性是您没有权限访问该路径中的一个或多个目录 ( /sites/servers/server_instance/logs)。通配符扩展由您的 shell 执行,然后将扩展的路径传递给命令sudo

如果您的用户没有权限,则第一个命令中的扩展将不起作用。它将按原样运行(ls -ltr /sites/servers/server_instance/logs/access*),并且没有字面上名为的文件access*)。如果abc确实具有路径中所有目录所需的权限,则第二个命令(没有任何通配符)将不受您的 shell 的影响,并且它将正常工作。

$ 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

答案2

您可能已禁用通配符。

在脚本中查找类似set -f或的内容,或者在交互式 shell 运行 ;如果输出中有一个,则表示通配符被禁用:set -o noglobecho $-f

$ echo $-
fhimBH

要修复此问题,请从脚本中删除set -f或,或者在交互式 shell 中运行或:set -o noglobset +fset +o noglob

$ set -f
$ echo $-
fhimBH
$ ls access*
ls: cannot access access*: No such file or directory
$ set +f
$ echo $-
himBH
$ ls access*
access

相关内容