使用 Ruby 与 FTP 进行对话

问题描述 投票:0回答:1

我想启动一个 FTP 进程,发出命令,检查特殊格式的响应字符串并捕获它们,然后根据捕获的字符串发出命令。

所以流程是:

  1. 启动ftp

  2. 回显欢迎文字

  3. 对于每个 ftp 子命令

    a) 发出子命令

    b) 回显子命令的响应

    c) 扫描响应中的模式并保存匹配以供稍后使用

  4. 对保存的模式执行计算

  5. 发出更多 ftp 命令

  6. 回应回应

这是我的脚本,它不读取 ftp 输出,并在尝试编写第一个 ftp 子命令后挂起:

require 'io/wait'
require 'open3'

# Define the commands to send to FTP
commands = [
  'ascii',
  'quote site filetype=jes',
  'put amblist.jcl',
  'dir'
]

user_id = 'mikes01'.downcase
program_command = "ftp ftp://#{user_id}:mypwd@bigiron"
Open3.popen2(program_command) do |stdin, stdout, wait_thread|
  Thread.new do
    stdout.each do |line|
      # I want to scan the line for a pattern but we never get here
      puts line
      stdout.flush
    end
  end

  commands.each do |command| # Issue command
    stdin.puts command
    # Hopefully the output resulting from the ftp command is captured in the above thread
  end
  # Do something with previously processed output before closing the FTP session
  stdin.close
  wait_thread.value # exit status
end
# Do more processing
ruby popen3
1个回答
0
投票

我原来的方法行不通,所以我听从了@Stefan 的建议,研究了 Ruby

Net::FTP
gem。我修改了 gem 以包含 Linux FTP 命令中存在的必要功能。我提出了拉取请求

拉取请求中的修改已针对 IBM z/OS Communications Server 进行了测试。以下代码片段使用 FTP 将批处理作业提交到主机,并收集结果。

def parse_job_number_from(line)
  tokens = line.split('JOB')
  raise StandardError, "Error: The string 'JOB' was not found in the FTP response." unless tokens.length == 2

  job_number = tokens[1].split.first
  job_number.sub(/^0+/, '') # Remove leading zeros
end
    
Net::FTP.open(@ip_or_domain) do |ftp|
  ftp.login @uid, @pwd
  ftp.quote 'site filetype=jes'
  job_info = ftp.puttextfile @local_jcl_filepath
  job_number = parse_job_number_from job_info
  ftp.gettextfile "J#{job_number}", @local_results_file
end
© www.soinside.com 2019 - 2024. All rights reserved.