bash脚本:sudo没有交互式echo重定向到文件

时间:2017-06-28 14:46:40

标签: bash sudo

在bash脚本中我试图将带有echo的文本重定向到sudo非交互式文件。但我不清楚如何做到这一点。

我尝试使用此代码:

echo $sudopass| sudo -S echo "user ALL=(ALL) NOPASSWD:ALL" >     /etc/sudoers.d/ansible

1 个答案:

答案 0 :(得分:1)

输出重定向不受提升sudo权限的影响。您sudo的部分是echo不是该命令输出的重定向。

在您当前用户的许可下仍会发生这种情况。

因此,您需要一种方法将一行添加到不涉及输出重定向的文件中。

注意: 如果目标文件为空或不存在,此答案的早期版本会将sed删除为sed个。因为我想保持答案的要点 - “如何避免输出重定向” - 我添加了有关如何使用vi用于相同目的的说明。

每个符合POSIX标准的系统都需要vi / ex编辑器。 (在当代Linux机器上通常是以兼容模式启动Vim的链接。)您可以通过命令行“远程控制”ex / vi / Vim:

vi -es -c "normal! G" -c "normal! ouser ALL=(ALL) NOPASSWD:ALL" -c "x" /etc/sudoers.d/ansible

(为清楚起见,这里没有sudo部分。)

说明:

  • -e以“ex模式”启动vi。 (相当于调用ex。)
  • -s表示“无声” - 没有提示,没有留言。
  • -c将命令传递给编辑器,以便在读取第一个文件后执行。
  • "normal! G"首先将编辑器置于“正常模式” - 如果您以交互方式启动vi,就会发现自己处于这种状态。默认情况下ex处于“命令模式”(就像您在vi中输入:一样)。 G将光标移动到最后一行。
  • "normal! o..."再次激活正常模式,在当前行之后添加一行,并激活“插入模式”。字符串的其余部分是逐字输入的。
  • "x"保存文件并退出编辑器。

命令行包括sudo部分:

echo $sudopass | sudo -S vi -es -c "normal! G" -c "normal! ouser ALL=(ALL) NOPASSWD:ALL" -c "x" /etc/sudoers.d/ansible