问题描述
|
在上一个问题中,我弄清楚了如何在多个服务器上启动经过密码验证的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