Ruby SFTP客户端开发:如何独立执行mkdir与rmdir命令
Ruby SFTP客户端:实现参数对应单一操作的解决方案
当前编写的SFTP客户端存在逻辑问题:传入--mkdir参数时会同时执行目录删除操作,传入--rmdir时会同时执行目录创建操作,不符合"传入对应参数仅执行相应命令"的需求。
核心问题分析
原代码的connect方法被错误定义在parse方法内部,且未对参数是否存在做判断,直接无条件执行mkdir和rmdir操作,导致无论传入哪个参数,两个操作都会触发。
解决方案
- 调整方法作用域:将
connect方法移到类的顶层,与parse、run方法同级,避免嵌套定义导致的作用域问题。 - 添加条件判断:在
connect方法中,仅当对应参数存在时,才执行相应的SFTP操作。 - 补充参数校验:确保至少传入
--mkdir或--rmdir中的一个,避免无意义的连接操作。
修改后的完整代码
require 'net/sftp' require 'ostruct' require 'optparse' require 'colorize' # 若未安装colorize gem,可移除.red/.bold调用 class Sftp def parse(arguments) ARGV << "-h" if ARGV.empty? @options = OpenStruct.new args = OptionParser.new do |parser| parser.banner = "Usage: #{__FILE__} [options]" parser.on("--host HOST", String, "SFTP server host") do |host| @options.host = host end parser.on("--username USERNAME", String, "SFTP username") do |username| @options.username = username end parser.on("--password PASSWORD", String, "SFTP password") do |password| @options.password = password end parser.on("--port=PORT", Integer, "SFTP port (default: 22)") do |port| @options.port = port end parser.on("--mkdir=DIR", String, "Directory to create") do |mkdir| @options.mkdir = mkdir end parser.on("--rmdir=DIR", String, "Directory to remove") do |rmdir| @options.rmdir = rmdir end parser.on("-h", "--help", "Show help and exit") do puts parser exit end end begin args.parse!(arguments) # 校验至少传入一个操作参数 unless @options.mkdir || @options.rmdir puts "[!] ".red + "Must specify either --mkdir or --rmdir".bold exit end rescue OptionParser::MissingArgument => error puts "[!] ".red + error.message.bold exit rescue OptionParser::InvalidOption => error puts "[!] ".red + error.message.bold exit end end def connect # 设置默认端口为22 port = @options.port || 22 Net::SFTP.start(@options.host, @options.username, password: @options.password, port: port) do |sftp| if @options.mkdir sftp.mkdir(@options.mkdir) puts "Created Directory: #{@options.mkdir}" end if @options.rmdir sftp.rmdir(@options.rmdir) puts "Deleted Directory: #{@options.rmdir}" end end end def run(arguments) parse(arguments) connect end end sftp = Sftp.new sftp.run(ARGV)
关键修改点说明
- 条件执行操作:在
connect方法中使用if @options.mkdir和if @options.rmdir判断,仅当参数存在时才执行对应操作。 - 修复方法嵌套:将
connect方法移到类的顶层,确保run方法可以正常调用它。 - 默认端口设置:添加了端口默认值22,避免未指定端口时出错。
- 操作参数校验:在
parse方法末尾添加校验,确保用户至少指定一个操作,避免无意义的连接。
使用示例
- 创建目录:
ruby sftp_client.rb --host example.com --username user --password pass --mkdir /path/to/new/dir - 删除目录:
ruby sftp_client.rb --host example.com --username user --password pass --rmdir /path/to/delete/dir - 同时创建和删除(可选支持):
ruby sftp_client.rb --host example.com --username user --password pass --mkdir /new/dir --rmdir /old/dir
内容的提问来源于stack exchange,提问作者user19873675
相关产品推荐
相关产品推荐

