You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby SFTP客户端开发:如何独立执行mkdir与rmdir命令

Ruby SFTP客户端:实现参数对应单一操作的解决方案

当前编写的SFTP客户端存在逻辑问题:传入--mkdir参数时会同时执行目录删除操作,传入--rmdir时会同时执行目录创建操作,不符合"传入对应参数仅执行相应命令"的需求。

核心问题分析

原代码的connect方法被错误定义在parse方法内部,且未对参数是否存在做判断,直接无条件执行mkdir和rmdir操作,导致无论传入哪个参数,两个操作都会触发。

解决方案

  1. 调整方法作用域:将connect方法移到类的顶层,与parse、run方法同级,避免嵌套定义导致的作用域问题。
  2. 添加条件判断:在connect方法中,仅当对应参数存在时,才执行相应的SFTP操作。
  3. 补充参数校验:确保至少传入--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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:45:46