在Linux或者Unix上使用sudo命令时如何将文本追加到文件

时间:2020-01-09 10:43:47  来源:igfitidea点击:

我正在尝试使用sudo echo'192.168.1.254 router'>>/etc/hosts将条目添加到/etc/hosts文件,但是得到一个读为-bash:/etc/hosts:权限被拒绝的错误。
在Linux或者类似Unix的系统上运行sudo命令时,如何在文件中插入或者添加文本?
在Linux或者Unix上使用sudo命令时,有多种方法可以将文本或者数据追加到文件中。
您可以使用将输入选择为标准输出的tee命令。
另一种选择是将shell本身传递给sudo命令。
该页面包括在sudo和tee命令的帮助下追加到特权文件的示例。

如何在Linux或者类Unix系统上使用sudo将文本追加/插入文件?

让我们看看两种方法。

方法1:使用tee命令

tee命令从标准输入(例如键盘)读取并写入标准输出(例如屏幕)和文件。
语法为:

echo 'text' | sudo tee -a /path/to/file
echo '192.168.1.254 router' | sudo tee -a /etc/hosts

输出示例:

Password:
192.168.1.254   router

该解决方案很简单,您避免以root特权运行bash/sh shell。
仅追加或者写入部分需要root权限。

Bash:使用sudo和tee追加到文件

是否想在使用sudo时将文本追加到多个文件中?
尝试:

echo 'data' | sudo tee -a file1 file2 fil3

使用cat命令验证您刚刚以sudo身份追加到文件:

cat file1
cat file2

我们可以使用sudo追加到文件:

cat my_file.txt | sudo tee -a existing_file.txt > /dev/null

追加文本时,将tee输出重定向到/dev/null是一个好主意。
换句话说,当您不希望tee命令写入标准输出(例如screen)时,请使用>/dev/null

了解tee命令选项

  • -a或者--append:追加到给定的文件,请勿覆盖
  • -i或者--ignore-interrupts:忽略中断信号
  • -p:诊断写入非管道的错误

通过执行以下man命令来查看tee命令手册页

man tee

方法2:使用bash/sh shell

语法为:

sudo sh -c 'echo text >> /path/to/file'
sudo -- sh -c "echo 'text foo bar' >> /path/to/file"
sudo -- bash -c 'echo data >> /path/to/file'
sudo bash -c 'echo data text >> /path/to/file'

例如:

sudo sh -c 'echo "192.168.1.254 router" >> /etc/hosts'

您正在以root特权运行bash/sh shell,并且重定向在该shell会话中进行。
但是,引用复杂命令可能会成为问题。
因此,建议所有人使用tee方法。