转自:http://mingxinglai.com/cn/2015/07/ssh-proxycommand/

今天在公司搭建跳板机,遇到一个比较麻烦的问题,这里简单记录一下,希望对有相同问题的人有所帮助。

我们公司的线上机器是下图这样的,A是我们本地的计算机,一般是windows系统,B是跳板机,C是目标机器,我们需要登录线上机器时,必须先登录跳板机,再登录目标机器。

+-----+             +-----+             +-----+
| | | | | |
| A +-----------> | B +-----------> | C |
| | | | | |
+-----+ +-----+ +-----+

注意:我们使用了ssh-agent转发功能,私钥只需要存在A上,B和C都只存放公钥,然后就可以先登录B,再登录C。

由于大家都是在windows下办公,对于这种先登录跳板机再登录目标机器的方式并没有不满,但是,我们管理的机器网络结构越来越复杂了,变成了下面这样。我就不解释为什么我们公司会存在这么复杂的架构了,总之,在安全性与易用性之间,总是不能同时满足的,作为一线工程师,只能想办法在保证安全性的前提下,提高工作效率了。

+-----+             +-----+             +-----+             +-----+
| | | | | | | |
| A +-----------> | B +-----------> | C +-----------> | D |
| | | | | | | |
+-----+ +-----+ +-----+ +-----+

现在只希望能够在B直接跳到D,就像以前从B跳到C一样,不需要先跳到C,再跳到D这么麻烦,尤其在传文件的时候,如果需要先将文件传到C,再从C传到D,工作效率极低,并且容易出错。

+-----+             +-----+             +-----+             +-----+
| | | | | | | |
| A +-----------> | B +-------------------------------> | D |
| | | | | | | |
+-----+ +-----+ +-----+ +-----+

搜了很久,在这里找到比较好的答案。

直接编辑~/.ssh/config文件,增加ProxyCommand选项,像下面这样:

Host target.machine
User targetuser
HostName target.machine
ProxyCommand ssh proxyuser@proxy.machine nc %h %p 2> /dev/null

注意:~/.ssh/config文件有很多amazing的选项,具体可以参考这里:http://blog.tjll.net/ssh-kung-fu

现在,只需要通过下面这样简单的语句登陆远程计算机:

ssh target.machine

还可以直接SCP过去,跳板机完全透明:

scp ToCopy.txt target.machine:~

大部分人到这一步就算大功告成了,但是,其实我们公司的网络架构是这样的:

                                         +-----+             +-----+
| | | |
+----------------------------------> | D1 |
| | | | |
| +-----+ +-----+
|
|
+-----+ +--+--+ +-----+ +-----+
| | | | | | | |
| A +------------> | B +-------------------------------> | D2 |
| | | | | | | |
+-----+ +--+--+ +-----+ +-----+
|
|
| +-----+ +-----+
| | | | |
+----------------------------------> | D3 |
| | | |
+-----+ +-----+

如图所示,我们有无数的跳板机,每台跳板机后面有若干台机器,因此,不适合编辑~/.ssh/ssh_config文件,需要用脚本进行封装,因此,我像下面这样使用ProxyCommand:

  • 直接跳到远程计算机

      ssh -o "ProxyCommand ssh -p 1098 lmx@proxy.machine nc -w 1 %h %p" -p 1098 lmx@target.machine
  • 拷贝文件到远程计算机

      scp -o "ProxyCommand ssh -p 1098 lmx@proxy.machine nc -w 1 %h %p" -P 1098 -r lmx@target.machine:~/rdsAgent .
  • 在远程计算机执行命令

      ssh -o "ProxyCommand ssh -p 1098 lmx@proxy.machine nc -w 1 %h %p" -p 1098 lmx@target.machine 'ip a'

