当前位置: 首页>>技术问答>>正文


当使用sudo重定向时,我得到’permission denied’

, ,

问题描述

当使用sudo允许编辑文件时,我经常获得’permission denied’。

例如,我的鼠标是紧张不安的,所以我想禁用轮询:

sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf

系统提示输入密码,然后获得:

bash: /etc/modprobe.d/local.conf: Permission denied

所以我试图做一个临时的更改来禁用轮询使用:

sudo echo N> /sys/module/drm_kms_helper/parameters/poll

该系统再次回应:

bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied

有任何想法吗?

最佳解决方案

输出重定向(通过>操作符)由shell完成,而不是由echo完成。您必须以root身份登录

sudo -i

然后你可以使用重定向

echo N> /sys/module/drm_kms_helper/parameters/poll

否则,您可以使用sudo运行bash字符串

sudo bash -c "echo N> /sys/module/drm_kms_helper/parameters/poll"

次佳解决方案

输出重定向由调用该命令的shell完成。所以,把所有东西都打碎,这里发生了什么*:

  • shell调用sudo echo "options drm_kms_helper poll=N",它使用echo "options drm_kms_helper poll=N"命令行执行sudo命令

  • sudo要求输入密码,打开超级用户shell并调用echo "options drm_kms_helper poll=N",该echo "options drm_kms_helper poll=N"运行echo命令并将其传递给"options drm_kms_helper poll=N"

  • echo,以root权限运行,将字符串打印到其标准输出。

  • echo命令终止,超级用户shell退出,sudo终止

  • 从中调用该命令的shell会收集输出并尝试将其重定向到只能由root写入的/etc/modprobe.d/local.conf。它会得到”permission denied”错误。

有关解决此问题的方法,请参阅@shantanu答案。


(*) – 虽然上面的顺序有助于理解命令失败的原因,但实际上事情发生在某种程度上out-of-order:原始shell注意到重定向并尝试在调用sudo ...命令之前打开要写入的文件。当打开文件失败时,shell甚至不会调用应该写入该文件的命令(感谢@PanosRontogiannis指出了这一点)。

这是一个快速测试:

$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied

在上面的测试中,whoami | tee who.txt将创建一个名为who.txt的文件,其中包含单词”root”。但是,当调用shell中的输出重定向失败时,”who.txt”文件也会丢失,因为该命令未被调用。

第三种解决方案

添加到Shantanu的答案:

…或者你可以使用这样的tee命令:

sudo tee /sys/module/drm_kms_helper/parameters/poll <<<10

或者如果它的一个命令的输出:

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll

第四种方案

我没有在这里提到过的一种方法是简单地在自己的shell中执行整个命令行。 sudo联机手册本身给出了这种方法的一个例子:

To make a usage listing of the directories in the /home partition. Note that this runs the commands in a sub-shell to make the cd and file redirection work.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/535.html,未经允许,请勿转载。