Errno::ENOTTY 在 SuSe 上通过 Net::SSH 连接到远程服务器时设备的 ioctl 不合适(Ruby 在 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)
我在 Rails 上的 Ruby 应用程序远程启动远程 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 上运行,它就可以按预期工作。但是当我部署到 SUSE Linux Enterprise Server 15 SP2 的验证环境时,我收到以下错误消息:
Errno::ENOTTY in myController#myMethod
Inappropriate ioctl for device
另一方面,通过命令行发出 SSH 请求 - 从 SUSE 到 SUSE - 也按预期工作。阅读周围我没有找到 Net::SSH 模块的相关参数来解决这个问题。
欢迎您提出建议!
我终于发现该消息指的是 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 目标的密码:我重新输入手动而不是通常的[=32] =] 来自 MS Excel,现在 SSH 连接成功了!
由于出现的错误不是简单的“连接被拒绝”,我怀疑密码字符串有特定的字符编码,或意外的结束字符。
由于第一个提议的解决方案提供了一个工作示例,我将其留在那里。
我在 Rails 上的 Ruby 应用程序远程启动远程 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 上运行,它就可以按预期工作。但是当我部署到 SUSE Linux Enterprise Server 15 SP2 的验证环境时,我收到以下错误消息:
Errno::ENOTTY in myController#myMethod
Inappropriate ioctl for device
另一方面,通过命令行发出 SSH 请求 - 从 SUSE 到 SUSE - 也按预期工作。阅读周围我没有找到 Net::SSH 模块的相关参数来解决这个问题。
欢迎您提出建议!
我终于发现该消息指的是 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 目标的密码:我重新输入手动而不是通常的[=32] =] 来自 MS Excel,现在 SSH 连接成功了!
由于出现的错误不是简单的“连接被拒绝”,我怀疑密码字符串有特定的字符编码,或意外的结束字符。
由于第一个提议的解决方案提供了一个工作示例,我将其留在那里。