我试图将输入和处理分成两部分,以便不必指定提示(如 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/
我是.Net程序员,希望扩展并可能在我当前和future的Web应用程序中使用一些Ruby。看着IronRubyWebsite最后一次发布是将近一年前:2011年3月13日。否announcements从那时起就已经在他们的网站上制作了。考虑到所有这些,我想到了几个问题:IronRuby死了吗?如果该项目已终止,是否有任何替代方案集成到.Net中?如果它还活着,它仍然是一个积极维护的项目吗?我在哪里可以找到最新版本?我是不是找错了树?我是否应该将ruby保留为ruby,将.Net保留为.Net,这两个独立的实体永远不会在同一个项目中相遇?我在stackoverflow上看到过有
自alpha0.2以来,有人对此有任何更新吗?? 最佳答案 MicrosofthasnowreleasedLINQtoXSDasOpenSource以便社区可能会关心它。 关于.net-Linq2XSD死了吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/601073/
所以,我用一些全局静态变量(记录器)加载Dll。而且没有免费图书馆。在关闭应用程序时,我从dll调用方法,但全局静态变量已经被破坏。为什么??? 最佳答案 DLL中的静态变量会在DLL卸载时被销毁。如果没有明确的FreeLibrary调用使它更早发生,这将在进程退出时发生,在主EXE的静态变量被销毁之前发生。 关于c++动态DLL生命周期中的静态变量。或者他们为什么死了?,我们在StackOverflow上找到一个类似的问题: https://stackove
我试图将输入和处理分成两部分,以便不必指定提示(如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
我要说的是,一旦您使用DoWork()处理程序完成工作,然后可能执行RunWorkerCompleted(),您能否重新调用RunWorkerAsync()并让它重新进入DoWork()处理程序,还是您需要再做一次"new"操作并创建一个新的BackgroundWorker?只是想知道在这些事情发生之后是否进行了任何处理或其他清理,现在您不再有可行的bgworker。 最佳答案 您可以随心所欲地调用RunWorkerAsync。您不需要创建新的BackgroundWorker对象。唯一的限制是您不能在BackgroundWorker
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭7年前。Improvethisquestion我对mocking框架还很陌生,正试图决定哪一个是开始工作的好选择。我一直在看thisquestion关于最好的模拟框架,我看到很多人更喜欢最小起订量,但是当我看到最小起订量项目的changelist,我可以看到它已经快一年没有更新了。moq项目死了吗?如果是,那么今天开始使用哪个模拟框架比较好?
我正在开发一个JS插件。添加几行代码后,在某些情况下我在Chrome中遇到崩溃,看到"he'sdead,Jim"message在我杀死页面之后。这意味着我已经用完了内存,这可能意味着无限循环之类的。我不需要JS方面的帮助,这不是我要问的。我想看到的是回溯。我去了~/.config/google-chrome/CrashReports/(我使用的是Ubuntu),但它是空的。我四处搜索并尝试在终端中使用locate但找不到任何相关内容(Google的疑难解答程序主要关注用户端体验,较少关注开发人员端,因此没有帮助)。我知道我可以使用断点和其他东西,但我也很想看到回溯,我也想知道调试这类崩
我正在尝试学习如何在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。我意识到这没有任何好处,但一旦我开始工作,我将修改函数以服务于真正的目的。
我在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
最近我开始探索Officebean库,换句话说,我试图让一个简单的OOoBean示例运行。不幸的是,我什么都没做。首先,我尝试构建一个带有JPanel和内部bean的SwingJFrame,但窗口内没有显示任何内容。publicclassOpenOfficeGUIextendsJFrame{privateOOoBeanooBeanObj=null;privateOfficeConnectionooConnection=null;publicOpenOfficeGUI(){init();}privatevoidinit(){JPanelpanel=newJPanel();JButtonm