草庐IT

ruby net/ssh channel 死了吗?

coder 2024-06-10 原文

我试图将输入和处理分成两部分,以便不必指定提示(如 wait_for)。问题是收到命令但从未处理过。从 get_input 线程调用 channel 进程(它在 on_process 中打印 puts)但什么也没有发生。

(on_process 仅在调用 on_data 之后调用一次然后 channel 才处于事件状态?== true 在这一点上仍然)

ENV['PATH'] = 'H:\mydocu~1\usrbin\ansi140\x86;' + ENV['PATH']
`ansicon.exe -p`

require 'net/ssh'

hostname = "server"
username = "user"
password = "password"

@data = ''
@print = true
@cmd = ''

#clear the log
File.open('ssh_command.log', 'w') {|f| f.write('')}


get_input = Thread.new { 
      while true
        @cmd = nonblocking_stdin_gets
        exit if @cmd.strip == "Q"
        File.open('ssh_command.log', 'a+') { |f| f.write("{#{@cmd}}") } 
        if @cmd.rstrip != '' or @cmd =~ /\r?\n/
          puts "sending..."
          @print = false
          @openchannel.process
        end
      end 
    }

if RUBY_PLATFORM =~ /win32/
  require 'Win32API'
  $win32_console_kbhit = Win32API.new("msvcrt", "_kbhit", [], 'I')
  def console_input_ready?
    $win32_console_kbhit.call != 0
  end
  def nonblocking_stdin_gets
    sleep(0.1) until console_input_ready?
    $stdin.gets # don't bother to use getc, it also blocks until user hits <return>
  end
else
  def nonblocking_stdin_gets
    $stdin.gets # it just works, on unix
  end
end

@openchannel = nil

Net::SSH.start(hostname, username, :password => password) do |session|

  @openchannel = session.open_channel do |channel|

    channel.on_data do |ch, data|
      @data += data
    end 

    channel.on_extended_data do |ch, type, data|
      puts "got stderr: #{data}"
    end

    channel.on_request "exit-status" do |ch, data|
      puts "process terminated with exit status: #{data.read_long}"
    end

    channel.on_open_failed { |ch, code, desc| puts "err: #{desc}" }

    # must come before shell
    channel.request_pty :term => "xterm" do |ch, success|
      if success
        puts "pty successfully obtained"
      else
        puts "could not obtain pty"
      end
    end

    channel.send_channel_request "shell" do |ch, success|
      if success
        puts "user shell started successfully"
      else
        puts "could not start user shell"
      end
    end

    channel.on_eof do |ch|
      puts "remote end is done sending data"
    end

    channel.on_close do |ch|
      puts "channel is closing!"
    end

    channel.on_process do |ch|
      print @data if @print
      puts "command:#{@cmd}"
      if @cmd.rstrip != '' or @cmd =~ /\r?\n/
        #system("cls")
        channel.send_data(@cmd.rstrip + "\r\n")
        @cmd = ''
        @print = true
      else
        puts "no command"
      end 
    end

  end #channel_end
  session.loop 
end #session_end

最佳答案

所以我想通了,处理事件只有在接收到数据后才会运行,send_data 只会添加到数据队列

所以要确保流程事件运行多次... 添加这个

session.loop(0.1)

关于ruby net/ssh channel 死了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6942279/

