使用sshnet的ruby脚本中的java文件路径问题
我目前正在编写一个ruby脚本,以便上传。war文件进入专有网络。要在我们的云中更新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 楼答案
看起来
war_file_name
的末尾有一个新行那会让贝壳看到
作为
这将导致
mv
缺少目标错误和shell试图将目录作为命令执行时出现的“is a directory”错误(一般来说,你不想将
ls
的输出用于任何脚本工作,因为它在很多情况下是不可靠和不安全的。例如,在这种情况下,echo
的输出也可以工作,但仍然会有很多/所有“odd”的安全问题。)文件名。解决这些问题需要编写更多脚本,但这是可行的。)