0%

一键搞定多层跳板访问目标机器

一、免密码登录ssh

  • 1、生成钥匙对

    # 生成key,但首先你得安装ssh
    ssh-keygen -t rsa -b 2048
    # 一路按回车换行,终端输出大概是这样
    # Generating public/private rsa key pair.
    # Enter file in which to save the key (/home/username/.ssh/id_rsa):
    # Enter passphrase (empty for no passphrase):
    # Enter same passphrase again:
    # Your identification has been saved in /home/username/.ssh/id_rsa.
    # Your public key has been saved in /home/username/.ssh/id_rsa.pub.
  • 2、将共钥传输给远端主机

    # id@server 是你的用户名和远端主机地址喔
    ssh-copy-id id@server
    # 按规定输入远端主机密码后,成功的话能看到终端输出
    # Number of key(s) added: 1

PS:公钥储存在远端主机这个文件里:.ssh/authorized_keys,现在当你重新再通过SSH连接到远端主机时,已经不再需要密码啦!

二、使用跳板连接到目标机器(ProxyJump)

本节内容参考自:SSH 通过跳板机直接访问内网机器SSH使用技巧-免密码/自动代理

PS:需要 OpenSSH 7.3 以上版本才可以使用 ProxyJump, 使用下列命令查看OpenSSH 版本:

  • 1、直接命令临时使用

    ssh -J [email protected]:port1,[email protected]:port2

    # 可以直接使用上述命令通过跳板机直接登录内网机器,比如:
    # ssh username@目标机器IP -p 22 -J username@跳板机IP:22
    # 如果需要通过多个跳板机则以 , 分割:
    # ssh username@目标机器IP -p 22 -J username1@跳板机IP1:22,username2@跳板机IP2:22
  • 2、长期使用配置文件||~\.ssh\config

    Host tiaoban1    # 代表跳板机 1
    HostName 跳板机 1 的 IP
    Port 22 # ssh 连接端口
    User username1 # 跳板机 1 的用户名

    Host tiaoban2 # 代表跳板机 2
    HostName 跳板机 2 的 IP
    Port 22 # ssh 连接端口
    User username2 # 跳板机 2 的用户名

    Host target # 代表目标机器的名字
    HostName 目标机器 IP # 这个是目标机器的 IP
    Port 22 # 目标机器 ssh 的端口
    User username_target # 目标机器的用户名
    ProxyJump tiaoban1,tiaoban2

    Host 10.10.0.* # 使用通配符 * 代表 10.10.0.1 - 10.10.0.255
    Port 22 # 服务器端口
    User username # 服务器用户名
    ProxyJump tiaoban1,tiaoban2
  • 3、使用方法:

    ssh tiaoban1   # 连接到跳板机 1

    ssh target # 连接到目标机器

三、安装expect交互

本节内容参考自:Shell脚本交互之:自动输入密码

PS:用于与控制台交互,如果上面的内容无法 免密登录服务器,可以用这种方法

  • 1、安装 expect

    # ubuntu or debian
    sudo apt-get install expect

    # centos7
    yum install expect

    # mac os // 没有brew 去搜一下,怎么安装 brew
    brew install expect
  • 2、语法:

    #!/usr/bin/expect -f
    # #!/bin/expect //原文此处是错误,导致 no such file or directory 正确的写法是 #!/usr/bin/expect -f
    set timeout 30
    spawn ssh -l jikuan.zjk 10.125.25.189
    expect "password:"
    send "zjk123\r"
    interact
  • 3、说明:

    在运行脚本时候要expect  file,不能sh file了
    上面语句第一句是设定超时时间为30s,spawn是expect的语句,执行命令前都要加这句
    expect "password:"这句意思是交互获取是否返回password:关键字,因为在执行ssh时会返回输入password的提示:jikuan.zjk@10.125.25.189's password:
    send就是将密码zjk123发送过去
    interact代表执行完留在远程控制台,不加这句执行完后返回本地控制台