:w !sudo tee %

8 篇文章 0 订阅
在使用Ubuntu时,有时编辑文件,可能没有权限,但是忘记sudo了,
所以就想到是不是vi应该有编辑中提升权限的呀。
搜索了一下,果然有:

在vim中保存正在编辑的文件而不需要必要的权限。

(Save a file you edited in vim without the needed permissions)

下面我们就分析下这条命令是怎样做到保存文件而不需要必要的权限的

:w !sudo tee %

man vim就会发现

百分号(“%”)代表当前文件名

根据man vim的提示:

:[range]w[rite] !{cmd}  Execute {cmd} with [range] lines as standard input
(note the space in front of the ‘!’).  {cmd} is
executed like with “:!{cmd}”, any ‘!’ is replaced with
the previous command
“:w !sudo tee %”这条命令的含义是把当前编辑的文件的内容当做标准输入输入到命令sudo tee 文件名里去
也就是sudo保存为当前文件名
这个功能其实可能debian和ubuntu的用户更需要一些

今天刘洋同学问到一个问题,为什么sudo下面的命令还是无权限

$sudo echo ‘1′ > ip_forward
bash: ip_forward: Permission denied

而以root身份就可以?

# echo ‘1′ > ip_forward

一开始没有看出原因来,后来仔细一琢磨,其实原因很简单,
shell对‘>’解释干扰了对这个命令含义的判断。
我们本想应该是这样的意思:让sudo执行后面的这些“echo ‘1′ > ip_forward”,
而实际上是:sudo echo ‘1′ ,执行到这里,
shell再把它的执行结果重定向到ip_forward里去!
当然是无权限,因为流本身不会随echo那样被sudo“感染”上suid权限!


解决方法是什么?也很简单,就让后面那一串东西搁一起执行:

$sudo sh -c ‘echo 1 > ip_forward’

等等,还有没有更好的解决方法?
有!刘洋同学认真思考了一下,
觉得应该有这么个东西XX: echo ‘1′ | sudo XX ip_forward。
我擦亮眼睛一看,我靠,这不就是tee(1)么!!
没错,另一种解决方法就是:

$echo ‘1′ | sudo tee ip_forward

或者:

$echo ‘1′ | sudo tee ip_forward | cat > /dev/null

刘洋问tee(1)是不是和tea有关系?
不是!
tee其实取自大写字母T的发音,而T不正是最后一个命令中流的流向么?!
多么形象的名字啊!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值