最近用SSH比较多了,需要连接到一些远程的服务器上,然后执行一些命令。次数多了,渐渐就觉得比较麻烦。于是写了一个脚本用来让程序自动去执行一些重复的动作。

在ruby下的SSH库最常用的是net/ssh。可以从它的网站去找一些信息。(http://net-ssh.rubyforge.org/)上面有一些例子,来告诉用户到底怎么使用这个东西。其实模式很简单,先是通过start方法链接到服务器,开启一个session,然后在这个session的上下文上去用exec方法执行一些命令。当然还有更复杂一些的用法,不过鉴于需求只是执行命令,那么复杂的东西就放一放。

如果你愿意,每写一个脚本都用Net::SSH.start(...)开头可以,不过这个看上去并不方便。至少打的字还是比较多的。那就封装一下吧。其实怎么对这些库进行封装是仁者见仁智者见智的事情。我的想法是抽象出2个概念,配置(config)和一批命令(batch)。由此对于这个封装的用法自然就可以想到:

1 config = SSHConfig.new(:host => 'server.domain', :user => 'user', :password => 'pass')
2 batch = config.create_batch
3 batch << 'ls'
4 batch << 'ps -Al'
5 puts batch.run

有了这个蓝图,剩下的就是照着这个蓝图写代码了。首先SSHConfig就是用来保存服务器的配置,并且创建一个Batch对象。当然,通过前面看过net/ssh例子,可以想起来其实SSHConfig应该还有一个功能就是根据这些配置创建一个session。

代码

 1 class SSHConfig
 2   attr_accessor :user
 3   attr_accessor :host
 4   attr_accessor :password
 5   
 6   def initialize(args = {})
 7     @user = args[:user] unless args[:user].nil?
 8     @host = args[:host] unless args[:host].nil?
 9     @password = args[:password] unless args[:password].nil?
10   end
11   
12   def create_session
13     Net::SSH.start(host, user, :password => password) do |ssh|
14       sess = Session.new(ssh)
15       yield sess
16     end
17   end
18   
19   def create_batch
20     Batch.new(self)
21   end
22 end

这里我还是把net/ssh的session又包装了一下,只暴露出了一些自己用到的方法。下面就是Session类的代码:

代码

 1 class Session
 2   def initialize(ssh)
 3     @ssh = ssh
 4     @stdout = ""
 5     @stderr = ""
 6   end
 7   
 8   def exec!(cmd)
 9     @ssh.exec!(cmd) do |ch, stream, data|
10       if stream == :stdout
11         stdout << data
12       elsif stream == :stderr
13         stderr << data
14       end
15     end
16   end
17   
18   def stdout
19     @stdout
20   end
21   
22   def stderr
23     @stderr
24   end
25 end

Session对象截获了通过它执行的命令所造成的输出,供命令执行过后为脚本打印结果使用。

最后的重头戏是Batch,他用来保存一系列的命令,然后执行他们。

代码

 1 class Batch
 2   def initialize(config, &block)
 3     @config = config
 4     @commands = []
 5     @after_exec = block
 6   end
 7   
 8   def commands
 9     @commands
10   end
11   
12   def <<(item)
13     @commands << item
14   end
15   
16   def add_command(cmd)
17     @commands << cmd
18   end
19   
20   def run
21     ret = ""
22     @config.create_session do |sess|
23       @commands.each do |cmd|
24         sess.exec!(cmd)
25       end
26       unless @after_exec.nil?
27         @after_exec.call(sess)
28       end
29       ret = sess.stdout
30     end
31     ret
32   end
33 end

最后还有一个提示,就是通过SSH执行命令的话,两个不同的命令并不集成路径。也就是说如果先执行 cd ~\web, 然后执行 ls,那么ls返回的结果是 ~ 这个目录的,而不是~\web 。那么如何让cd这个命令起效果呢?用“; ” ── cd ~\web; ls

转载于:https://www.cnblogs.com/blacktear23/archive/2010/03/10/1682759.html

用ruby的net/ssh链接远程的服务器相关推荐

  1. ssh登录极路由后台_使用SSH来远程使用服务器上的可视化软件

    Linux的SSH命令提供了相当强大的远程访问功能.用户可以使用SSH命令快速的访问其他Linux机器,比如计算机集群系统.今天我们就来了解一下SSH,以及如何使用SSH来远程使用服务器上的可视化软件 ...

  2. Mac下使用SSH连接远程Linux服务器

    本文主要介绍三种方法,在Mac下使用SSH连接远程Linux服务器. 方法一:使用终端 1.打开终端,点击新建远程连接 2.点击加号,然后添加自己服务器的IP地址 3.点击右侧的服务器,然后在下方输入 ...

  3. 在IDEA中通过密钥认证的方式使用SSH连接远程Linux服务器

    引入 如图,其中Password是通过密码的方式,即你只需要知道远程服务器指定用户的登录密码,你可以连接它:而Key pair则是通过密钥的方式,即你需要在本地服务器上生成公钥证书,然后上传到指定的远 ...

  4. mac系统 使用vscode SSH remote 远程连接服务器

    在公司实习俩礼拜了,记录一下第一步:远程连接服务器 总体过程还是挺波折的 在公司的电脑是windows,因为不想周末也把电脑拿回家了,所以给家里的mac也配置一下连接服务器 这里先说一下mac电脑的配 ...

  5. 使用vscode remote ssh功能远程连接服务器或树莓派时,报错Setting up SSH tunnel的终极解决办法,全网仅此一份

    当你想用vscode remote ssh 功能远程开发linux服务器.树莓派时,.vscode-server文件创建完成,但是一直显示卡在 Setting up SSH Host <你的用户 ...

  6. 全网最全ssh:远程连接服务器学习,教你十分钟学会

    远程连接服务器简介 SSH是如何工作的? 认证阶段 ssh修改配置文件 配置文件注释 练习 试验1 实验2 测试  远程连接服务器简介 1.什么是远程连接服务器 远程连接服务器通过文字或图形接口方式来 ...

  7. 【SSH】通过ssh实现远程登陆服务器!

    目录 1.点击"文件","连接" 2.点击此处"新建会话" 3.输入主机ip和用户名 4.一直下一步,点击连接 5.点击连接会弹出一个框,输 ...

  8. vscode使用ssh连接远程Ubuntu服务器(记录)

    动机: vscode能够实时的显示服务器上的代码界面,还是相当方便的. 前提: 由于我们是通过局域网进行连接,因此前提是,本地电脑和服务器置于同一局域网,测试的方法通过cmd中的ping 即可,能pi ...

  9. Mac下如何用SSH连接远程Linux服务器

    有两个方法,下面我来一一贡献给大家 1.终端命令 a).打开Mac的命令终端 b).输入ssh -p 22 root@101.xxx.xx.xxx(ip) 它会提示你输入密码,输入正确的密码之后,你就 ...