【转】SSH穿越跳板机:一条命令跨越跳板机直接登陆远程计算机的更多相关文章

  1. ssh 多条命令执行

    格式:ssh user@ip command 单条命令:ssh user@ip command1 多条命令:ssh user@ip "command1;command2" 不加双引 ...

  2. ssh 执行多条命令包含awk的用法

    格式:ssh user@ip command 单条命令:ssh user@ip command1 多条命令:ssh user@ip "command1;command2" 不加双引 ...

  3. ssh无密码登录多台机器,并让所有远程机执行相同命令

    问题集锦 其实标题的内容就是很常见的集群操作,当有一个脚本或者一个命令需要很多个机器同时(或者说接近同时)执行时,就涉及到几个问题: 怎么通知每个主机? 每个主机收到通知后,怎么让主机执行命令? 怎么 ...

  4. 【转】使用shell登录远程服务器执行多条命令,ssh登录之后执行脚本文件

    原文:https://blog.csdn.net/qq_36622490/article/details/100773589 这个需求主要是我在jenkins中pipeline的代码里,需要使用she ...

  5. linux常用60条命令 转

    Linux必学的60个命令   Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命 ...

  6. Ubuntu常用200条命令

       查看软件xxx安装内容:dpkg -L xxx 查找软件库中的软件:apt-cache search 正则表达式 查找软件库中的软件:aptitude search 软件包 查找文件属于哪个包: ...

  7. Linux下间隔多少秒 (即以秒为单位) 去执行某条命令或某个shell脚本的操作方法【转】

    在日常运维工作中, 经常会碰到以秒为单位去定时执行某些命令或监控脚本的需求. 说到定时任务就要用到crontab,通常来说,crontab的最小单位是分钟级别,要想实现秒级别的定时任务,就要进行特殊设 ...

  8. Redis的KEYS命令引起宕机事件

    摘要: 使用 Redis 的开发者必看,吸取教训啊! 原文:Redis 的 KEYS 命令引起 RDS 数据库雪崩,RDS 发生两次宕机,造成几百万的资金损失 作者:陈浩翔 Fundebug经授权转载 ...

  9. 每个Web开发者都该了解的12条命令行

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://tutorialzine.com/2017/08/12-terminal-comma ...

随机推荐

  1. 2018-2019-2 20175224 实验二《Java面向对象程序设计》实验报告

    一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:艾星言 学号:20175224 指导教师:娄嘉鹏 实验日期:2019年4月17日 实验时间:13:45 - 15:25 实验序号:24 ...

  2. redis总结(一)的持久化的取舍和选择以及作用

    1.redis持久化 在客户端发布save的过程中有可能造成阻塞,如一千万条数据同时保存并生成二进制RDB文件的时候,此时就会延迟堵塞. 文件策略是如果存在老的RDB文件,会用新的文件替代老的文件如下 ...

  3. 运行caffe自带的mnist实例教程

    运行caffe自带的mnist实例教程 本文结合几篇博文总结下来的,附上其中一篇原博文链接以供参考:http://blog.sina.com.cn/s/blog_168effc7e0102xjr1.h ...

  4. matlab json文件解析 需要下载一个jsonlab-1.5

    % facebookX24.m clc; addpath('C:\Program Files\MATLAB\R2015b\toolbox\jsonlab-1.5'); % read .json jso ...

  5. linux系统中文件的权限

    查看文件权限的语句: 在终端输入:ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些:-rw-rw-r-- 一共有10位数 其中: 最前面那个 - 代表的是 ...

  6. oracle 修改服务端字符集编码

    进入服务端的sqlplus命令界面 SELECT * FROM V$NLS_PARAMETERS; 可以查看参数的值. 解决字符集编码 NLS_CHARACTERSET 办法: UPDATE PROP ...

  7. spring 集成redis客户端jedis(java)

    spring集成jedis简单实例   jedis是redis的java客户端,spring将redis连接池作为一个bean配置. “redis.clients.jedis.JedisPool”,这 ...

  8. 通过JQuery的$.ajax()把 json 数据 post 给 PHP

    通过JQuery的$.ajax()把 json 数据 post 给 PHP时的几种情况: 无法在PHP中通过$_POST 以及 $_REQUEST 获取json数据,即 $json = $_POST[ ...

  9. docker3

    Docker容器的设置资源(cpu,内存)限制: #docker  run –memory=200M xxxx-image  --vm 1 –verbose #docker  run  --cpu-s ...

  10. docker for windows 部署gitlab

    gitlab的安装相对繁琐,如果使用docker 镜像的方式就轻松太多了. 我是用的环境是windows10 专业版 + docker for windows 1.右键docker打开Kitemati ...