2014-08-29 139 views
0

我有一個ruby腳本,我使用net/ssh將ssh插入服務器,sudo -s,su-user,運行腳本並回答該腳本的問題。到目前爲止,我可以做所有事情,登錄,執行所有su/sudo操作,運行腳本並回答問題,但我創建的渠道不會關閉並結束腳本。它全部運行,但在腳本運行後掛起。我究竟做錯了什麼?我是紅寶石小白,所以我不完全確定發生了什麼。謝謝你的幫助!Ruby net/ssh腳本不關閉

下面是我的本錢:

Net::SSH.start("server01", 'user') do |ssh| 
    ssh.open_channel do |channel| 
    channel.on_request "exit-status" do |channel, data| 
     $exit_status = data.read_long 
    end 

    channel.on_data do |channel, data| 
     data 
    end 

    channel.request_pty do |channel, data| 
     channel.send_data("sudo -s\n") 
     channel.send_data("su - user2\n") 
     sleep 0.5 

     channel.send_data("/opt/scripts/test\n") 
     sleep 10 

     channel.send_data("answer1\n") 
     sleep 5 

     channel.send_data("answer2\n") 
     sleep 5 

     channel.send_data("answer3\n") 
     sleep 10 
    end 

    channel.wait 
    puts "SUCCESS" if $exit_status == 0 
    end 
end 
+0

不確定它爲什麼不關閉,但爲什麼不'sudo -u user2 -H/opt/scripts/test'?應該保存一些命令。你有沒有嘗試發出exit命令關閉shell? – Doon 2014-08-29 22:05:51

回答

0

其實測試你需要發送exit\n否則你會掛起。

所以試下你的睡眠後,將它添加(你真的需要睡眠10?)

channel.send_data("answer3\n") 
sleep 10 
channel..send_data("exit\n") 

sudo -u user2 -H /opt/scripts/test將讓這個你只需要退出一個殼。因爲你的腳本就像它開始的3個炮彈一樣。 1,當你登錄並請求一個PTY時,一個當你運行root shell(sudo -s)時,然後當你su到user2時。

所以塊看起來像這樣。

channel.request_pty do |channel, data| 
    channel.send_data("sudo -u user2 -H /opt/scripts/test") 
    sleep 10 

    channel.send_data("answer1\n") 
    sleep 5 

    channel.send_data("answer2\n") 
    sleep 5 

    channel.send_data("answer3\n") 
    sleep 10 
    channel.send_data("exit\n") 

end 
+0

我會給它一個鏡頭。 -H不應該在那裏。我不知道爲什麼它在那裏。 – 2014-08-29 22:25:43

+0

-H將HOMEDIR設置爲用戶家中。你可能會也可能不需要它。 – Doon 2014-08-29 22:27:08

+0

這讓我朝着正確的方向前進。我不得不使用channel.exec來運行sudo -s。使用send_data,什麼也沒有發生,我也必須做兩次channel.send_data(「exit \ n」)。它運行並關閉了連接。 – 2014-08-31 11:28:43