问题描述
当使用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"