2

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

  1. 在远程服务器上登录
  2. 做我的工作

使用我的脚本,可以执行第 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
4

1 回答 1

2

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

所以你要做的是,当你检测su成功时,你必须像输入数据一样发送数据,然后你才能读取标准输出。不幸的是,您无法将其与子外壳分开stdoutstderr但您仍然可以获得输出。

成功ch.exec后使用,而不是使用并读取输出。不要忘记以. (请注意,必须遵循每个命令来模拟控制台中的回车键)such.send_data "command\n"ch.send_data "exit\n"\n

于 2011-03-18T23:24:21.630 回答