java - 使用 ssh-net 的 ruby​​ 脚本中的文件路径问题

标签 java ruby-on-rails ruby bash scripting

我目前正在编写一个 ruby​​ 脚本,以允许我将 .war 文件上传到 VPC。要更新云中的 java 服务,我只需在本地使用 maven 进行构建,并将 VPC 中的 .war 文件替换为我通过构建创建的文件。我的问题在于我的脚本中的文件路径。似乎即使尝试运行简单的 bash 命令(例如“mv”或“rm”),我也会遇到以下错误 -

mv: missing destination file operand after `/tmp/asset-manager-service-1.0.2-SNAPSHOT.war'
Try `mv --help' for more information.
bash: line 1: /srv/asset-manager-service/war/: Is a directory

我想这可能是因为我在第二个 mv 目录之前有一个变量?当我尝试使用“rm”时也会出现同样的错误。我是 ruby​​ 新手,所以这可能不太漂亮,但这里是一些有问题的代码。

#handles the old war file and pushes up the new one.
  def handle_war(value)
    war_file_name = File.basename("#$warfile")
    local_war_path = File.absolute_path("#$warfile")
    puts File.exist?(local_war_path)
    remote_war_path = "/tmp/#{war_file_name}"

    puts "IP is " + value
    puts "CONNECTING to ubuntu@#{value}.."
    Net::SSH.start("#{value}", "ubuntu") do |ssh|
      puts 'Connected.'
      puts "SENDING #{local_war_path} to VPC /tmp folder - #{remote_war_path}"
      ssh.sftp.upload!('asset-manager-service-1.0.2-SNAPSHOT.war',
                       remote_war_path)

      print "SENT - New .war created at /tmp/#{war_file_name}"

      old_war_file = ssh.exec!("ls /srv/#{$service_dir}/war/*war")
      old_war_file_name = File.basename(old_war_file)
      puts 'What do you want to do with this old war file? - (delete/backup)'
      puts old_war_file
      input = gets.chomp
      if input=='delete'
        puts ssh.exec!("sudo rm #{old_war_file}")
        puts 'If no errors thrown - old .war file deleted successfully.'
      elsif input == 'backup'
        puts ssh.exec!("sudo mv #{old_war_file} srv/#$service_dir/war_backup/#{old_war_file_name}")
        puts 'If no errors thrown - old .war file backed up successfully at'
        puts "srv/#$service_dir/war_backup/#{old_war_file_name}"
      else
        puts 'no valid option chosen. Leaving .war file as is. You will have to delete or backup the .war manually.'
      end

      puts "MOVING the new war file from tmp into #{$service_dir}/war directory"
      puts ssh.exec!("sudo mv /tmp/#{war_file_name} /srv/#{$service_dir}/war/")
      puts 'done!'
    end
  end
我认为这里的主要问题是,当我使用变量作为文件路径的一部分时,似乎有一些有趣的事情。我不确定为什么这会产生任何影响。我知道这个问题可能有点难以脱离上下文来理解,但我真的在这里很头疼。长话短说 -

  1. 使用 File.basename 时文件路径会改变吗?
  2. 在文件路径中使用变量与硬编码字符串有区别吗?
  3. 我的代码中是否存在可能导致问题的明显错误?

最佳答案

看起来 war_file_name 末尾有一个换行符。

这会让 shell 看到

sudo mv /tmp/#{war_file_name} /srv/#{$service_dir}/war/

作为

sudo mv /tmp/#{war_file_name}
/srv/#{$service_dir}/war/

这会导致 shell 尝试将目录作为命令执行时出现 mv 缺少目标错误和“是目录”错误。

(一般来说,您不想将 ls 的输出用于任何脚本编写工作,因为在许多情况下它是不可靠且不安全的。在这种情况下,echo 的输出也可以正常工作,尽管“奇数”文件名仍然存在许多/所有安全问题。解决这些问题需要更多的脚本编写,但是可行的。)

关于java - 使用 ssh-net 的 ruby​​ 脚本中的文件路径问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27822657/

相关文章:

java - 调用方法不起作用

java - 如何为 Eclipse 启用代码推荐器?

ruby-on-rails - BUNDLE_DISABLE_SHARED_GEMS : '1' ? 是什么意思

ruby-on-rails - 在 Rails 中存储(结构化)配置数据的位置

Rails 4升级后mysql错误

java - 如何在小图像上使用 Opencv FeatureDetecter

java - 如何在保留参数的同时覆盖spring bean?

ruby - 如何使用 Aptana Studio 3 和 rbenv 调试 Ruby 脚本?

ruby-on-rails - ruby /Rails : Instantiate File object from URL

Ruby 编程控制和元组合