![脚本中无需密码的 sudo](https://linux22.com/image/549755/%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%97%A0%E9%9C%80%E5%AF%86%E7%A0%81%E7%9A%84%20sudo.png)
我有无密码访问到服务器。我的用户帐户已添加sudoers申请禁止密码/etc/init.d/ 中某些服务/守护进程的使用。
我想写一篇脚本根据一些测试结果启动或停止守护进程。我已设置 cron 在特定时间运行此脚本。但它返回错误“sudo:没有 tty 存在且没有指定 askpass 程序”。
我可以在终端中使用“sudo /etc/init.d/service name start/stop”而无需密码。我没有 root 密码。
我仔细检查了 /etc/sudoers 文件。没有“requiretty”。我使用的是 Ubuntu-10.04,2.6.32-24-generic。
以下是 sudoers 中的活动行:
Defaults env_reset
root ALL=(ALL) ALL
bijo ALL=NOPASSWD: /etc/init.d/apache2
%sudo ALL=(ALL) ALL
%admin ALL=(ALL) ALL
答案1
如果您以与没有密码访问权限的用户相同的用户身份运行该脚本,那么它应该可以正常工作,我会确保该脚本以正确的用户身份运行,我还会通过以正确的用户身份手动调用该脚本来测试该脚本。
你可能还需要检查 sudoers 文件中是否存在以下行,或者是否有另一行表明你的用户不需要 TTY
Defaults requiretty
如果该行存在,您可以将其注释掉(这不是一个好主意),最好添加以下内容
Defaults:<USERNAME> !requiretty
其中 USERNAME 是您的用户
答案2
我认为你需要使用ssh -t
答案3
该投诉消息来自要求输入密码的代码部分,因此投诉是因为没有 tty,它无法禁用回显。您可以通过visiblepw
在 sudoers 中设置选项来证明您处于此代码路径中,这将避免该警告并让您看到密码提示。
所以归根结底,控制出了问题NOPASSWD:
。
当匹配多个规则时sudoers
,最后的使用匹配,而不是最具体的匹配。因此用户bijo
处于 %sudo 或 %admin 中;因此NOPASSWD:
不应用控制。
在将自己添加到其中一个组后,在注销/登录之前,您是否在命令行进行过测试?
答案4
Defaults !requiretty
在文件底部添加一行。这将明确关闭所有内容的 requiretty。