我需要访问启用了根南瓜的 NFS 文件服务器上的文件。我在 Arch Linux 上使用 bash。我正在使用这种类型的命令:
# sudo -u authduser ls /mounted/filesystem/path/aa.user.js
这成功了,输出是:
/mounted/filesystem/path/aa.user.js
但是,有多个文件,例如 bb.user.js。当我尝试以下命令时,它失败:
# sudo -u authduser ls /mounted/filesystem/path/*.user.js
输出是:
ls: 无法访问 '/mounted/filesystem/path/*.user.js': 没有这样的文件或目录
我尝试过引用、转义和其他各种方法,但都没有成功。正确的方法是什么?
答案1
通配符的问题在于它在运行sudo
命令之前由 shell 扩展。
如果只能authduser
列出 下的文件/mounted/filesystem/path/
,但不能列出运行该命令的用户sudo
,那么 shell 将无法扩展通配符,并且将不加修改地传递它。由于ls
它本身不扩展通配符,这将导致您看到的错误。
看为什么带有通配符的 sudo mv 操作不起作用?了解更多详情。
为了解决这个问题,您可以使用sudo
's-s
参数,它作为目标用户生成一个 shell(而不是简单地直接执行命令),在这种情况下,如果您还给它一个命令,它将传递给 shell使用-c
选项(这是 shell 解释和执行命令的常用选项,包括通配符扩展。)
在这种情况下,您需要将命令放在引号内(最好是单引号),以便运行该sudo
命令的 shell 不会尝试解释该命令,而只会解释sudo
作为目标用户生成的命令:
# sudo -u authduser -s 'ls /mounted/filesystem/path/*.user.js'
请参阅sudo 的手册页有关更多详细信息,请特别查看该-s
选项。
更新:这里实际上不可能使用sudo -s
命令。看“sudo -s ”在 shell 中运行命令,但通配符或元字符不起作用更多细节。
答案2
以下方法有效:
sudo -u authduser bash -c "ls /mounted/filesystem/path/*.user.js"
muru 是正确的,这个问题类似于为什么带有通配符的 sudo mv 操作不起作用?, 除了对面的root 没有权限,而普通用户有权限。该问题归结为操作的优先顺序,解决方案是在 sudo 操作之后而不是之前扩展通配符。