有关ruby net/ssh channel 死了吗?的更多相关文章

  1. asp.net - IronRuby 死了吗? - 2

    我是.Net程序员,希望扩展并可能在我当前和future的Web应用程序中使用一些Ruby。看着IronRubyWebsite最后一次发布是将近一年前:2011年3月13日。否announcements从那时起就已经在他们的网站上制作了。考虑到所有这些,我想到了几个问题:IronRuby死了吗?如果该项目已终止,是否有任何替代方案集成到.Net中?如果它还活着,它仍然是一个积极维护的项目吗?我在哪里可以找到最新版本?我是不是找错了树?我是否应该将ruby​​保留为ruby​​,将.Net保留为.Net,这两个独立的实体永远不会在同一个项目中相遇?我在stackoverflow上看到过有

  2. .net - Linq2XSD 死了吗? - 2

    自alpha0.2以来,有人对此有任何更新吗?? 最佳答案 MicrosofthasnowreleasedLINQtoXSDasOpenSource以便社区可能会关心它。 关于.net-Linq2XSD死了吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/601073/

  3. c++ 动态 DLL 生命周期中的静态变量。或者他们为什么死了? - 2

    所以,我用一些全局静态变量(记录器)加载Dll。而且没有免费图书馆。在关闭应用程序时,我从dll调用方法,但全局静态变量已经被破坏。为什么??? 最佳答案 DLL中的静态变量会在DLL卸载时被销毁。如果没有明确的FreeLibrary调用使它更早发生,这将在进程退出时发生,在主EXE的静态变量被销毁之前发生。 关于c++动态DLL生命周期中的静态变量。或者他们为什么死了?,我们在StackOverflow上找到一个类似的问题: https://stackove

  4. ruby net/ssh channel 死了吗? - 2

    我试图将输入和处理分成两部分,以便不必指定提示(如wait_for)。问题是收到命令但从未处理过。从get_input线程调用channel进程(它在on_process中打印puts)但什么也没有发生。(on_process仅在调用on_data之后调用一次然后channel才处于事件状态?==true在这一点上仍然)ENV['PATH']='H:\mydocu~1\usrbin\ansi140\x86;'+ENV['PATH']`ansicon.exe-p`require'net/ssh'hostname="server"username="user"password="passw

  5. .net - BackgroundWorker:一旦 DoWork() 事件处理程序完成,它就死了吗? - 2

    我要说的是,一旦您使用DoWork()处理程序完成工作,然后可能执行RunWorkerCompleted(),您能否重新调用RunWorkerAsync()并让它重新进入DoWork()处理程序,还是您需要再做一次"new"操作并创建一个新的BackgroundWorker?只是想知道在这些事情发生之后是否进行了任何处理或其他清理,现在您不再有可行的bgworker。 最佳答案 您可以随心所欲地调用RunWorkerAsync。您不需要创建新的BackgroundWorker对象。唯一的限制是您不能在BackgroundWorker

  6. c# - moq项目死了吗?我投资学习它是否明智? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭7年前。Improvethisquestion我对mocking框架还很陌生,正试图决定哪一个是开始工作的好选择。我一直在看thisquestion关于最好的模拟框架,我看到很多人更喜欢最小起订量,但是当我看到最小起订量项目的changelist,我可以看到它已经快一年没有更新了。moq项目死了吗?如果是,那么今天开始使用哪个模拟框架比较好?

  7. javascript - 调试 "he' 死了,吉姆!”Chrome 中的错误 - 2

    我正在开发一个JS插件。添加几行代码后,在某些情况下我在Chrome中遇到崩溃,看到"he'sdead,Jim"message在我杀死页面之后。这意味着我已经用完了内存,这可能意味着无限循环之类的。我不需要JS方面的帮助,这不是我要问的。我想看到的是回溯。我去了~/.config/google-chrome/CrashReports/(我使用的是Ubuntu),但它是空的。我四处搜索并尝试在终端中使用locate但找不到任何相关内容(Google的疑难解答程序主要关注用户端体验,较少关注开发人员端,因此没有帮助)。我知道我可以使用断点和其他东西,但我也很想看到回溯,我也想知道调试这类崩

  8. javascript - Wordpress admin-ajax.php 在没有处理函数的情况下快死了 "0" - 2

    我正在尝试学习如何在Wordpress中以正确的方式处理AJAX请求。为此,我正在改编thistutorial创建一个super简单的AJAX请求,将帖子的ID(来自链接)放入我的页面内容中。逻辑当#our-worka链接被点击时[js]获取帖子ID(来自data-id属性)并将其存储为postID变量[js]通过AJAX传递postID(使用WP的admin-ajax.php文件)[js]example_ajax_request函数将获取ID并简单地回显它[php]如果成功,将服务器响应附加到#herodiv。我意识到这没有任何好处,但一旦我开始工作,我将修改函数以服务于真正的目的。

  9. php - mysqli_fetch_assoc 在第一行死了 - 2

    我在MySQL中有下表:╔══════╦════╗║...城市.....║...zip..║╠══════╬════╣║布拉格。║11000║║bool诺.....║34785║╚═══════════╝以下代码有效:ClassMysql{functionconnect(){$this->c=newmysqli($this->OPTION['dbhost'],$this->OPTION['dbuser'],$this->OPTION['dbpass'],$this->OPTION['dbname']);if($this->c->connect_errno){exit("Connectf

  10. java - OOoBeans 死了吗? - 我有什么选择? - 2

    最近我开始探索Officebean库,换句话说,我试图让一个简单的OOoBean示例运行。不幸的是,我什么都没做。首先,我尝试构建一个带有JPanel和内部bean的SwingJFrame,但窗口内没有显示任何内容。publicclassOpenOfficeGUIextendsJFrame{privateOOoBeanooBeanObj=null;privateOfficeConnectionooConnection=null;publicOpenOfficeGUI(){init();}privatevoidinit(){JPanelpanel=newJPanel();JButtonm

随机推荐