![有人能解释为什么带有通配符的 sudo ls 不起作用吗?](https://linux22.com/image/880891/%E6%9C%89%E4%BA%BA%E8%83%BD%E8%A7%A3%E9%87%8A%E4%B8%BA%E4%BB%80%E4%B9%88%E5%B8%A6%E6%9C%89%E9%80%9A%E9%85%8D%E7%AC%A6%E7%9A%84%20sudo%20ls%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E5%90%97%EF%BC%9F.png)
$ 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 noglob
echo $-
f
$ echo $-
fhimBH
要修复此问题,请从脚本中删除set -f
或,或者在交互式 shell 中运行或: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