使用 sudo -u 时如何转义路径中的通配符命令

使用 sudo -u 时如何转义路径中的通配符命令

我需要访问启用了根南瓜的 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 操作之后而不是之前扩展通配符。

相关内容