SSH概念介绍

SSH是一种网络协议,我们常说的 ssh 一般指其实现,即 OpenSSH,在 shell 中,也就是 ssh 命令。

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。

SSH 的原理跟 HTTPS 差不多,都是基于 TCP 和 非对称加密进行的应用层协议。它跟 HTTPS 的不同之处在于 HTTPS 通过 数字证书 和 数字证书认证中心 来防止中间人攻击,而 ssh 服务器的公钥没有人公证,只能通过其公钥指纹来人工确定其身份。

如下图所示,我们第一次使用 ssh 登陆某台服务器时, ssh 会提示我们验证服务器的公钥指纹。

当我们验证此公钥指纹是我们要登陆的服务器后,服务器的公钥会被添加到 ~/.ssh/known_hosts 里,再登陆时,ssh 检测到是已认证服务器后就会跳过公钥验证阶段。

SSH连接建连过程

关于通信加密的概念,我在之前的文章也有所介绍,参见:再谈加密-RSA非对称加密的理解和使用。至于 SSH 协议的建连过程,则可以参阅:Protocol Basics: Secure Shell Protocol 。

总结起来主要包括以下步骤:

  • TCP 三次握手

  • SSH 协议版本协商

  • 客户端与服务端的公钥交换

  • 加密算法协商

  • 客户端使用对称加密的密钥认证

  • 客户端与服务端安全通信

我使用 tcpdump + wireshark 抓包并查看了一下其 SSH 的建连过程,如下图所示:

SSH工具

ssh作为工具, ssh 分为服务端和客户端,在服务端,它是 sshd,一般占用 22 端口。我们平常使用的是其客户端,一般用法为 ssh user@host,然后根据 ssh 的提示,我们输入密码后登陆到服务器。

它的功能非常强大,看其支持参数就知道了。

  1. ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] [user@]hostname [command]

介绍完了 SSH 协议和 ssh 命令,终于说到公钥登陆了。

公钥登陆

理解了非对称加密的原理后,再公钥登陆会非常简单。由于公私钥是唯一的一对,在客户端保障自己私钥安全的情况下,服务端通过公钥就可以完全确定客户端的真实性,所以要实现公钥登陆,我们就要先生成一个公私密钥对。

通过 ssh-keygen 命令来生成密钥对,为了让步骤更完整,我把它们暂时保存到工作目录,默认会保存到 ~/.ssh 目录。

  1. ~ ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/Users/zbs/.ssh/id_rsa): ./test
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in ./test.
    Your public key has been saved in ./test.pub.
    The key fingerprint is:
    SHA256:xxxxx/B17z/xxxxxx zbs@zbs.local
    The key's randomart image is:
    +---[RSA 2048]----+
    | o+*.. EO* |
    | .... |
    | oo+ .o++.o|
    +----[SHA256]-----+
    ~ ls ./test*
    ./test ./test.pub

把私钥文件 ./test 的内容放到 客户端的 ~/.ssh/id_rsa,再使用密码试登陆到服务器后,将公钥内容 ./test.pub 里的内容放到 服务器的 ~/.ssh/authorized_keys。

再次登陆时,ssh 会自动使用自己的私钥来认证,也就避免了输出密码。

批量操作

公钥登陆帮我们避免了每次登陆服务器要输出密码的麻烦,它同时也解决了每个登陆会话都会同步阻塞的问题,这样我们就可以利用 ssh 的 ssh user@host command 方式来直接在服务器上执行命令。

同时,在我们拥有一个 ip 列表的情况下,使用 for 循环遍历 ip 列表,在多个服务器上批量执行命令也就成为了可能。

关于批量执行,已经有很多开源工具了,如使用 python 编写的 pssh,C++ 编写的 hss等。

注:本文转自高效运维公众号,本人只是收藏使用,感谢。

