在bash脚本中我试图将带有echo的文本重定向到sudo非交互式文件。但我不清楚如何做到这一点。
我尝试使用此代码:
echo $sudopass| sudo -S echo "user ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible
答案 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