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

Fai*_*sal 18 command-line bash sudo wildcards

$ 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
Run Code Online (Sandbox Code Playgroud)

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

mur*_*uru 31

一种可能性是您无权访问该路径 ( /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
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过在命令行中添加 `sh -c` 来在 sudo 环境中进行通配。 (4认同)
  • @Faisal:我认为更改权限不是正确的补救措施,尽管它表明诊断是正确的。正确的补救措施似乎是在准备 sudo 命令时不进行 globbing,而是在此处抑制它(通过引用 path 参数),将参数按原样传递给 `ls` 命令,然后(当身份更改时)从 `su` 生效)做通配符。 (3认同)
  • @MarcvanLeeuwen `ls` 不做任何通配符。 (2认同)

kos*_*kos 7

您可能禁用了通配。

在脚本中的那些行之前查找类似set -fset -o noglob之前的内容,或者如果在交互式 shell 中运行echo $-;如果f输出中有一个,则禁用通配:

$ echo $-
fhimBH
Run Code Online (Sandbox Code Playgroud)

要解决该问题,请从脚本中删除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
Run Code Online (Sandbox Code Playgroud)