Gem 关于使用 net-ssh gem 将文件上传问题

tiseheaini · 2014年04月18日 · 最后由 tiseheaini 回复于 2014年04月19日 · 3463 次阅读

之前是用 http 在两台服务器之间传输文件,服务器在两个国度,不够稳定。 准备用 ssh 替换。 在网上找了一下,找到了 net-ssh 这个 gem,我看了一下文档,用起来时出了问题(在本地用两个虚拟主机测试了一下,一会会成功,一会会失败,没办法确定出问题的地方) 在 controller 中的代码

Net::SSH.start('host', 'username' , :password => 'password') do |ssh|
   ## 需要解释一下,这行代码是在另一台服务器上 利用 mkdir.rb 来创建一个目录
  ssh.exec!( "ruby '/script/mkdir.rb' #{dir_path}" ) 
  ssh.scp.upload!(picture.tempfile, server_picture_path) ## 这行是重点,将文件上传并重命名
  ssh.exec!( "chmod 644 #{server_picture_path}" ) ## 改变文件的权限
end

服务器上 mkdir.rb 的代码

require 'fileutils'
dir_path = ARGV[0]
FileUtils.makedirs(dir_path) if !File.directory?(dir_path)

代码会出问题

RuntimeError (^Ascp: /mhpublic/uploads/single/673/16-8302.png: No such file or directory
):

说是在 ssh.scp.upload!(picture.tempfile, server_picture_path) 这行代码出了问题 又看了看文档,并没有什么问题,代码中所有的路径使用的都是绝对路径,不会是路径问题。 现在在猜想,是不是两条单独运行,然后在上传文件时而上一条命令还没有执行完。 希望有人指点一下。

要不绕一下?用 bash 和 scp 命令算了?前面是坑我们除了跳,还可以绕。。

#/bin/bash
bzip2 -kf ../server/db/time_inout.sqlite3
scp -i ~/.ssh/server_id_rsa ../server/db/time_inout.sqlite3.bz2 user@hostname:server/db/time_inout.sqlite3.bz2
ssh -i ~/.ssh/server_id_rsa user@hostname 'bunzip2 -f ~/server/db/time_inout.sqlite3.bz2'

#1 楼 @ericguo 谢谢你回答,这个问题已经解决掉了。是由于 rvm 路径的问题。 ssh.exec!( "ruby '/script/mkdir.rb' #{dir_path}" ) 这行代码没有找到正确的 ruby 路径。导致文件夹没有创建成功。 解决以后才知道,并不是两条命令单独运行导致的这个问题。 rvm 在服务器上确实是个坑。 还有,我试过用 scp 直接上传,上传时,文件夹要创建好才行 比如 scp ./time_inout.sqlite3.bz2 user@hostname:server/db/time_inout.sqlite3.bz2,这样去上传就会出问题。我也是不得已才用 ruby 脚本去创建文件夹。 都是坑呀,太伤心了。。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号