关于sudo的小问题

这两天一直在想办法共享上网。这其中有关键的一个环节就是在用iptables来作nat,Ubuntu默认是不转发的。所以就要先改/proc/sys/net/ipv4/ip_forward的内容,把它改成’1’。但是用echo ‘1’ > /proc/sys/net/ipv4/ip_forward也不行,用sudo echo ‘1’ > /proc/sys/net/ipv4/ip_forward,也不行。

所以,我怀疑我记错了/proc中的某些内容是可以直接更改的。就问了wangcong,也得到肯定的回答。但是,为什么不可以,就又和他讨论了一下。首先用root是可以实现echo ‘1’ > /proc/sys/net/ipv4/ip_forward的,就证明了,这个是可以修改的。用sudo的时候要么是sudo的问题,要么是shell的问题。实际上,就是sudo管不到’>’重定向所写的文件的权限,这次写文件还是普通权限,所以是不可以写root的文件的。用sudo sh -c ‘echo 1 > ip_forward’是可以的,证明问题就在’>’!

这是一个重定向,shell 把它之前的内容解释成为一个命令,sudo见都见不到它,也就管不着它的权限了。当然因为’>’的本来含义,这个特性是天经地义的。所以要用重定向来更改需要root权限才能更改的文件就比较麻烦了。

不过后来wangcong想起了一个命令──tee,可以用来完成这个工作:

echo ‘1’ | sudo tee /proc/sys/net/ipv4/ip_forward [>/dev/null]

就可以了。

总结一下流水帐:sudo只对一个命令起作用,如果用管道的话,管道后将丢失sudo提升的权限。 tee产生两个相同的输出,一个到标准输出,一个到指定文件,它可以把流进行分叉。

《关于sudo的小问题》有6条评论

  1. 昨天刚听完你的经验之谈今天就看到这篇文章了。呵呵,刚开始接触linux,慢慢觉得她还是很有意思的。。。

    回复

回复 chenw 取消回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据