我有一个小程序,我想确保它在写保护的文件和未写保护的文件上都可以使用。因此,代替使用echo $text > $file
or echo $text >> $file
,我不得不分别使用echo $text | sudo tee $file
和echo $text | sudo tee --append $file
。当我使用时sudo tee
,即使更改了权限,只要rm
在文件上使用它,它都会提示我:
$ ls
someFile writeProtectedFile
$ rm someFile
$ ls
writeProtectedFile
$ rm writeProtectedFile
rm remove write-protected regular file 'writeProtectedFile'? yes
$ ls
然后,我在网上闲逛,寻找可能解决我的困境的方法。我只能找到两种:不正确的权限或一组更改的权限。我知道权限的大小写是不正确的,因为我可以通过运行轻松更改权限sudo chmod xxx filename
,这将导致成功的权限更改。当时我以为文件属性存在问题,所以我lsattr
在该文件上运行,它的输出-------------e--
与目录中的每个其他文件相同。
我使用的原因是tee
回显文本以写入受保护的文件,但作为副作用,它也写入受保护的常规文件...实际上,我的目标是执行类似的操作sudo echo "whatever" >> /etc/someFile
,但该操作不起作用,因此我找到了解决方案在echo "whatever" | sudo tee /etc/someFile
。
当命令tee
传递不存在的文件作为参数时,该命令将在将输出写入文件之前创建该文件。通过在该命令前添加前缀sudo
,您要求外壳程序以方式运行该tee
命令root
。结果是由创建的文件由tee
启动命令:的用户拥有,root
因此对于其他用户是只读的。如果您运行ls -l
并查看user
和group
列,则可以自己查看。
$ rm -f writeProtectedFile # Removing the file in case it already exists
$ echo $text | sudo tee writeProtectedFile
yourtext
$ ls -l
total 4
-rw-r--r-- 1 root root 9 22.07.2015 14:26 writeProtectedFile
有几种方法可以克服此问题:
在要求tee
写入文件之前,以标准用户身份创建文件。tee
然后将截断或仅截断--append
它,而不会更改其所有权:
$ touch writeProtectedFile # creates the file as standard user
$ echo $text | sudo tee writeProtectedFile
$ rm writeProtectedFile
在尝试删除文件之前,请先更改其所有权:
$ echo $text | sudo tee writeProtectedFile
$ sudo chown $(whoami) writeProtectedFile # `whoami` returns the current user name
$ rm writeProtectedFile
使用以下命令告诉rm
忽略文件受写保护的事实-f, --force
:
$ echo $text | sudo tee writeProtectedFile
$ rm --force writeProtectedFile
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句