ruby ssh:交互式命令“su”:成功登录后如何进一步?

2024-02-28

我想在 SSH 会话中的远程计算机上工作:

  1. 登录远程服务器
  2. su
  3. 做我的工作

使用我的脚本 a 可以完成步骤 1 和 2 的工作。在执行 su 命令时,我可以发送密码,并得到了我期望的答案(

on_data: data = gis@v04ree:~>
got gis@v04ree:~>

但接下来我该怎么办呢?我坐在我的频道上,什么也没发生。 如何让通道了解命令已完成并且我想在远程计算机上完成工作?

require 'net/ssh'
require 'net/sftp'

class Connection
  def connect
host = 'host'
user = 'user'

#1. Login
Net::SSH.start(host, user) do |ssh|
  puts ssh.exec!("whoami")
  #2. su
  begin
    puts(su(ssh, "otherUser", "otherPwd"))
  rescue Exception => e
    puts e
  end
  #3. work
  puts "logged in as " << ssh.exec!("whoami")
  ssh.close
end
end

def su(ssh, user, pwd)
 channel = ssh.open_channel do |ch|
  channel.request_pty do |ch, success|
    raise "Could not obtain pty (i.e. an interactive ssh session)" if !success
  end

  command = "su - #{user}\n"
  puts "command = #{command}"
  channel.exec command do |ch, success|
    raise "could not execute command" unless success

    # "on_data" is called when the process writes something to stdout
    ch.on_data do |c, data|
      puts "on_data: data = "+data
      if data == "Password: "
        puts "Password request"
        channel.send_data "#{pwd}\n"
      end
      if data == "gis@v04ree:~> "
        #logged in as gis
        puts "got gis@v04ree:~>"
        #and now? What's next?
        #channel.eof! # <-doesn't work

        ch.exec "ls" do |ch, success| #<- doesn't work either: success is false
          unless success
            puts "alas! the command could not be invoked!"
          end
        end
      end
    end
    #wouldn't be called
    ch.on_extended_data do |c, type, data|
      puts "on_extended_data: data = #{data}"
    end
  end #end su - gis

  #which statement
  ssh.loop
  #channel.wait
end
end
end #class end

Connection.new.connect

问题是su正在创建一个子shell,并且net-ssh控制着最外层的外壳。就像跑步一样...emacs或来自net-ssh,你不能期望net-ssh能够知道如何控制那个内壳。

所以你要做的就是当你检测到su成功后,您必须像刚刚输入数据一样发送数据,然后才能读取标准输出。不幸的是,你无法将它们分开stdout来自stderr因为它在子 shell 中,但您仍然可以获得输出。

而不是使用ch.exec after su成功,使用ch.send_data "command\n"并读取输出。不要忘记用一个结束一切ch.send_data "exit\n"。 (注意\n必须遵循每个命令来模拟控制台中的输入按键)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ruby ssh:交互式命令“su”:成功登录后如何进一步? 的相关文章

  • ruby 中的树结构,父子采用数组格式,没有 gem?

    我有一个数组 其中包含这样的项目列表 arr id gt 1 title gt A parent id gt nil id gt 2 title gt B parent id gt nil id gt 3 title gt A1 paren
  • 如何在 Ruby 中使用循环输出所有可能的组合?

    我刚刚开始学习编程 并试图编写一个输出所有可能组合的函数 到目前为止 我已经能够找到尺寸 2 的所有可能组合 但我不确定如何使代码保持开放式以处理更大尺寸的组合 某种递归会有用吗 我知道我可以使用内置的组合方法 但我只是想弄清楚如何从头开始
  • 按顺序重载每个方法

    我有一个 erb 模板 它为 httpd conf 生成配置文件 重要的是 最后写入特定位置 它是包罗万象的 目前代码看起来像 cluster apps each do app Render config end 我想重载应用程序对象上的每
  • 将 PDF 转换为 JPG 时质量低

    我正在尝试使用 Imagemagic RMAgick 将 PDF 文档转换为图像 原始 PDF 也是从图像创建的 不是原生矢量 PDF image Magick Image from blob original pdf self forma
  • Ruby on Rails:simple_form + Twitter Bootstrap 未显示

    我正在为我的网站上的新用户创建一个简单的注册表单 我已经运行了 simple form bootstrap 的安装 rails g simple form install bootstrap 但是 它仍然没有显示并呈现为正常的 simple
  • Ruby Regex 舍入尾随零

    我正在寻找一个正则表达式来删除十进制数字中的尾随零 它应该返回以下结果 0 0002300 gt 0 00023 10 002300 gt 10 0023 100 0 gt 100 1000 gt 1000 0 0 gt 0 0 gt 0
  • 如何在 Rails 2.3.5 中从模型渲染部分

    我有一个 Rails 2 3 5 应用程序 我试图从模型中渲染几个部分 我知道 我知道 我不应该这样做 我这样做的原因是我将 Comet 服务器 APE 集成到我的 Rails 应用程序中 并且需要根据模型的事件 例如 after crea
  • Capybara 2.0 和 rspec-rails -- 助手在规范/功能中不起作用

    我正在尝试使用辅助模块中的方法 但 rspec 似乎无法识别辅助程序以进行测试spec features 请注意 唯一的更改是spec helper rb正在添加require capybara rspec 我尝试移动helper rb t
  • Ruby 单引号和双引号

    我最近一直在使用 Ruby 进行编码 并且之前使用过 Python 据我所知 单引号和双引号对代码的工作方式没有影响 我转向 Ruby 是为了了解它是如何工作的 并研究 Ruby 和 Python 之间的相似之处 我曾经使用过单引号字符串并
  • 在 Ruby 中生成 GUID

    我有一个问题 用 GUID 很容易解决 特别是 对于密码重置工作流程 我想将 GUID 令牌发送到用户的电子邮件并让他们使用该令牌重置密码 由于 GUID 是唯一的 因此这非常安全 并且可以避免我通过电子邮件向人们发送密码 这是有风险的 我
  • 从 Ruby 运行 shell 命令:在显示输出时捕获输出?

    我有个问题 我想从另一个 ruby 脚本运行一个 ruby 脚本并捕获它的输出信息 同时让它也输出到屏幕上 runner usr bin env ruby print Enter your password password gets ch
  • Heroku:无法通过 Bundler 安装 gem

    我尝试使用以下命令将我的 Rails 应用程序推送到 Herokugit push heroku master f命令 我得到这个 Total 0 delta 0 reused 0 delta 0 remote Compressing so
  • 尝试使用 Rails 和 PostgreSQL 生成模型时,命令挂起且没有错误

    使用该命令时 rails generate model Event name string 什么也没发生 我必须按 CTRL c 我使用的版本是 红宝石 2 1 1p76 导轨4 1 0 PostgreSQL 9 3 4 Mac OS X
  • 通过名称查找进程ID

    如何在 Ruby 中通过名称或完整命令行找到 pid 而不调用外部可执行文件 我正在将 SIGUSR2 发送到命令行包含的进程ruby job rb 我想在不打电话的情况下执行以下操作pgrep uid Process uid pid pg
  • 通过 SSH 的 Pygame 不注册击键(Raspberry Pi 3)

    所以我得到了 raspi 3 和简单的 8x8 LED 矩阵 在玩了一些之后 我决定用 pygame 的事件制作一个简单的蛇游戏 显示在该矩阵上 我之前没有 pygame 的经验 除了 LED 矩阵之外 没有连接任何屏幕 显示器 所以最初的
  • 验证 ActionCable 连接

    我发现了一个很棒的 ActionCable gem 它是 SPA 的一个很好的解决方案 我只想发送html css and js资产 所有其他连接将通过ActionCable 交换字符串或者整数并不难 但是如何通过ActionCable登录
  • 如何记录 ssh 调试信息?

    我需要将 ssh 调试信息的输出写入文件中 这 ssh v email protected cdn cgi l email protection gt result txt ssh v email protected cdn cgi l e
  • 如何将两个不同的哈希数组中的值添加在一起?

    我有两个哈希数组 哈希值的键不同 player scores1 first name gt Bruce score gt 43 time gt 50 first name gt Clark score gt 45 minutes gt 20
  • Ruby 未绑定方法:是否可以强制绑定到其他类的实例?

    我想知道我是否可以强迫这种情况发生 class A def bomb bomb end end class B end bomb A instance method bomb b B new bomb bind b 目前它抛出错误 Type
  • 获取块参数个数

    我需要获取给定块所采用的参数数量 例如 foobar 1 2 3 a b c def foobar x y z block need to obtain number of arguments in block which would be

随机推荐

  • STL自定义分配器来管理不同的内存空间

    我想使用 STL 自定义分配器类的不同实例来管理不同的内存空间 然后能够为 STL 容器指定分配器实例 以便每个容器仅从其分配的内存空间中提取 但我不知道如何才能做到这一点 我了解如何将分配器类型传递到 STL 容器的模板参数中 但我想要类
  • 何时在 Node js 中使用 eventEmitter?

    我正在学习 Node js 中的新概念 即事件 但我找不到应该在哪里使用它 我想要任何真实的场景 但我找不到任何关于此的文章或博客 var events require events var eventEmitter new events
  • Haskell 使用什么类型的范围?

    我试图弄清楚 Haskell 是否使用动态或静态作用域 我意识到 例如 如果您定义 let x 10 然后定义函数 let square x x x 您有 2 个不同的 x 这是否意味着它是动态作用域的 如果不是 它使用什么范围 为什么 另
  • 如何将 json 字符串数据类型列转换为 hive 中的映射数据类型列?

    我需要从所有行中获取所有唯一的键值 每行都有不同的键和值请找到上面的专栏图片 例如 一排看起来像 START TIME 1549002807568 PARSING QUERY FORMED 1549002807586 CUBES WITH
  • Angular 2 路由 - 隐藏 URL

    我知道你可以在路由时隐藏 URLthis router navigate Pages skipLocationChange true 但是当我使用window open Pages 它有网址 有没有办法在使用时隐藏URLwindow ope
  • jquery ajax 中 async:false 和 async:true 有什么区别?

    jquery ajax中有一个参数 ajax async true 将值设置为有什么区别true and false You set async to false 当您需要在浏览器传递给其他代码之前完成 ajax 请求时
  • Python 推送器 AWS Lambda

    使用 AWS Lambda 将推送通知发送到 Python 中的 Pusher 应用程序 当我将 Pusher 及其所有依赖项安装到一个目录并压缩到 Lambda 时 我运行了一个简单的测试并收到此错误 No module named nd
  • 运行jsp文件时类转换异常

    我正在尝试运行我的 jsp 文件之一 但遇到类转换异常 org apache catalina core DefaultInstanceManager 无法转换为 org apache tomcat InstanceManager 我已将所
  • protobuf 具有继承性?

    是否可以使用protobuf http code google com p protobuf 与继承的类 我想做这样的事情 class Expr class AddExpr Expr class CallFunc Expr class Fu
  • Ionic 3:使用蓝牙打印机打印图像

    我目前正在努力使用我们的 Ionic3 应用程序 我似乎不知道如何使用 BT 打印机和蓝牙串行插件打印图像 打印文字就好了 我们正在使用此文档测试 RPP02N BU 打印机 由我的前同事找到 驱动程序命令文档 https www spar
  • cmake 中“不允许源内构建”

    我是 cmake 的新手 我只用它在我的 ubuntu linux 上安装 opencv 这是我运行的命令 cmake DCMAKE BUILD TYPE Release DCMAKE INSTALL PREFIX home jinha O
  • 我的服务器端 PHP 在 reCaptcha 之后仍然遭到黑客攻击(数百封垃圾邮件)

    我之前在 StackOverflow 上提出的问题是 有人每隔几个小时向我发送数百封垃圾邮件 现在 我在服务器端修复了脚本 但第二天早上我仍然收到 30 封电子邮件之类的东西 我的托管公司给了我一个 FTP 的新密码 并将我的索引文件移动到
  • 在 ie8 浏览器中使用 jquery-2.0.3:对象不支持此属性或方法

    我用的是jquery 它在火狐浏览器中运行良好 但是当我用 ie8 打开它时出现同样的错误 对象不支持此属性或方法 834线 我禁用这一行并在这一行中发现相同的错误 836 3316 我制作示例代码并进行测试 它从不显示我的警报
  • 无法将本地 git 导入 Eclipse 来创建新项目(抛出错误“连接 Git 团队提供商失败”)

    我在本地计算机上创建了一个 git 存储库 git init git add TestGit java git commit m Start 然后我进入 Eclipse 并选择从该 Git 存储库导入并创建一个新项目 在向导步骤中 它识别出
  • .NET 控制台应用程序中的越南语字符 (UTF-8)

    我试图将 UTF 8 字符串 越南语 写入 C 控制台 但没有成功 我在 Windows 7 上运行 我尝试使用Encoding转换的类string to char to byte 然后到String 但是没有帮助 字符串是直接从数据库输入
  • XSL 转换删除 Xml 元素

    我很困惑 给定一个 xml 文档 例如
  • DBus.Error.AccessDenied:被拒绝。基于 TCP 的 DBUS

    With the help of the following Stackoverflow answers here https stackoverflow com a 13275973 1277793 and here https stac
  • ASP.NET MVC - Castle ActiveRecord - 显示 SQL 查询

    我正在使用 ASP NET MVC城堡活动记录 http www castleproject org activerecord index html作为我的持久层 我想知道是否可以显示在我的 MySQL 服务器上执行的 SQL 查询 我知道
  • JSF 2.0 编码

    要使 JSF 2 0 应用程序 在 Tomcat 6 上 使用 UTF 8 编码 需要哪些设置和注意事项 下面列出了关于该主题的两篇精彩文章 它们是由在这里布道的 balusC 编写的 关于UTF 8支持的一件事 http balusc b
  • ruby ssh:交互式命令“su”:成功登录后如何进一步?

    我想在 SSH 会话中的远程计算机上工作 登录远程服务器 su 做我的工作 使用我的脚本 a 可以完成步骤 1 和 2 的工作 在执行 su 命令时 我可以发送密码 并得到了我期望的答案 on data data gis v04ree gt