有没有这样一个需求:
同时向几十上百台Linux服务器上传文件并执行命令,如果一个个来,那你就真是挨踢民工。程序员要发挥自己懒惰的个性,借用Net::SSH和net::SCP用Ruby写个脚本你会发现非常简单。
Net::SSH和Net::SCP是两个Ruby操作SSH的gem包。Net::SSH相当于cmd,专门用于执行命令;Net::SCP专门用于传输文件。它们俩结合,可以做任何SSH client能做的事情。
安装:
gem install net-ssh gem install net-scp
以下所有代码都引用这段代码
require 'net/ssh' require 'net/scp' HOST = '192.168.1.1' USER = 'username' PASS = 'password'
1、使用Net::SSH执行一个命令
Net::SSH.start( HOST, USER, :password => PASS ) do |ssh| result = ssh.exec!('ls') puts result end
Net::SSH.start会与目标主机建立一个连接,并返回一个代表连接的session。如果后面接收一个block,会在block结束时自动关闭连接。否则要自己关闭连接。注意密码作为一个hash参数传递,是因为SSH登录验证方式比较多,需要的参数变化多样。
2、使用NET-SFTP传输文件。
如果不需要执行命令,仅仅是传输文件,可以使用Net::SCP.start,类似Net::SSH.start
Net::SCP.start( HOST, USER, :password => PASS ) do |scp| scp.upload!( 'c:/scp1.rb', '/home/oldsong/' ) scp.download!( '/home/oldsong/test.txt', 'c:/' ) end
3、如果即要传输文件,又要执行命令,scp不必重新建立连接,借用ssh连接即可
Net::SSH.start( HOST, USER, :password => PASS ) do|ssh| logfiles = ssh.exec!( 'ls *.log' ).split logfiles.each do |l| ssh.scp.download!( l, l ) end end
4、如果要传输大文件,最好能显示传输进度,不然好久没反应,还会以为死机了呢。
Net::SSH.start( HOST, USER, :password => PASS ) do|ssh| ssh.scp.upload!( 'large.zip', '.' ) do|ch, name, sent, total| print "\r#{name}: #{(sent.to_f * 100 / total.to_f).to_i}%" end end
5、上传一个目录,包括子目录中的所有文件。加上“:recursive => true”参数。
Net::SSH.start( HOST, USER, :password => PASS ) do|ssh| ssh.scp.download!( 'logs', '.', :recursive => true ) end
6、如果下载后不想保存成文件,而是放到内存中直接处理,只要不给download!传递本地文件名即可,会返回一个字符串。
Net::SCP.start( HOST, USER, :password => PASS ) do|scp| puts scp.download!('log.txt').split(/\n/).grep(/^ERROR/) end
7、scp最高级应用,根据事件显示所有传输信息。
Net::SCP.start( HOST, USER, :password => PASS ) do|scp| sftp.upload!(f, remote_file) do |event, uploader, *args| case event # args[0] : file metadata when :open puts "start uploading.#{args[0].local} -> #{args[0].remote} #{args[0].size} bytes}" when :put then # args[0] : file metadata # args[1] : byte offset in remote file # args[2] : data being written (as string) puts "writing #{args[2].length} bytes to #{args[0].remote} starting at #{args[1]}" when :close then # args[0] : file metadata puts "finished with #{args[0].remote}" when :mkdir then # args[0] : remote path name puts "creating directory #{args[0]}" when :finish then puts "all done!" end end puts "upload success" end
相关推荐
ruby ssh备份远程服务器脚本,主要是学习net/scp这个模块
通过shell脚本执行scp和ssh命令
Linux下SSH及SCP命令简单使用,如果通过ssh远程到其他linux机器、通过scp命令进行文件传输
可直接使用,里面有十几个DEMO,包括SSH,SCP,可直接作为SSH终端访问LINUX服务器;除非之外还可以使用已经封装好的类直接调用,操作封装在类SshExe。这些源码很简单,可直接用,很方便!!
Linux的scp命令可以在Linux服务器之间复制文件和目录。 使用语法: scp [参数] [源路径] @IP:/目标路径 scp 参数如下: -1: 强制scp命令使用协议ssh1 -2: 强制scp命令使用协议ssh2 -4: 强制scp命令只使用IPv4...
Linux批量scp命令执行工具 可批量对多个Linux主机执行传输文件命令 方便省力 适合统一化管理Linux服务器
Linux下scp的用法 scp就是secure copy,一个在linux下用来进行远程拷贝文件的命令。 有时我们需要获得远程服务器上的某个文件,该服务器既没有配置ftp服务器,也没有做共享,无法通过常规途径获得文件时,只需要通过...
用python 实现ssh的执行远端命令和scp的不同机器文件传输功能。代码简练易懂。
C#的linux-ssh&scp;封装,可远程登录linux执行命令和进行文件传输
linux下使用expect自动登录ssh/scp函数,参考使用,供学习交流
ssh,scp 连接远程ssh非22端口的服务器方法
如下所示: ...以上这篇linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文
SSH-SCP使用方法 ,如何不使用密码在服务器之间传输文件
使用ssh、scp不需要密码。刚好项目遇到这个问题,学学挺好的。
Linux服务器scp无密码传输文件操作说明
不需要远程传输文件Linux如何关闭scp和sftp命令.docx
它广泛用于与Unix和Linux服务器系统的文件交互。 图形用户界面:WinSCP提供了一个直观的图形用户界面,使文件传输操作更加直观和用户友好。用户可以通过简单的拖放操作在本地和远程文件系统之间复制文件。 多种传输...
Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。 语法 scp [-...
C#通过ssh调用linux终端及文件上传 用到了putty的plink和scp
本文为大家分享了linux服务器之间传输文件的四种方式,供大家参考,具体内容如下 1. scp 【优点】简单方便,安全可靠;支持限速参数 【缺点】不支持排除目录 【用法】 scp就是secure copy,是用来进行远程文件...