SSH协议介绍的更多相关文章

  1. 【Jsch】使用SSH协议连接到远程Shell执行脚本

    如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉,ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接,SSH 在连接和传送的过程中会加密所有的数据. 但是SSH一般 ...

  2. SSH协议及其应用

    SSH协议及其应用 原文作者:阮一峰 链接: http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html http://www.ruany ...

  3. Java 实现 SSH 协议的客户端登录认证方式--转载

    背景 在开篇之前,让我们先对 SSH 协议有个宏观的大致了解,这样更有利于我们对本文的加深了解.首先要提到的就是计算机网络协议,所谓计算机网络协议,简单的说就是定义了一套标准和规则,使得不同计算机之间 ...

  4. SSH2.0编程 ssh协议过程实现

    之前为了自己做一套SSH,先自己实现了一套telnet.但经过这么多天的苦逼,发现以前的工作都是徒劳.ssh的协议很繁杂,核心的内容在于密码算法,而且自己很难在网上找到周全的细节讲解与详细的实现,只有 ...

  5. SSH2.0编程 ssh协议过程实现(转)

    SSh协议: 全称为Secure Shell,即很安全的shell,主要目的是用来取代传统的telnet和r系列命令(rlogin,rsh,rexec等)远程登录和远程执行命令的工具,实现远程登录和远 ...

  6. 基于SSH协议的端口转发

    [前言] 最近一直在使用ssh协议的端口转发(隧道)功能,完成对内网空透等.这篇文章将主要讲解3种常用的ssh tunnelling使用方法和基本原理. 在介绍具体内容前,我先奉上端口转发的常用情景: ...

  7. SSH协议(转载)

    一. SSH是什么? SSH的全称是Secure Shell, 是一种"用来在不安全的网络上安全地运行网络服务的一种加密网络协议". 简单说,SSH是一种网络协议,用于计算机之间的 ...

  8. Mac下使用终端连接远程使用ssh协议的git服务器

    最近换了台新电脑, MacBook pro,拿到新电脑之后小小心喜了一下(终于解脱windows的束缚拥抱mac啦), 然后就开始苦逼的安装各种开发环境了. 之前在windows上使用tortoise ...

  9. 【转载】SSH协议及其应用

    原文作者:阮一峰 链接: http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html http://www.ruanyifeng.com/ ...

随机推荐

  1. gulp开发工具之postcss

    参考文章:http://www.cnblogs.com/givebest/p/4771154.html package.json { "name": "postcss&q ...

  2. Go内置函数

    append go语言中的append函数作用是在切片变量的后面追加新的数据,然后返回新的切片变量 func append(slice []Type, elems ...Type) []type sl ...

  3. C语言函数内局部变量释放的坑

    首先把代码贴上来: #include <stdio.h> #include<windows.h> int f(int **iptr){ ; *iptr = &a; ; ...

  4. 多语言编程必备的十大 Vim 插件

    原文地址:http://www.linuxeden.com/a/58769 使用这 10 个 Vim 插件,可以让你在写代码或运维时,感觉更棒. 我使用 Vim 文本编辑器大约 20 年了.有一段时间 ...

  5. 网站性能测试工具 webbench 的安装和使用-linux

    1.webbench的下载和安装 wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz sudo tar xvf we ...

  6. ueditor div style被过滤 解决办法

    上周开发中有用到开源的富文本编辑器UEditor,在使用的过程中遇到了样式被过滤无法显示问题,经过一番折腾终解决,此外,还有一些关于获取前台界面元素的一些总结. 1. UEditor样式被过滤无法显示 ...

  7. 【Beta】软件使用说明——致社长

    目录 社团公众号关联上"北航社团帮"小程序 为什么要关联上"北航社团帮"小程序: 如何进行关联: 小程序中的社长相关功能 如何认证成为社长 如何管理社员.增删管 ...

  8. `ll/sc` 指令在`linux`中的软件实现

    load-link与store-conditional (LL/SC)是一对用于并发同步访问内存的CPU指令.Load-link返回内存位置处的当前值,随后的store-conditional在该内存 ...

  9. 第2课第5节_Java面向对象编程_异常_P【学习笔记】

    摘要:韦东山android视频学习笔记  java的异常处理的原则如下: 1.我们先写一个没有对异常处理的程序,在进行除法运算的时候,除数是非零的话,运行时没有问题的,但是除数为零的时候,运行就会有问 ...

  10. CocosCreator之打包android

    1:准备资料 1:sdk,下载地址http://www.androiddevtools.cn/ 2:jdk下载地址http://www.oracle.com/technetwork/Java/java ...