Errno::ENOTTY 通过 SuSe 上的 Net::SSH 连接到远程服务器时设备的 ioctl 不合适(使用 Ruby on Rails 5.2.4)

Posted

技术标签:

【中文标题】Errno::ENOTTY 通过 SuSe 上的 Net::SSH 连接到远程服务器时设备的 ioctl 不合适(使用 Ruby on Rails 5.2.4)【英文标题】:Errno::ENOTTY Inappropriate ioctl for device when connecting to a remote server through Net::SSH on SuSe (with Ruby on Rails 5.2.4) 【发布时间】:2021-11-01 12:06:07 【问题描述】:

我的 Ruby on Rails 应用程序远程启动远程 SuSe 服务器(SUSE Linux Enterprise Server 15 SP2)上的一些脚本。它依赖于在 Gemfile 中声明的 net-ssh gem:gem 'net-ssh'

脚本通过以下块远程触发:

    Net::SSH.start(remote_host, remote_user, password: remote_password) do |ssh|
      feed_back = ssh.exec!("#event.statement")
    end

只要 Rails 服务器在 Windows Server 2016(我的 DEV 环境)上运行,它就可以正常工作。但是当我部署到验证环境(即 SUSE Linux Enterprise Server 15 SP2)时,我收到以下错误消息:

Errno::ENOTTY in myController#myMethod 
Inappropriate ioctl for device

另一方面,通过命令行(从 SUSE 到 SUSE)发出 SSH 请求也可以正常工作。环顾四周,我没有找到 Net::SSH 模块的相关参数来解决这个问题。

欢迎您的建议!

【问题讨论】:

【参考方案1】:

我终于发现这个消息指的是 SSH 的操作模式:它需要一种终端仿真 - 所谓的pty - 包装到一个 SSH 通道中。

所以我是这样实现的:

Net::SSH.start(remote_host, remote_user, password: remote_password) do |session|
  session.open_channel do |channel|
    channel.request_pty do |ch, success|
      raise "Error requesting pty" unless success
      puts "------------ pty successfully obtained"
    end

    channel.exec "#@task.statement" do |ch, success|
      abort "could not execute command" unless success

      channel.on_data do |ch, data|
        puts "------------ got stdout: #data"
        @task.update_attribute(:return_value, data)
      end

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

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

    end
  end

  ### Wait until the session closes
  session.loop
end

这解决了我的问题。

注意: 上面提出的答案只是解决方案的一部分。此源代码在部署到生产服务器时再次出现相同的错误。

问题似乎是 SSH 目标的 密码:我重新输入了 手动,而不是从 MS Excel 和 SSH 连接进行通常的复制/粘贴现在成功了!

由于引发的错误不是简单的“连接被拒绝”,我怀疑密码字符串有特定的字符编码,或者意外的结束字符。

由于第一个提议的解决方案提供了一个工作示例,我将其留在那里。

【讨论】:

以上是关于Errno::ENOTTY 通过 SuSe 上的 Net::SSH 连接到远程服务器时设备的 ioctl 不合适(使用 Ruby on Rails 5.2.4)的主要内容,如果未能解决你的问题,请参考以下文章

SuSE 上的 Kubernetes:NodePort 服务问题

历史上的今天:PostgreSQL 发布;SUSE 收购 K8s 最大服务商;动视暴雪合并

SuSE常用命令

SUSE12通过救援模式修改ROOT密码

SUSE Linux文件系统在线扩容

suse 设置ftp服务器