2015-08-13 54 views
1

为了简化,请考虑食谱(食谱 - 测试)食谱中的以下块。在厨师资源块中运行sudo命令

79: bash 'Running sudo test sleep command' do 
80: user 'root' 
81: cwd '/tmp' 
82: code <<-EOH 
83: sudo sleep 1000 
84: EOH 
85: end 

运行此作为

“厨师客户端-o菜谱测试”

输出:

Mixlib::ShellOut::ShellCommandFailed 
------------------------------------ 
Expected process to exit with [0], but received '1' 
---- Begin output of "bash" "/tmp/chef-script20150813-3835-3kj758" ---- 
STDOUT: 
STDERR: sudo: sorry, you must have a tty to run sudo 
---- End output of "bash" "/tmp/chef-script20150813-3835-3kj758" ---- 
Ran "bash" "/tmp/chef-script20150813-3835-3kj758" returned 1 

我补充说: “须藤睡眠” 只是为了举例说明用例。在实际情况下,我们在上面的资源块中运行脚本,并且这些脚本具有sudo命令。

经过一些调试发现“bash”和“execute”资源块都没有tty分配来在它们内部运行命令。

请分享您的想法。

+0

检查你的sudoers配置文件(通常是/ etc/sudoers)并检查'Defaults'中是否有'requiretty'条目。如果是这样,你可以删除它,你的上面的例子可以工作。 –

+0

是的。检查了。是的,它确实提到了条目。 但不幸的是,删除这是不是一个选项截至目前。 – Ram

+0

寻找一种改变系统宽配置的方式。 – Ram

回答

1

事情是这样的:

你可以在厨师用它来运行sudo与分配的终端的任何设施也可以通过任何其他使用,这意味着requiretty指令在sudoers实际上没用。所以你不妨将它删除并且省去解决它的麻烦。

话虽如此,这里有一些方法来解决该问题:

  1. 您能sshlocalhost没有密码?你可以使用ssh -tt localhost sudo somecomand ...

  2. 您可以使用expect工具,该工具设计用于控制面向终端的程序。类似expect -c "spawn sudo somecommand; interact"

  3. 您可以使用screen,类似screen sudo somecommand