如何解决使用ruby gem net-ssh-multi可一次在多个服务器上执行sudo命令
| 在上一个问题中,我弄清楚了如何在多个服务器上启动经过密码验证的ssh会话以运行单个命令。现在,我需要能够执行\“ sudo \”命令。问题是,net-ssh-multi没有分配伪终端(pty),而sudo需要运行该伪终端,从而导致以下错误: [127.0.0.1:stderr] sudo:抱歉,您必须具有tty才能运行sudo 根据文档,伪终端可以通过对通道对象的方法调用来分配,但是,以下代码不起作用:上面会产生\“ no tty \”错误:require \'net/ssh\'
require \'net/ssh/multi\'
Net::SSH::Multi.start do |session|
# define the servers we want to use
my_ticket.servers.each do |session_server|
session.use session_server,:user => user_name,\\
:password => user_pass
end
# execute commands on all servers
session.exec \'sudo ls /root\' do |channel,stream,data|
if data =~ /^\\[sudo\\] password for user:/
channel.request_pty # <- problem must be here.
channel.send_data user_pass
end
end
# run the aggregated event loop
session.loop
end
$ ruby --version
红宝石1.8.7(2008-08-11补丁程序级别72)[i386-cygwin]
解决方法
你可以尝试这样的事情:
channel.request_pty do |c,success|
if success
command = \"sudo YOUR_COMMAND\"
c.exec(command) do |c,success|
# Some processing
end
end
end
在这种情况下,'sudo \'位于其中。
, 您需要在运行命令之前请求pty。
session.open_channel do |ch|
ch.request_pty
ch.exec \"sudo ls /root\"
end
您也可以从/ etc / sudoers中删除tty请求。为此,运行visudo
并注释Defaults requiretty
, 感谢@Christian和这个奇妙的Pastie,这就是我最后要做的事情:
Net::SSH::Multi.start do |session|
# define the servers we want to use
my_ticket.servers.each do |session_server|
session.use session_server,:user => my_ticket.user_name,\\
:password => my_ticket.user_pass
end
session.open_channel do |channel|
channel.request_pty do |c,success|
raise \"could not request pty\" unless success
channel.exec \"sudo YOUR_COMMAND\"
channel.on_data do |c_,data|
if data = /\\[sudo\\]/
channel.send_data(@password + \"\\n\")
end
puts data
end
end
end
# run the aggregated event loop
session.loop
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。