$ 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