我想启动一个 FTP 进程,发出命令,检查特殊格式的响应字符串并捕获它们,然后根据捕获的字符串发出命令。
所以流程是:
启动ftp
回显欢迎文字
对于每个 ftp 子命令
a) 发出子命令
b) 回显子命令的响应
c) 扫描响应中的模式并保存匹配以供稍后使用
对保存的模式执行计算
发出更多 ftp 命令
回应回应
这是我的脚本,它不读取 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
我原来的方法行不通,所以我听从了@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