SSH远程登录原理与运用

2023-11-06

SSH是每一台Linux电脑的标准配置。

 

随着Linux设备从电脑逐渐扩展到手机、外设和家用电器,SSH的使用范围也越来越广。不仅程序员离不开它,很多普通用户也每天使用。

 

SSH具备多种功能,可以用于很多场合。有些事情,没有它就是办不成。本文是我的学习笔记,总结和解释了SSH的常见用法,希望对大家有用。

 

虽然本文内容只涉及初级应用,较为简单,但是需要读者具备最基本的”Shell知识”和了解”公钥加密”的概念。

 

一、什么是SSH?

 

简单说,SSH是一种网络协议,用于计算机之间的加密登录。

 

如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

 

最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

 

需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。

 

此外,本文只讨论SSH在Linux Shell中的用法。如果要在Windows系统中使用SSH,会用到另一种软件PuTTY,这需要另文介绍。

 

二、最基本的用法

 

SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。

 

$ ssh user@host

 

如果本地用户名与远程用户名一致,登录时可以省略用户名。

 

$ ssh host

 

SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。

 

$ ssh -p 2222 user@host

 

上面这条命令表示,ssh直接连接远程主机的2222端口。

 

三、中间人攻击

 

SSH之所以能够保证安全,原因在于它采用了公钥加密。

 

