[英]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.