tput:在使用 Ruby Net:SSH 时没有指定 $TERM 的值并且没有指定 -T

Posted

技术标签:

【中文标题】tput:在使用 Ruby Net:SSH 时没有指定 $TERM 的值并且没有指定 -T【英文标题】:tput: No value for $TERM and no -T specified while using Ruby Net:SSH 【发布时间】:2021-07-31 21:10:55 【问题描述】:

我正在使用 Ruby Net:SSH 库与远程 PC 建立 ssh 连接,然后执行远程 cmd。 当我开始我的 SSH 连接时,我没有问题,但有时,不是在任何地方,当我使用 exec 时!我有一个错误返回到 stderr,它是“tput: No value for $TERM and no -T specified”。

代码示例:

Net::SSH.start(nodeAddress, nodeLogin, :password => nodePassword, :port => nodePort) do |ssh|
 ssh.exec! "cat \"#sftpSshKey\"" do |channel, stream, data|
  if(stream == :stderr)
   return "error tput"
  end
 end
end

如果有人有想法或已经有这个问题。

猫的例子工作正常,如果我使用这个我得到“tput”错误:

ssh.exec! "test -r \"#sftpSourceFile\" && echo \"Read\" || echo \"NRead\"" do |channel, stream, data|

如果我使用这个我没有错误:

ssh.exec! "test -w \"#nodeDestinationPath\" && echo \"Write\" || echo \"NWrite\"" do |channel, stream, data|

问候。

【问题讨论】:

当您使用 ssh 命令在另一个盒子上执行命令,并且该命令需要从控制台读取某些内容时,您必须提供“-t”开关。您的代码相当于这样做,所以您正在寻找的是 Net::SSH 等效于“-t”开关。 【参考方案1】:

来自 Net::SSH 源代码的This example 展示了如何使用通道执行交互式命令,然后读取命令的输出,并为命令提供输入。

      #   ssh.open_channel do |channel|
      #     channel.exec("/invoke/some/command") do |ch, success|
      #       abort "could not execute command" unless success
      #
      #       channel.on_data do |ch, data|
      #         puts "got stdout: #data"
      #         channel.send_data "something for stdin\n"
      #       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
      #
      #   ssh.loop

【讨论】:

以上是关于tput:在使用 Ruby Net:SSH 时没有指定 $TERM 的值并且没有指定 -T的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Ruby 进行动态端口转发

tput:Sublime Text3中没有指定$ TERM和no -T的值

ruby连接liunx后台返回/dev/sda分区大小

Linux命令之修改终端属性tput

SHELL脚本中 tput 的使用技巧 (tput 控制光标位置)

为啥 tput 中同时存在 setf/setb 和 setaf/setab?