任何人都可以解释为什么带通配符的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 

谁能解释为什么会这样? 由于这个原因,我被困在一个脚本上。

一种可能是您无权访问该路径中的一个或多个目录( /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 

您可能已禁用通配符。

在脚本中的那些行之前查找set -fset -o noglob类的东西,或者如果在交互式shell中运行echo $- ; 如果输出中有f ,则禁用globbing:

 $ echo $- fhimBH 

要解决此问题, set -o noglob从脚本中删除set -fset -o noglob ,或者如果在交互式shell中运行set +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