我想根据this回答更改sudo会话超时。我可以编辑普通文件:
lineinfile:
path: /etc/sudoers
regexp: ^Defaults env_reset
line: Defaults env_reset,timestamp_timeout=60
但是在/etc/sudoers
写的# This file MUST be edited with the 'visudo' command as root.
的第一行:lineinfile
如何处理它?
的 P.S。
尽管简短的答案是肯定的,但必须阅读Konstantin Suvorov answer关于正确的方法,int random_fun(int n, int m)
{ int g;
n = n+m;
m=n/3;
g=n*m;
return g;
}
以及非常有趣的techraf answer关于这种方式可能存在的陷阱
答案 0 :(得分:13)
这种情况下有一个safenet选项:validate
。
要在复制到位之前运行的验证命令。要验证的文件的路径是通过'%s'传递的。必须如下例所示。该命令安全地传递,因此扩展和管道等shell功能无法正常工作。
如果您查看lineinfile模块的示例部分,您就会看到您需要的内容:
# Validate the sudoers file before saving
- lineinfile:
path: /etc/sudoers
state: present
regexp: '^%ADMIN ALL='
line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'
validate: '/usr/sbin/visudo -cf %s'
答案 1 :(得分:5)
如果您测试的语法是正确的,那就安全了。
鼓励visudo
的目的是阻止某人通过创建无效的/etc/sudoers
来阻止自己管理系统,无论是通过拼写错误还是思考。
当您使用Ansible执行编辑时,您可以测试执行该编辑的代码,以便在您推出之前使用您的实际配置文件,环境和sudo
版本做正确的事情。因此,人们对手写拼写错误或语法错误的担忧并不是立即相关的。
答案 2 :(得分:4)
虽然this answer正确定义了内容,this one可以缓解潜在问题,但让我们看一下您的代码。
您要求Ansible(可能)替换以下列方式定义的行:
regexp: ^Defaults env_reset
这显然是一种不好的做法,如果对Defaults
文件中的sudoers
以外的参数重复,则可能会导致严重问题。
通常Defaults
是配置参数,env_reset
是可能的值之一。
您不能假设实际配置文件将始终包含^Defaults env_reset
字符串。
如果设置了不同的值,则正则表达式将不匹配,并且您最终会添加以Defaults
开头的第二行。
因此,使用lineinfile
的正确方法是使用regexp
参数仅匹配配置参数,而不是其值。在你的情况下:
regexp: ^Defaults
line: Defaults env_reset,timestamp_timeout
另一个潜在的缺陷是sudoers
包含应按正确顺序编写的部分。如果您修改的文件不包含正则表达式指定的行,lineinfile
将在文件末尾添加一行新行,可能会被忽略,或导致错误(但应该发现通过验证),如果人类稍后查看该文件,很可能会造成混淆。因此,明智地指定insertafter
或insertbefore
。
答案 3 :(得分:1)
我认为你缺少的是为了编辑/etc/sudoers
你需要sudo-access。要在Ansible中执行此操作,您只需添加成为标志。
name: Change Sudo Timeout
become: yes
lineinfile:
path: /etc/sudoers
regexp: ^Defaults env_reset
line: Defaults env_reset,timestamp_timeout=60
答案 4 :(得分:0)
您可以将所需的设置放入cv::Mat rawImg = imread(imgName, CV_LOAD_IMAGE_GRAYSCALE);
目录,而不是直接编辑/etc/sudoers
,而不是:
/etc/sudoers.d