ruby – 如何SSH交互式会话

ruby – 如何SSH交互式会话,第1张

概述今天是个好日子 我需要在linux机器上执行命令这个命令是交互式的 命令. 交互式命令意味着需要输入,如[是,否]或密码 两次 我的真实案例是. 我创建了一个脚本执行命令并成功获取输出. 但是有些服务器的登录密码已过期,所以我需要与之交互 服务器发送当前密码的新密码(两次) ssh userName@10.0.0.243userName@10.0.0.243's password:You ar 今天是个好日子

我需要在linux机器上执行命令这个命令是交互式的
命令.
交互式命令意味着需要输入,如[是,否]或密码
两次

我的真实案例是.
我创建了一个脚本执行命令并成功获取输出.
但是有些服务器的登录密码已过期,所以我需要与之交互
服务器发送当前密码的新密码(两次)

ssh username@10.0.0.243username@10.0.0.243's password:You are required to change your password immediately (password aged)Last login: Sun Aug  7 13:15:40 2011 from 10.0.0.28WARNING: Your password has expired.You must change your password Now and login again!Changing password for user username.Changing password for username(current) UNIX password:New UNIX password:Retype new UNIX password:

笔记::

>我正在使用Ruby 1.9.2
>在正常情况下执行命令没问题
>请,我必须避免像(echo“pass”| ssh -S)这样的变通办法让我通过任何其他互动情况.
>我正在使用’net / ssh’libs
>脚本附于http://king-sabri.net/files/LinuxHWScanner.rb
>我试过“net / ssh / telnet”并没有帮助
>一些建议说使用’rake / remote_task’是解决方案,但我无法理解它在我的情况下是如何工作的

如果你需要更简单,这里有一个简单的代码,如果你让它工作,我会解决我以前的问题

require 'net/ssh'  host = "10.0.0.106"  port = 22     # SSH port  user = 'root'     # username  pass = "123123"   # passwordNet::SSH.start( host,user,:password => pass,:port=> port,:verbose => :error ) do |session| puts session.exec!("passwd root")end
解决方法 像这样的东西?

Net::SSH.start('10.0.0.6','not_root',:password => "test") do |ssh|   ssh.open_channel do |channel|      channel.on_request "exit-status" do |channel,data|        $exit_status = data.read_long      end      channel.exec("passwd") do |channel,success|        if success          channel.on_data do |channel,data|            # Don't really need this callback actually            puts "got data: #{data.inspect}"          end          # You don't need this line if you're root          channel.send_data("oldpass\n")          channel.send_data("newpass\n")          channel.send_data("newpass\n")        else           puts "Failed"        end      end      channel.wait      puts "SUCCESS" if $exit_status == 0   endend

这个是脏的,但是在过早的过期提示和passwd发布时都适用:

Net::SSH.start('localhost',:password => "test") 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|        puts data.inspect        if data.inspect.include? "current"                channel.send_data("oldpass\n");        elsif data.inspect.include? "new"                channel.send_data("newpass\n");        end     end     channel.request_pty     # This will just safely fail if we have already a password prompt on     channel.exec("passwd");     channel.wait     # Will reflect a valID status in both cases     puts $exit_status  endend
总结

以上是内存溢出为你收集整理的ruby – 如何SSH交互式会话全部内容,希望文章能够帮你解决ruby – 如何SSH交互式会话所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1273768.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存