整个过程是这样的:(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

 

这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。

 

可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的“中间人攻击”(Man-in-the-middle attack)。

 

SSH协议是如何应对的呢?

 

四、口令登录

 

如果你是第一次登录对方主机,系统会出现下面的提示:

 

$ ssh user@host

The authenticity of host 'host (12.18.429.21)' can't be established.

RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.

Are you sure you want to continue connecting (yes/no)?

 

这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?

 

所谓”公钥指纹”,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。

 

很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。

 

假定经过风险衡量以后,用户决定接受这个远程主机的公钥。

 

Are you sure you want to continue connecting (yes/no)? yes

 

系统会出现一句提示,表示host主机已经得到认可。

 

Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.

 

然后,会要求输入密码。

 

Password: (enter password)

 

如果密码正确,就可以登录了。

 

当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

 

每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。

 

五、公钥登录

 

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。

 

所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

 

这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:

 

$ ssh-keygen

 

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。

 

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。

 

这时再输入下面的命令,将公钥传送到远程主机host上面:

 

$ ssh-copy-id user@host

 

好了,从此你再登录,就不需要输入密码了。

 

如果还是不行,就打开远程主机的/etc/ssh/sshd_config这个文件,检查下面几行前面”#”注释是否取掉。

 

RSAAuthentication yes

PubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys

 

然后,重启远程主机的ssh服务。

 

 // ubuntu系统

service ssh restart

 

// debian系统

/etc/init.d/ssh restart

 

六、authorized_keys文件

 

远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。

 

这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:

 

$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

 

这条命令由多个语句组成,依次分解开来看:

(1)”$ ssh user@host”,表示登录远程主机;

(2)单引号中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登录后在远程shell上执行的命令:

(3)”$ mkdir -p .ssh”的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;

(4)’cat >> .ssh/authorized_keys’ < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。

 

写入authorized_keys文件后,公钥登录的设置就完成了。

来源:阮一峰(@ruanyf)

链接:http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSH远程登录原理与运用 的相关文章

  • Java+Selenium3方法篇30-Selenium中截图方法-TakeScreenshot

    前面几篇介绍了Actions类中两种方法 本来打算介绍右键 然后类似点击向下箭头这样操作 但是在现在的firefox和chrome都不能正常实现 记得之前selenium2 53是可以在firefox上实现的 本篇介绍Selenium中截图
  • 【小程序开发必备】微信小程序常用API全介绍,附示例代码和使用场景

    文章目录 人工智能福利文章 1 网络请求相关API 1 1 wx request 1 2 wx uploadFile 1 3 wx downloadFile 1 4 wx connectSocket 2 页面跳转相关API 2 1 wx n
  • android14预览版介绍及解读

    前言 android14快要来了 最近2月8日 android14的第一个开发者预览版发布了 正式版大约会和往常一样 大概率在六月份左右推出 八九月份时会有国内会有第一批手机支持安卓14 所以 本文就带你来了解一下安卓14的变化吧 本文主要
  • 完全用Linux工作之二(什么是 Windows 能干而 Linux 干不了的事情?)

    原文地址 http www chinaunix net jh 4 16102 html 什么是 Windows 能干而 Linux 干不了的事情 Windows 能干而 Linux 干不了的事情 那就是不需要干的事情 有个朋友看我半年没有用
  • flutter中文教程

    https flutterchina club setup windows
  • ubuntu vim保存退出命令_vim入门

    1 vim 在Linux系统 我们最常用的操作方式就是通过枯燥乏味的命令行对系统进行各种操作 而随着我们不断的深入使用会发现 几乎所有的服务都需要通过修改配置文件里的参数进行相应的配置 那么问题来了 不像是windows或者MacOS的各种
  • go语言基础-----01-----go语言特性

    一 go语言特性 1 1 开发环境搭建 实际上就是安装go环境与GoLand IDE工具 go语言环境 go语言环境下载地址 这个下载时需要注意 首先使用下面命令查看对应的win系统架构 在选择对应的版本 否则在vscode下载插件时 dl
  • 手把手教你在vue中使用自定义指令全局封装防抖节流函数

    第一步在src下创建utils文件夹并创建common js文件 utils common js 文件 function throttle bindObj fn delay bindObj prevTime Date now return
  • 高并发和海量数据下的 9 个 Redis 经典案例剖析!

    往期热门文章 1 往期精选优秀博文都在这里了 2 人见人爱 收款码背后的原理是什么 3 这么设计 Redis 10亿数据量只需要100MB内存 4 当Docker遇到Intellij IDEA 再次解放了生产力 5 闲鱼靠什么支撑起万亿的交
  • Qt 窗口几何坐标系统(示例程序): geometry,frameGeometry

    注意事项 geometry和framGeometry 中的几何数据必须在 show 调用后 才有效 Qt 窗口几何布局 geometry frameGeometry https blog csdn net qq 35621436 artic
  • Python编程指南:利用HTTP和HTTPS适配器实现智能路由

    目录 HTTP和HTTPS适配器 什么是智能路由 利用HTTP和HTTPS适配器实现智能路由 总结 在Python编程中 利用HTTP和HTTPS适配器实现智能路由是一项非常实用的技能 智能路由可以根据不同的条件选择不同的路由 从而提高网络
  • Doris---索引

    前缀索引 doris中 对于前缀索引有如下约束 他的索引键最大长度是36个字节 当他遇到了varchar数据类型的时候 即使没有超过36个字节 也会自动截断 示例1 以下表中我们定义了 user id age message作为表的key
  • 2023年最新版Windows环境下

    个人主页 平行线也会相交 欢迎 点赞 收藏 留言 加关注 本文由 平行线也会相交 原创 收录于专栏 JavaSE primary jdk1 8的下载和使用总共分为3个步骤 jdk1 8的下载 jdk1 8的安装 配置环境变量 目录 一 jd
  • Jsp Unescaped xml character报错的解决办法

    鼠标点击IDEA左上角File 进入Settings 快捷键Ctrl Alt S 选择Editor Inspections 并在右边找到HTML下的Malformed content of
  • win终端好用助手——MOBAXterm和Xshell

    目录 0 前言 1 资源 2 区别 2 1MobaXterm 2 1 1ssh 2 1 2串口 2 1 3 tftp服务 2 2Xshell 2 2 1 ssh 3 总结 0 前言 总是推荐歌 大部分都是网易的 不乏一些VIP歌曲 今天分享
  • windows安装rocketmq

    windows安装rocketmq 问题背景 操作步骤 Lyric 请再给我 一个理由 问题背景 最近有使用rocketmq 为测试方便 在本地安装rocketmq 注意事项 默认已安装java1 8 启动mq必须是1 8版本 我之前使用1
  • 解决 fatal: unable to access ‘https://github.com/.../.git‘: Could not resolve host: github.com

    git config global unset http proxy git config global unset https proxy 解决办法 禁用http代理 因为github被GFW墙了 但是这样做没加密不安全
  • CentOS7.4部署ELK日志分析系统

    官网地址 https www elastic co cn 官网权威指南 https www elastic co guide cn elasticsearch guide current index html 安装指南 https www
  • 关于android中图片裁剪以及PorterDuffXfermode的使用经验小结

    1 关于图片 裁剪 出现锯齿的问题 使用canvas的clipXxx函数 可以获取只显露出某一区域的图形 但是有锯齿 即使paint使用了setAntiAlias true 函数依然无法消除锯齿问题 解决方案 使用shader方案 即 pa
  • 激光散斑成像

    激光散斑成像系统原理 当激光照射在足够粗糙 表面的高度变化大于激光的波长 的组织表面 组织表面的散射粒子会使入射光发生背向散射 由于不同散射光到达相机成像面的光程差不同 不同散射光之间会在像面上形成随机干涉现象 在空间分布上表现为明暗变化的

随机推荐

  • linux下查看进程的线程运行情况

    1 首先查看进程的PID 2 查看所在 进程的线程运行情况 top H p 5066
  • vue2 vue-amap plugin ControlBar插件使用和高德3D效果

    网络上有不少vue amap的插件使用教程 我看了许多都没有适用的 要高德3D效果必须用到ControlBar插件 核心是viewMode的开启和ControlBar插件的配置 以下是我试出来的使用方法 在main js中配置全局vue a
  • 基于89C51单片机的智能小车——06.测速小车

    测速模块 用途 广泛用于电机转速检测 脉冲计数 位置限位等 接线 VCC 接电源正极3 3 5V GND 接电源负极 DO TTL开关信号输出 AO 此模块不起作用 测试原理和单位换算 轮子走一圈 经过一个周长 C 2x3 14x半径 3
  • 5. 数学导论 - 图论(图的概念)

    文章目录 图论 Hi 大家好 我是茶桁 今天这节课呢 内容非常的少 少到你可能会认为我偷懒了 还真不是 因为就目前基础来说 图论这一节尚且没有太多可讲的东西 重点是带大家混个脸熟 那么多高强度内容之后 就当给自己放个假吧 图论 前面说过 这
  • 19.学习Camera之——相机驱动层–V4L2框架解析

    相机驱动层 V4L2框架解析 一 概览 相机驱动层位于HAL Moudle与硬件层之间 借助linux内核驱动框架 以文件节点的方式暴露接口给 用户空间 让HAL Module通过标准的文件访问接口 从而能够将请求顺利地下发到内核中 而在内
  • hdu 1827(tarjan)

    先用tarjan缩点 然后入度为0的点就是必须要选择点同时也是最小的情况 Summer Holiday Time Limit 10000 1000 MS Java Others Memory Limit 32768 32768 K Java
  • flowable 多数据源

    目录 前言 一 多数据源 二 测试 1 测试接口 1 不带事务 2 加上事务 三 解决方法 1 开启新事物 2 重写事务 总结 前言 在springboot中使用flowable 此时flowable默认使用spring中的数据源 我这里f
  • ERP常用词汇中英文对照

    ERP常用词汇中英文对照 2007年10月24日 星期三 15 23 A gt gt ABC Classification ABC分类法 对于库存的所有物料 按照全年货币价值从大到小排序 然后划分为三大类 分别称为A类 B类和C类 A类物料
  • Fastjson 全局日期序列化设置导致 JSONField 无效(Java)

    Fastjson 全局日期序列化设置导致 JSONField 无效 Java 在 Java 开发中 Fastjson 是一个流行的 JSON 处理库 它提供了强大的功能和灵活性 其中一个常见的需求是将 Java 对象序列化为 JSON 字符
  • linux文件时间戳(atime, mtime, ctime)

    简介 在linux系统创建一个文件后 使用stat lt 文件名 gt 命令行查看文件状态 总是能看到 3 个时间戳 如下图所示 从上图可以看到 touch命令创建文件abc后 使用 stat abc命令行查看abc文件的状态 显示了3个时
  • 常用命令行指令

    文章目录 1 快速重命名多份文件 2 将mkv文件转为MP4 3 cd命令 4 pip常用命令 5 常用命令大全 1 快速重命名多份文件 在想要修改的文件夹下方 按住shift键 右击鼠标 打开PowerShell ls mp4 mv De
  • 由于找不到MSVCR120.dll,无法继续执行代码,重新安装程序可能会解决此问题。

    今天安装mysql的时候遇到了一个bug 如下图所示 这是因为没有安装如下软件导致的 点击如下链接 下载vcredist 下载 vcredist 地址 https www microsoft com zh CN download detai
  • NS3初探

    NS3初探 文章目录 NS3初探 一 简介 二 NS3重要概念 1 节点 Node类 2 信道 Channel类 3 网络设备 NetDevice类 4 应用程序 Application类 5 拓扑帮助 topology helper 6
  • CAM,PradCAM,layer CAM(可解释性分析方法)

    目录 1 CAM 1 1作用 1 2应用实例 1 3CAM的特点 1 4CAM的思路 1 5CAM的缺点 2 GradCAM 2 1和GAM的区别及思路 2 2应用面 2 3一个延深 解决模型偏见 2 4缺点 3 Grad CAM 4 Sc
  • R语言基于R6的面向对象编程

    R的极客理想系列文章 涵盖了R的思想 使用 工具 创新等的一系列要点 以我个人的学习和体验去诠释R的强大 R语言作为统计学一门语言 一直在小众领域闪耀着光芒 直到大数据的爆发 R语言变成了一门炙手可热的数据分析的利器 随着越来越多的工程背景
  • 在Altium Designer设计时候出现的Unknown Pin:Pin XX问题

    之前在布线时候发现一个元器件没有而且一直提示不知道引脚 以为是网络标号没有弄 后来看了一下网络标号也有 然后系统还是提示不知道该引脚 如图所示 然后就按照网上方法把全部网络标号删去了 重新弄也没有用 原理图也检查了一遍 这个元器件的原理图也
  • 华为首席开源联络官任旭东:深耕基础软件开源,协同打造数字世界根技术

    整理 巫柔颖 开源是迄今为止最先进 最广泛 最活跃的协同创新模式 通过汇聚创新资源 构建信任环境 促进知识 智慧 技术 成果等的共享 加速创新要素高效流动 产生更大价值 已经成为软件技术升级和产业发展的主要模式 是推动科技创新的核心动力与重
  • scala集合和java集合的转换-List

    scala集合和java集合的转换 List scala的List要想转换成java的list 需要导入对应的类scala collection JavaConverters import java lang util import com
  • swift无法创建空init构造函数,如何给类变量赋予nil空值

    今天学swift的时候遇到一个问题 无法创建一个空的类对象 最主要的是 无法让对象的类变量为空 比如创建一个Person类 年龄age用Int属性 但是age默认是0 不是空值nil 以下代码给出了解决方案 import Foundatio
  • SSH远程登录原理与运用

    SSH是每一台Linux电脑的标准配置 随着Linux设备从电脑逐渐扩展到手机 外设和家用电器 SSH的使用范围也越来越广 不仅程序员离不开它 很多普通用户也每天使用 SSH具备多种功能 可以用于很多场合 有些事情 没有它就是办不成 本文是