响应一个SSH提示红宝石和Net第一命令之前:: SSH
题
我试图连接,使用的Net :: SSH,到服务器后立即 登录执行需要根据用户输入的脚本。用户必须输入“1”或“2”,并且将通过在事后终端接收一些数据。
我的问题是,虽然我能够连接,我不能想出一个办法来发送“1个\ n”来的服务器并接收输出。
下面的代码停止在 “INFO - net.ssh.connection.session [80906b74]:channel_open_confirmation:0 0 0 32768”
使用channel.exec( “1个\ n”)而不是channel.send_data勿庸置疑也不起作用。
Net::SSH.start('host', 'user', :password => "pass", :auth_methods => ["password"], :verbose => :debug) do |session|
session.open_channel do |channel|
channel.on_data do |ch, data|
STDOUT.print data
end
channel.send_data( "1\n")
end
session.loop
end
任何想法,任何人?
在预先感谢
解决方案
你能确认你的send_data
通话的你从远程服务器的提示后发生的?尝试构建在你channel.on_data
呼叫send_data
块,这样你可以验证你从服务器得到预期的提示你发送一个响应之前。
您可能不希望在这里使用exec
是。从文档的净:: SSH ::连接::频道:
发送一个信道请求,要求该 给定的命令被调用。
您是想发送文本串回复提示,而不是调用命令。该文档显示正在使用exec
发送完整的如“ls -l /家”。
相反,send_data
可能是你想要的东西。该文档显示它使用任意的文本发送诸如channel.send_data("the password\n")
。然而,注意,这句话在文档:
请注意,它并不会立即发送 跨越信道的数据,但是 而不仅仅是追加给定的数据 到通道的输出缓冲器, 以准备被包装起来, 下一次发出的连接 在接受数据。
您可能想看看的 channel.request_pty
。这似乎是设计用于与基于控制台的应用程序的交互。
如果你想(实质)脚本的SSH会话,你通常会做手工,你可能会发现它更容易使用的expect
类似的界面(例如,像的 sshExpect 可能是值得一试)。
其他提示
感谢大家的指针。我已经能够把我的手指上的问题 - 除了使用channel.request_pty但也有必要请求外壳。以下最后按预期方式工作:
Net::SSH.start('host', 'user', :password => "pass", :auth_methods => ["password"]) do |session|
session.open_channel do |channel|
channel.request_pty do |ch, success|
raise "Error requesting pty" unless success
ch.send_channel_request("shell") do |ch, success|
raise "Error opening shell" unless success
end
end
channel.on_data do |ch, data|
STDOUT.print data
end
channel.on_extended_data do |ch, type, data|
STDOUT.print "Error: #{data}\n"
end
channel.send_data( "1\n" )
session.loop
end
end
我并不十分熟悉的Net :: SSH库,所以我不能与每本身帮助,但它听起来就像你可以达到你想要使用的 Capistrano的的东西。
例如我有其连接到远程服务器的任务Capistrano的,运行它期望输入,然后继续命令。 Capistrano的取远程I / O的护理。也许这可能是你的解决方案?
希望它能帮助!
如果我在shell执行"1\n"
我得到的回复是:bash: 1: command not found
如果我执行echo "1"
我得到:1
您确定要尝试执行要发送的文本?也许你正在寻找类似:
output = ""
Net::SSH.start('host', 'user', :password => "pass") do |ssh|
output = ssh.exec! "echo 1"
end
puts output
我不精通与LIB,但SSH可以同时打开多个通道。也许服务器只响应第一个默认通道,如果你打开另外一个,你得到一个新的外壳。