- 浏览: 143746 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (110)
- CoreJava (18)
- 待解决 (1)
- 数据结构 (3)
- 科普 (2)
- 网站 (1)
- DataBase (8)
- Access (1)
- Asp (1)
- JSP (1)
- 操作系统 (8)
- Tech (1)
- Linux (11)
- Career (5)
- MongoDB (1)
- Embedded (1)
- JavaScript (1)
- UltraIso (1)
- Linux命令 (1)
- DesignPattern (1)
- Ruby (13)
- Vim (1)
- 自考 (2)
- Github (5)
- zrProject (1)
- Emacs (4)
- Math (3)
- Ajax (1)
- 没看懂 (1)
- HTML (1)
- Philosophy (1)
- 软件 (1)
- 面试 (1)
- 考试报名 (3)
- Regex (1)
- 日语 (1)
- 生活 (1)
最新评论
使用Net::SSH和Net::SCP编写Linux服务器管理脚本
- 博客分类:
- Ruby
原文:http://rubyer.me/blog/1133/
有没有这样一个需求:
同时向几十上百台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的 private protect public
2012-06-14 19:18 1310原文:http://rubyer.me/bl ... -
ruby-mp3info,纯Ruby修改mp3标签
2012-06-14 19:16 868原文:http://rubyer.me/blog/747 ... -
Ruby Closure
2012-06-14 19:13 737Closure - programming language ... -
Ruby/Rails 生態圈 Ecosystem
2012-06-13 21:59 801http://ihower.tw/rails3/eco ... -
提高rails new时bundle install运行速度
2012-05-05 20:24 0http://rubyer.me/blog/941/ ... -
mysql配置
2012-03-20 22:36 840http://wiisola.iteye.com/blo ... -
Gem 淘宝mirror地址
2012-03-19 12:47 847https://ruby.taobao.org -
搭建 Nginx 反向代理,提高 Gem 的安装速度
2012-03-19 12:43 757最近时常遇到 Gem 安装东西的时候安装失败或异常缓慢, ... -
细说Ruby工程的Bundle以及如何加快bundle install
2012-03-19 12:33 687做过Ruby项目的人可能有过我一样的感受,rubygem ... -
Gems淘宝镜像
2012-03-04 23:09 0Shell代码 $ ... -
学习笔记
2012-03-04 11:55 517Command LIne Switches: -
Ruby待解决
2012-02-21 21:47 5771.inject 2.|x|这种用法 -
Tutor
2012-02-19 16:14 472http://www.fincher.org/tips/Lan ... -
Tutorial
2012-02-19 12:46 630Variable naming Ok, let's slo ...
相关推荐
Linux下SSH及SCP命令简单使用,如果通过ssh远程到其他linux机器、通过scp命令进行文件传输
通过shell脚本执行scp和ssh命令
Linux的scp命令可以在Linux服务器之间复制文件和目录。 使用语法: scp [参数] [源路径] @IP:/目标路径 scp 参数如下: -1: 强制scp命令使用协议ssh1 -2: 强制scp命令使用协议ssh2 -4: 强制scp命令只使用IPv4...
可直接使用,里面有十几个DEMO,包括SSH,SCP,可直接作为SSH终端访问LINUX服务器;除非之外还可以使用已经封装好的类直接调用,操作封装在类SshExe。这些源码很简单,可直接用,很方便!!
Linux批量scp命令执行工具 可批量对多个Linux主机执行传输文件命令 方便省力 适合统一化管理Linux服务器
ruby ssh备份远程服务器脚本,主要是学习net/scp这个模块
使用ssh、scp不需要密码。刚好项目遇到这个问题,学学挺好的。
SSH-SCP使用方法 ,如何不使用密码在服务器之间传输文件
有时我们需要获得远程服务器上的某个文件,该服务器既没有配置ftp服务器,也没有做共享,无法通过常规途径获得文件时,只需要通过简单的scp命令便可达到目的。 不同的Linux之间copy文件常用有3种方法: 第一种就是...
用python 实现ssh的执行远端命令和scp的不同机器文件传输功能。代码简练易懂。
linux下使用expect自动登录ssh/scp函数,参考使用,供学习交流
如下所示: ...以上这篇linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文
C#的linux-ssh&scp;封装,可远程登录linux执行命令和进行文件传输
数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 。 命令格式: scp [参数] <源地址(用户名@IP地址或主机名)>:<文件路径> <目的地址(用户名 @IP 地址或主机名)>:<文件路径> ...
ssh,scp 连接远程ssh非22端口的服务器方法
它广泛用于与Unix和Linux服务器系统的文件交互。 图形用户界面:WinSCP提供了一个直观的图形用户界面,使文件传输操作更加直观和用户友好。用户可以通过简单的拖放操作在本地和远程文件系统之间复制文件。 多种传输...
Linux服务器scp无密码传输文件操作说明
不需要远程传输文件Linux如何关闭scp和sftp命令.docx
C#通过ssh调用linux终端及文件上传 用到了putty的plink和scp
Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。 语法 scp [-...