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


16
$ 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

谁能解释为什么会这样?因此,我被困在脚本上。

Answers:


29

一种可能是您无权访问该路径(/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

谢谢Muru,您的意见是正确的,我将许可更改为755,现在可以正常使用了。
Faisal

3
@Faisal:我认为更改权限不是正确的补救方法,尽管它表明诊断是正确的。适当的补救措施,似乎是在准备sudo命令不做通配符,但在这里,而不是压制它(引述路径参数),传递的参数作为,是对ls可随后(当身份的变化,从命令su采取效果)。
Marc van Leeuwen

2
@MarcvanLeeuwen ls没有做任何事。
muru

3
您可以通过添加sh -c到命令行在sudo环境中进行通配。
Stig Hemmer

@Faisal如果回答了您的问题,请考虑接受...
clem steredenn

7

您可能禁用了globbing。

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

$ echo $-
fhimBH

为了解决这个问题,删除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

是的,我作为个人用户无权访问该路径。在脚本中,我将以我的用户身份(通过ssh)并通过生产用户运行该命令。有什么解决办法吗?(需要指出的一点是,我不必为切换用户提供密码)
Faisal

@Faisal如何以目标用户(sudo -u abc /path/to/script)身份运行脚本?在这种情况下,遍历不应该失败。无论如何,muru在回答中建议了路径问题,而不是我。您应该考虑接受他的答案(askubuntu.com/help/accepted-answer)。
kos

实际上,我正在通过脚本在远程计算机上运行该脚本,因此需要-i。也感谢您的回答。
Faisal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.