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)
您可能禁用了通配。
在脚本中的那些行之前查找类似set -f
或set -o noglob
之前的内容,或者如果在交互式 shell 中运行echo $-
;如果f
输出中有一个,则禁用通配:
$ echo $-
fhimBH
Run Code Online (Sandbox Code Playgroud)
要解决该问题,请从脚本中删除set -f
或set -o noglob
,或者如果在交互式 shell 中运行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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4519 次 |
最近记录: |