簡體   English   中英

在使用ruby和Net :: SSH的第一個命令之前響應SSH提示符

[英]Respond to a SSH prompt before first command with ruby and 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調用是否send_data 嘗試在send_data調用周圍構造一個channel.on_data塊,以便您可以在發送響應之前驗證是否從服務器獲得了預期的提示。

您可能不想在這里使用exec 從Net :: SSH :: Connection :: Channel的文檔中:

發送通道請求,要求調用給定命令。

您要發送文本字符串來答復提示,而不是調用命令。 文檔顯示exec用於發送完整的CLI命令,例如“ ls -l / home”。

相反, send_data可能正是您想要的。 文檔顯示它用於發送任意文本,例如channel.send_data("the password\\n") 但是請注意,文檔中的這一句話:

請注意,它不會立即通過通道發送數據,而只是將給定數據附加到通道的輸出緩沖區,為打包和在下次連接接受數據時發送出去做准備。

您可能需要看一下channel.request_pty 它似乎旨在與基於控制台的應用程序進行交互。

如果您試圖(本質上)編寫通常會手動執行的SSH會話腳本,則可能會發現使用類似於expect的界面更容易(例如,像sshExpect這樣的gem值得嘗試)。

謝謝大家的指點。 我已經能夠解決這個問題了–除了使用channel.request_pty外,還必須請求一個shell。 以下內容終於可以按預期工作:

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

我不熟悉該庫,但是在SSH上,您可以打開多個通道。 也許服務器只響應第一個默認通道,如果打開另一個默認通道,則會得到一個新的外殼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM