试了一下perl下安装ssh模块,整了半天linux/window上都装不上,各依赖模块的版本总是匹配不上,后改了一下思路,用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迷: 使用Net::SSH和Net::SCP编写Linux服务器管理脚本的更多相关文章

  1. 使用ssh公钥密钥自动登陆linux服务器

    转自:http://7056824.blog.51cto.com/69854/403669 作为一名 linux 管理员,在多台 Linux 服务器上登陆进行远程操作是每天工作的一部分.但随着服务器的 ...

  2. [zz] 使用ssh公钥密钥自动登陆linux服务器

    目录 .生成密匙对 .拷贝公匙到远程机 .启动登陆代理 这种方法处理后每次需要运行命令:ssh-add ~/.ssh/id_dsa 作为一名 linux 管理员,在多台 Linux 服务器上登陆进行远 ...

  3. linux服务器加入AD域(sssd)~ 通过域用户ssh登录加域的linux服务器

    搭建域控:参考 https://www.cnblogs.com/taosiyu/p/12009120.html 域控计算机全名: WIN-3PLKM2PLE6E.zhihu.test.com 域:zh ...

  4. 转载: ssh连接上华为云Linux服务器,一会就自动断开

    原文链接:https://www.cnblogs.com/mspeer/p/9907734.html 客户端向服务端发送心跳 依赖 ssh 客户端定时发送心跳,putty.SecureCRT.XShe ...

  5. SSH免密码登录远程linux服务器

    Linux下实现SSH无密码验证登陆 ssh配置 主机A:10.0.5.199 主机B:10.0.5.198 需要配置主机A无密码登录主机A,主机B 先确保所有主机的防火墙处于关闭状态. 在主机A上执 ...

  6. linux下怎么用ssh连接另一台linux服务器

    linux系统大家都知道是服务器版本一般都没有图像界面,通过字符界面操作.用ssh远程方式远程,如果要从一台linux远程到另外一台系统应该怎么操作呢本经验咗嚛以cenots7为例演示   方法/步骤 ...

  7. linux下的ssh工具之,本地上传到linux服务器and Linux服务器文件另存为本地。非sftp工具。

    首先,当你只有一个ssh工具可以连接linux,但你有想把文件在 linux 和windows(本地)直接的切换.其实可以的: 本文参考 1.将本地的文件,放到ssh远程的linux服务器上: 首先要 ...

  8. 使用Spring注解来简化ssh框架的代码编写

     目的:主要是通过使用Spring注解的方式来简化ssh框架的代码编写. 首先:我们浏览一下原始的applicationContext.xml文件中的部分配置. <bean id="m ...

  9. ssh连接linux服务器只显示-bash-4.1#不显示路径解决方法

    ssh连接linux服务器只显示-bash-4.1#不显示路径时,我们只需要修改  ~/.bash_profile文件,如果不存在这个文件,那么新建一个,增加内容  export PS1='[\u@\ ...

随机推荐

  1. HDOJ 1770 - 阅读理解...树形DP

    题意: 一个能量E可以通过吸收某个光子的能量变成E1或者释放某个光子的能量变成E2...并且任意两个能量的转化路径至多一条...现在有一堆能量,有一堆光子...如果某个能量与某个光子做直接运算(加上其 ...

  2. iOS 转换异步block为同步方式运行

    使用dispatch_semaphore_t 实现 dispatch_semaphore_t sema = dispatch_semaphore_create(0); //创建信号量 __block ...

  3. [Python] 糗事百科文本数据的抓取

    [Python] 糗事百科文本数据的抓取 源码 https://github.com/YouXianMing/QiuShiBaiKeText import sqlite3 import time im ...

  4. bug Spring Mvc中Jsp页面获取不到Controller中的变量

    今天遇到了一个奇怪的问题: jsp代码如下: <h1>数据对比${name}</h1> 在controller里面,有赋值: @RequestMapping(value = & ...

  5. 【转】《iOS7 by Tutorials》系列:iOS7的设计精髓(下)

    四.聚焦于内容 在iOS7里,强调的不是眼花缭乱的装饰效果,而是最重要的内容本身. 下面我们来探讨这个主题: 1.删除不必要的内容 伟大的设计更多是减法和加法的组合. 虽然很酷的想法是很重要,但还有更 ...

  6. Oracle11g登录名和密码不区分大小写

    问题描述: oracle11g对账户密码实行大小写识别,烦的一比!想移除此限制 问题解决: oracle 11g以前的版本的用户名和密码是不区分大小写!oracle 11g 用户名和密码默认区分大小写 ...

  7. 阿里云的免费型DV SSL证书

    阿里云提供的免费型DV SSL. 证书的说明: [公告]免费新根证书,切入DigiCert PKI体系,兼容性如下操作系统版本IOS 5.0+.Android 2.3.3+.JRE 1.6.5+.WI ...

  8. 【Android】Android传感器

    1.加速度传感器2.磁场传感器3.方向传感器4.陀螺仪传感器5.重力传感器6.线性加速度传感器7.温度传感器8.光线传感器9.距离传感器10.压力传感器11.计步传感器 首先先查看测试的安卓机拥有的传 ...

  9. Python 隔离沙箱 virtualenv

    我认为Python一个很大的优势就是官方网站给出的众多的软件包,几乎能帮助你实现你想要的任何功能,避免了重复开发的劳动,但是零零碎碎的包,以及每个包的各种各样的版本管理就成为了一个比较棘手的问题,因此 ...

  10. pandas DataFrame(2)-行列索引及值的获取

    pandas DataFrame是二维的,所以,它既有列索引,又有行索引 上一篇里只介绍了列索引: import pandas as pd df = pd.DataFrame({'A': [0, 1, ...