转自ruby迷: 使用Net::SSH和Net::SCP编写Linux服务器管理脚本
试了一下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服务器管理脚本的更多相关文章
- 使用ssh公钥密钥自动登陆linux服务器
转自:http://7056824.blog.51cto.com/69854/403669 作为一名 linux 管理员,在多台 Linux 服务器上登陆进行远程操作是每天工作的一部分.但随着服务器的 ...
- [zz] 使用ssh公钥密钥自动登陆linux服务器
目录 .生成密匙对 .拷贝公匙到远程机 .启动登陆代理 这种方法处理后每次需要运行命令:ssh-add ~/.ssh/id_dsa 作为一名 linux 管理员,在多台 Linux 服务器上登陆进行远 ...
- linux服务器加入AD域(sssd)~ 通过域用户ssh登录加域的linux服务器
搭建域控:参考 https://www.cnblogs.com/taosiyu/p/12009120.html 域控计算机全名: WIN-3PLKM2PLE6E.zhihu.test.com 域:zh ...
- 转载: ssh连接上华为云Linux服务器,一会就自动断开
原文链接:https://www.cnblogs.com/mspeer/p/9907734.html 客户端向服务端发送心跳 依赖 ssh 客户端定时发送心跳,putty.SecureCRT.XShe ...
- SSH免密码登录远程linux服务器
Linux下实现SSH无密码验证登陆 ssh配置 主机A:10.0.5.199 主机B:10.0.5.198 需要配置主机A无密码登录主机A,主机B 先确保所有主机的防火墙处于关闭状态. 在主机A上执 ...
- linux下怎么用ssh连接另一台linux服务器
linux系统大家都知道是服务器版本一般都没有图像界面,通过字符界面操作.用ssh远程方式远程,如果要从一台linux远程到另外一台系统应该怎么操作呢本经验咗嚛以cenots7为例演示 方法/步骤 ...
- linux下的ssh工具之,本地上传到linux服务器and Linux服务器文件另存为本地。非sftp工具。
首先,当你只有一个ssh工具可以连接linux,但你有想把文件在 linux 和windows(本地)直接的切换.其实可以的: 本文参考 1.将本地的文件,放到ssh远程的linux服务器上: 首先要 ...
- 使用Spring注解来简化ssh框架的代码编写
目的:主要是通过使用Spring注解的方式来简化ssh框架的代码编写. 首先:我们浏览一下原始的applicationContext.xml文件中的部分配置. <bean id="m ...
- ssh连接linux服务器只显示-bash-4.1#不显示路径解决方法
ssh连接linux服务器只显示-bash-4.1#不显示路径时,我们只需要修改 ~/.bash_profile文件,如果不存在这个文件,那么新建一个,增加内容 export PS1='[\u@\ ...
随机推荐
- C++ 代码格式化工具Astyle
1.下载Asyle程序. win版本:https://sourceforge.net/projects/astyle/ 2.将bin/AStyle.exe拷到源码目录中,在命令行终端执行. AStyl ...
- lambda、map、reduce、filter函数讲解
# coding:utf-8 """ 几个特殊的函数: lambda lambda后面直接跟变量 变量后面是冒号 冒号后面是表达式,表达式计算结果就是本函数的返回值 作用 ...
- Linux下如何查看系统启动时间和运行时间(转)
1.uptime命令输出:16:11:40 up 59 days, 4:21, 2 users, load average: 0.00, 0.01, 0.00 2.查看/proc/uptime文件计算 ...
- HTML:DOM 对象
ylbtech-HTML:DOM 对象 1. Document 对象返回顶部 1-1. Document 对象 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对 ...
- open jdk
http://rednaxelafx.iteye.com/blog/1549577 https://www.jianshu.com/p/f98c3acd8df8 http://download.jav ...
- 用MATLAB生成模糊控制离线查询表
实时采样得到的数据经过模糊化处理后输入机器,通过查询模糊规则表便可得到应有的输出模糊量,从而避免了近似推理过程.实际应用中,特别是在控制系统较为简单而采用单片机控制时,常常采用这种查表法. 模糊控制表 ...
- 解决nginx access日志中400 bad request 错误(转)
在access.log中有大量400错误,并以每天几百M的速度增加,占用大量空间.tail -f /opt/nginx/logs/access.log 116.236.228.180 - - [15/ ...
- Mysql 8 常用命令测试
1.创建数据库,帐号及授权 create database testdb; CREATE USER 'rusking'@'%' IDENTIFIED BY '12345678'; CREATE USE ...
- 如何在页面中获取到ModelAndView绑定的值
以下内容转自:https://blog.csdn.net/qq_16071145/article/details/51341052 springMVC中通过ModelAndView进行后台与页面的数据 ...
- C#面试题(转载)
原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. .NET和C#有什么区 ...