最新文章

  1. arm 跳转指令跳转范围
  2. idea如何导出war文件
  3. springboot加载外部xml_Springboot引用外部配置文件的方法步骤
  4. python 中的if else 和in
  5. 汇编语言:实验7寻址方式在结构化数据访问中的应用
  6. 线上故障快速定位及恢复
  7. Dockder的CS模式:
  8. 计算机通信网络面试题,【算法通信面试题】面试问题:计算机网络(七… - 看准网...
  9. 虚拟机安装Centos 7网上教程整合
  10. 温度传感器利用寄存器计算出温度值
  11. UTF-8格式编码与UTF-8无BOM格式编码的区别(包括java文件)
  12. Spring Boot 2.x 把 Guava 干掉了,拥抱本地缓存之王 Caffeine!
  13. 【漏扫工具】AWVS12使用介绍
  14. 水经注SOSO电子地图下载器官方下载V13.17.3官方版
  15. 办公软件 -- Office 365免费下载安装
  16. 强化学习: 贝尔曼方程与马尔可夫决策过程
  17. php的redis函数
  18. 苹果电子邮件怎么注册_忘记了Apple ID账号密码怎么办?超全攻略,帮你解决问题...
  19. 【个人研究】21世纪西方运用脑电(EEG)的音乐研究动向分析(二)
  20. 多方面看IP地址与常见的端口号~华山论剑

热门文章

  1. 内链优化对于网站有哪些作用?
  2. 新老网站长时间无收录多半是站内出了问题
  3. 网站seo优化相关性需要了解哪三方面内容?
  4. 关闭串口_USART串口通信,DMA方式,一分钟从入门到大师
  5. window.print 固定表头不影响_Excel中的表头,你会处理吗
  6. 计算机网络数据容量100M,华工网络教育计算机网络作业及答案
  7. matlab 三维饼图,重新学习MATLAB——作图技法及3D可视化
  8. Speedata uhf_7.6.3.jar错误硬代码问题
  9. lucene DocValues——本质是为通过docID查找某field的值
  10. centos安装nodejs