Linux实战笔记(六) SSH

大家好,我是半虹,这篇文章我们介绍一下 SSH


1、简介

SSH 全称 Secure Shell,本质上是建立在应用层之上的网络传输协议

通过加密和认证机制保证传输安全,经常用于远程登录或者远程访问

除此之外,SSH 也能完成端口转发、安全文件传输等一系列实用功能


SSH 协议的实现有很多,目前应用最为广泛的莫过于  OpenSSH

这是很多 Linux 的默认实现,一般来说,系统都已经默认安装好

如果因为某些原因尚未安装,那么你也可以通过以下命令安装嘞

apt install openssh-server openssh-client

OpenSSH  实际包括两部分,分别是 ssh 服务端以及 ssh 客户端


之后,可以通过以下命令检查应用的安装情况

ssh -V

然后,可以通过以下命令检查服务的开启情况

service sshd status  # 最后的 d 代表 daemon,意思是【守护进程】,该进程由服务端管理# 开启服务:service sshd start
# 关闭服务:service sshd stop
# 重启服务:service sshd restart

如果你已经安装好  OpenSSH,那么下面我们一起来看看 SSH 的一些典型应用

具体可分为三点,下面三个小节逐一进行介绍:

  • 远程访问,对应第二个小节
  • 端口转发,对应第三个小节
  • 文件传输,对应第四个小节

2、远程访问

远程访问是 ssh 的重要应用之一,其允许本地主机访问并操作远程主机

通过本地的 ssh 客户端连接远程的 ssh 服务端之后就能在上面执行任务


为了保证安全,客户端连接服务端时,需要进行认证

认证方式常用的有两种,分别是密码认证和密钥认证


密码认证简单来说就是通过账号密码认证后才能登录

这种方式使用起来比较简单,只需要一条命令就可以,其具体格式如下:

ssh <user>@<ip> -p <port># <user>:代表服务端主机上需要登录的用户名,如果为空,那么默认为 本机用户名
# <ip>  :代表服务端主机的地址
# <port>:代表服务端主机上需要连接的端口号,如果为空,那么默认为 22

执行命令后,就会要求输入服务端对应该用户的密码,若输入正确即可完成登录

这里需要注意的是这条命令是在客户端上执行,同时要求服务端已开启服务才行


密钥认证也称免密登录,同样也是通过上述命令进行连接,但是却无需输入密码

这种方法自然也要凭证来证明连接者的身份,只不过凭证由公私钥技术提前生成

具体配置步骤如下所示:

  1. 本地客户端:生成公钥和私钥对

    ssh-keygen -t rsa # -t 表示使用的算法类型,这里使用的是 rsa 非对称加密算法
    

    执行命令后,要求输入相关信息,例如:密钥保存路径、私钥口令短语等等

    若一路回车,默认会在 ~/.ssh 下生成 id_rsa 私钥和  id_rsa.pub 公钥

  2. 本地客户端:传输公钥给服务端

    ssh-copy-id <user>@<ip> -p <port>
    

    执行命令后,输入密码就能传公钥到远程 ~/.ssh/authorized_keys 目录

    之后使用 ssh 登录时,自动用密钥做验证,无需再次输入密码


3、端口转发

所谓端口转发,实际上就是将发送到一个端口上的数据转发到另一个端口

这在日常开发中也是一个十分常见的需求


端口转发通常可以分为三种,分别是本地转发、远程转发、以及动态转发

这里所用到的命令还挺复杂,不过别怕,下面会进行详细的分析以及总结


本地转发指的是将发送到本地端口的请求转发到远程端口

通常用于远程端上存在有某个服务,本地主机想进行访问,命令格式如下:

ssh <服务端用户>@<服务端地址> -p <服务端端口> -L <绑定地址>:<绑定端口>:<目标地址>:<目标端口>

首先需要说明的是,上述命令是由客户端执行,这里其实是理解转发链路的关键之一

这个命令看起来还挺复杂的,但其实我们可以拆分开来看,分成两个部分:

  1. ssh <服务端用户>@<服务端地址> -p <服务端端口>
  2. -L <绑定地址>:<绑定端口>:<目标地址>:<目标端口>

第一部分跟上一小节的远程访问一样,先建立客户端与服务端连接的隧道

第二部分是本地转发的关键配置所在,将绑定端口上的请求转到目标端口

  1. 绑定端口:是指客户端上所绑定的端口【重点】
  2. 目标端口:是由服务端进行转发的目标【重点】

一句话概括本地转发的转发链路如下:

客户端绑定的端口收到请求时,通过隧道发送到服务端,再由服务端转发到目标端口【重点】

|--------------|        |--------------|        |-----------|
|  客户端的地址  |------->|  服务端的地址  |------->|  目标地址  |
|  所绑定的端口  |------->|  服务端的端口  |------->|  目标端口  |
|--------------|        |--------------|        |-----------|隧道                     转发

实际怎么做本地转发呢?这里举一个例子:

一般来说,云服务器只默认开放 22 端口,但是假设现在 7777 端口运行着一个服务

如果本地要临时访问,则需先修改防火墙,比较麻烦,这时候就可以配置个本地转发

ssh <云服务器用户>@<云服务器地址> -p 22 -L 127.0.0.1:8888:127.0.0.1:7777# 以上命令在本地主机执行,此时客户端是本地主机,服务端是云服务器,目标地址是 127.0.0.1,也即云服务器 7777 端口
# 
# 执行之后,本地主机访问 127.0.0.1:8888 即可访问云服务器 7777 端口# 特别说明,关于绑定地址的设置,通常是 127.0.0.1 或 0.0.0.0
# 
# 如果设置 127.0.0.1,则只允许本机的连接;设置为 0.0.0.0,才会监听所有 IP 的连接
# 
# 因为这里的绑定地址是在客户端,即本地主机,后续接收的请求也是来自本地主机,所以设置为 127.0.0.1 就可以

远程转发则是指将发送到远程端口的请求转发到本地端口,这与本地转发的概念相反

通常用于本地端上存在着某个服务,远程主机想进行访问,命令格式如下:

ssh <服务端用户>@<服务端地址> -p <服务端端口> -R <绑定地址>:<绑定端口>:<目标地址>:<目标端口>

上述命令同样是由客户端负责执行,这点首先要理解清楚

下面还是将该命令拆解成两个部分来分析:

  1. ssh <服务端用户>@<服务端地址> -p <服务端端口>
  2. -R <绑定地址>:<绑定端口>:<目标地址>:<目标端口>

第一部分与本地转发是完全一模一样,先建立客户端与服务端连接的隧道

第二部分是远程转发的关键配置所在,这是与本地转发最大的不同:

  1. 绑定端口:是指服务端上所绑定的端口【重点】
  2. 目标端口:是由客户端进行转发的目标【重点】

一句话概括远程转发的转发链路如下:

服务端绑定的端口收到请求时,通过隧道发送到客户端,再由客户端转发到目标端口【重点】

|--------------|        |--------------|        |-----------|
|  服务端的地址  |------->|  客户端的地址  |------->|  目标地址  |
|  所绑定的端口  |------->|  客户端的端口  |------->|  目标端口  |
|--------------|        |--------------|        |-----------|隧道                     转发

还是举一个例子来说明怎么配置远程转发,这里有一个经典的场景:

假设你需要在家里访问公司内网的服务器,并且你现在有一台外网的服务器,怎么办

很简单,其实就是配置远程转发,这也是我们说的做了个内网穿透

ssh <外网服务器用户>@<外网服务器地址> -R 0.0.0.0.8888:127.0.0.1:22# 以上命令用内网服务器执行,此时客户端是内网服务器,服务端是外网服务器,目标地址是 127.0.0.1,也即内网服务器 22 端口
# 
# 执行之后,家里的电脑使用 ssh 连接外网服务器 8888 端口,即可连接内网服务器 22 端口# 需要注意,这里的绑定地址设置是 0.0.0.0
# 
# 因为绑定的地址是服务端,即外网服务器,但后续接收的请求是来自家里电脑,不是同一台主机,所以需要设置为 0.0.0.0
# 
# 这时还要修改服务端上的 ssh 配置文件 `/etc/ssh/sshd_config`,加上 `GatewayPorts yes`,并重启 sshd 服务后才能生效

最后介绍动态转发,动态转发可以理解成是特殊版的本地转发

通常用于本地主机想访问多个远程端服务或未知的远程端服务,其命令格式如下:

ssh <服务端用户>@<服务端地址> -p <服务端端口> -D <绑定地址>:<绑定端口>

上述命令同样是在客户端执行,也可分为两个部分:

  1. ssh <服务端用户>@<服务端地址> -p <服务端端口>
  2. -D <绑定地址>:<绑定端口>

第一部分与本地转发和远程转发一致,用于建立客户端与服务端之间的连接隧道

第二部分是转发规则的配置,在这里,只需配置绑定端口,而无需配置目标端口

这里的绑定端口是指客户端上的端口,这与本地转发一致【重要】

这里没目标端口,则是因为转发目标由发起的请求所决定【重要】

一句话概括动态转发的转发链路如下:

客户端绑定的端口收到请求时,通过隧道发送到服务端,再由服务端转发该请求

服务端转发的请求就是客户端收到的请求,这样就能达到动态转发的效果啦

例如,客户端收到的请求地址是 hostA: portA,则由服务端转发到 hostA: portA

|--------------|        |--------------|        
|  客户端的地址  |------->|  服务端的地址  |------->  目标地址和目标端口
|  所绑定的端口  |------->|  服务端的端口  |------->  由发起的请求所决定
|--------------|        |--------------|        隧道                     转发

写到这里,不知道大家有没有觉得哪里很奇怪,我们举个例子说:

假设现在本地绑定端口收到请求 <remoteHost>:<remotePort>
然后这个请求通过隧道给服务端
最后再由服务端去转发这个请求 <remoteHost>:<remotePort>,那么 <remoteHost>:<remotePort> 就能收到这些步骤都没有问题,可问题是 本地主机怎么才能让绑定的端口收到请求 <remoteHost>:<remotePort>举个具体的例子来说:
假如现在要访问百度,行,那么请求就是 百度地址:80,但是这样请求就直接发出去了,没有到绑定的地址和端口
如果想要到绑定端口也行,那么就只能是 127.0.0.1:绑定端口,这样就能通过隧道给服务端,服务端再去做转发
服务端转发了什么呢?由发起的请求决定 127.0.0.1:绑定端口,实际上就发给了自己,而且端口也是绑定的端口

就是说吧,很奇怪,问题在哪呢?

还是那个:本地主机怎么才能让绑定的端口收到请求 <remoteHost>:<remotePort>

这时就需要我们先在本地主机上设置系统或应用代理

使得发送到本地主机上的请求能先发送到绑定的端口 127.0.0.1:绑定端口

然后再通过隧道发送给服务端,并由服务端进行转发

举例来说,如果要在 macOS  设置系统代理,可参考:官方文档


好了,说了这么多,终于介绍完了三种端口转发模式,总结一下:

模式命令
本地转发ssh <服务端用户>@<服务端地址> -p <服务端端口> -L <客户端绑定地址>:<客户端绑定端口>:<目标地址>:<目标端口>
远程转发ssh <服务端用户>@<服务端地址> -p <服务端端口> -R <服务端绑定地址>:<服务端绑定端口>:<目标地址>:<目标端口>
动态转发ssh <服务端用户>@<服务端地址> -p <服务端端口> -D <客户端绑定地址>:<客户端绑定端口>

无论是哪一种方式,都需要先建立起客户端与服务端的连接隧道

但是这种连接往往不够稳定,所以推荐使用autossh来维护连接

autossh 会对连接进行监听,如果发现连接断开,就会自动重连

使用方法也很简单,只要用 autossh 替换掉 ssh,并加 -M 参数指定监听服务端口即可

autossh <服务端用户>@<服务端地址> -p <服务端端口> -L/-R/-D ... -M <监听服务端口>

当然,为了不用每次重连时都要输入密码,可以设置下免密登录

这点就不用多说了,上面已经有介绍过了


4、文件传输

最后我们介绍 ssh 的另一个应用场景,安全文件传输

为了更方便地使用,这里先推荐一个名为 scp 的工具,全称 Secure Copy

这个工具利用 ssh 实现文件传输和身份认证,用起来很方便

命令格式如下:

scp <source> <target> # 表示从 <source> 传输到 <target>

来举两个例子:

  1. 本地主机上传文件到远程主机
scp <本地主机文件路径> <远程主机用户>@<远程主机地址>:<远程主机目标路径># e.g.
# scp /path/to/source user@222.234.133.144:/path/to/target# 上述命令在 本地主机执行,这里:
# source 为 <本地主机文件路径>
# target 为 <远程主机用户>@<远程主机地址>:<远程主机目标路径># 如果上传的是目录,那么需要加上 -r 参数
# 另外可以加上 -P <port>  参数指定远程主机端口
  1. 本地主机从远程主机下载文件
scp <远程主机用户>@<远程主机地址>:<远程主机文件路径> <本地主机目标路径># e.g.
# scp user@222.234.133.144:/path/to/source /path/to/target# 上述命令在本地主机执行,这里:
# source 为 <远程主机用户>@<远程主机地址>:<远程主机文件路径>
# target 为 <本地主机目标路径># 如果下载的是目录,那么需要加上 -r 参数
# 另外可以加上 -P <port>  参数指定远程主机端口


好啦,本文到此结束,感谢您的阅读!

如果你觉得这篇文章有需要修改完善的地方,欢迎在评论区留下你宝贵的意见或者建议

如果你觉得这篇文章还不错的话,欢迎点赞、收藏、关注,你的支持是对我最大的鼓励 (/ω\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/784818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++进阶篇10---特殊类设计

一、设计一个类&#xff0c;不能被拷贝 有人可能会觉得&#xff0c;这不是很简单吗&#xff0c;直接把拷贝构造ban掉&#xff0c;不就行了&#xff0c;但事实真的如此吗&#xff1f; class A { public:A(){}A(const A& tmp) delete;// ... };int main() {A a;// A b a;…

Spring Boot集成itext实现html生成PDF功能

1.itext介绍 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件 iText 的特点 以下是 iText 库的显着特点 − Interactive − iText 为你提供类(API)来生成…

2.从hello world开始【go】

当然&#xff0c;我们可以从最基本的Hello World程序开始。Hello World程序通常是学习一门新编程语言的第一步&#xff0c;因为它能够帮助你理解基础的程序结构和编译过程 下面是一个Go语言的Hello World程序示例&#xff1a; package mainimport "fmt"func main()…

Leetcode 3101. Count Alternating Subarrays

Leetcode 3101. Count Alternating Subarrays 1. 解题思路2. 代码实现 题目链接&#xff1a;3101. Count Alternating Subarrays 1. 解题思路 这一题我们只需要用贪婪算法对原数组进行切分&#xff0c;使得每一段都是最大的交错子序列&#xff0c;然后&#xff0c;我们要获得…

关于Ansible的模块②

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 接《关于Ansible的模块 ①-CSDN博客》&#xff0c;继续学习和梳理Ansible的常用文件类模块 1. copy模块 从当前机器上复制文件到…

论文复现1:Mobilealoha

abstract:从人类演示中进行的模仿学习在机器人技术中表现出了令人印象深刻的表现。然而,大多数结果都集中在桌面操作上,缺乏一般有用任务所需的移动性和灵活性。在这项工作中,我们开发了一种用于模仿双手且需要全身控制的移动操纵任务的系统。我们首先推出 Mobile ALOHA,这…

从vrrp、bfd、keepalived到openflow多控制器--理论篇

vrrp 在一个网络中&#xff0c;通常会使用vrrp技术来实现网关的高可用。 vrrp&#xff0c;即Virtual Router Redundancy Protocol&#xff0c;虚拟路由冗余协议。 应用场景 典型的如下面这个例子&#xff1a; 当Router故障后&#xff0c;将会导致HostA-C都无法连接外部的I…

自动驾驶杂谈

在2024年的今天&#xff0c;自动驾驶技术已经迈向了一个崭新的阶段&#xff0c;日趋成熟与先进。昨日&#xff0c;我有幸亲眼目睹了自动驾驶车辆在道路上自如行驶的场景。然而&#xff0c;在市区拥堵的路段中&#xff0c;自动驾驶车辆显得有些力不从心&#xff0c;它们时而疾驰…

Spring Boot集成JPA快速入门demo

1.JPA介绍 JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术&#xff0c;结束现在 Hibernate&#xff0c;TopLink&am…

C#调用FreeSpire.Office读取word数据的基本用法

FreeSpire.Office是Spire.Office的免费版本&#xff0c;后者支持全面、复杂的office文件操作功能&#xff0c;包括文件格式转换、文档操作、文档打印等&#xff0c;详细介绍见下图及参考文献1。本文学习FreeSpire.Office的基本用法并用其获取word文档的基本信息。   新建Win…

VTK中polydata的属性数据结构表示和用法

vtk中通过vtkDataArray进行数据的存储&#xff0c;通过vtkDataObject进行可视化数据的表达&#xff0c;在vtkDataObject内部有一个vtkFieldData的实例&#xff0c;负责对数据的表达&#xff1a; ​​​​​​​ vtkFieldData存储数据的属性数据&#xff0c;该数据是对拓…

《福建教育》期刊简介及投稿要求

《福建教育》期刊简介及投稿要求 《福建教育》国内外公开发行的学术期刊&#xff0c;目前出版文献量达19187篇&#xff1b;总下载次数&#xff1a; 1361672次&#xff1b;总被引次数&#xff1a; 8709次 《福建教育》是福建省教育厅主管的唯一一份主流教育专业期刊&#xff0…

【嵌入式智能产品开发实战】(十二)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的安装运行】

目录 程序的安装 程序安装的本质 在Linux下制作软件安装包 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xf…

再探Java为面试赋能(一)Java基础知识(一)变量初始化顺序、构造方法、clone方法

文章目录 第1章 Java基础知识1.1 变量的初始化顺序1.2 构造方法1.3 clone()方法1.3.1 按值传递和按引用传递1.3.2 浅拷贝&#xff08;Shallow Clone&#xff09;1.3.3 深拷贝&#xff08;Deep Clone&#xff09; 第1章 Java基础知识 1.1 变量的初始化顺序 在Java语言中&#…

MybatisPlus速成

MybatisPlus快速入门 快速入门入门案例常见注解常见配置 核心功能条件构造器自定义SQLService接口 扩展功能代码生成静态工具逻辑删除枚举处理器JSON处理器 插件功能分页插件通用分页实体 参考文档 mybatis-plus参考文档 全部资料链接 讲义 快速入门 入门案例 <dependency…

骑行不将就,坐垫要讲究!跟维乐来一场骑美合一的美学旅行~

想象一下&#xff0c;你胯下的坐垫不再是冷冰冰的硬疙瘩&#xff0c;而是化身为“骑行界的舒适艺术家”。美学坐垫宛如马鞍上的微型沙发&#xff0c;采用美学与人体工学的跨界联姻&#xff0c;不仅赏心悦目&#xff0c;更能温柔拥抱你的臀部。它那精妙的曲线设计&#xff0c;仿…

Pandas基本操作

import pandas as pd import numpy as np#读入csv文件 book_df pd.read_csv("./doubantushu2.csv",sep,,headerNone,names[bookname,writer,publication,year,price,value])#inplace "",表明是否对原数据库进行修改&#xff0c;默认为False&#xff08;不…

AI大模型在金融行业的应用场景和落地路径

作者&#xff1a;林建明 来源&#xff1a;IT阅读排行榜 本文摘编自《AIGC重塑金融&#xff1a;AI大模型驱动的金融变革与实践》&#xff0c;机械工业出版社出版这是最好的时代&#xff0c;也是最坏的时代。尽管大模型技术在金融领域具有巨大的应用潜力&#xff0c;但其应用也面…

minor 通过nginx代理 配置 OK

#以下勿动 location /fileStorage/upload/ { proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_he…

EXCEL VBA限制工作数据批号或者自定义规则完整

EXCEL VBA限制工作数据批号或者自定义规则完整 Private Sub Worksheet_Change(ByVal Target As Range)Dim nRow%, Arr(), cMc$, cPc$, cTxt$, nSum!If Target.Row 1 Or Target.Column <> 4 Then Exit SubIf Target.CountLarge > 1 Then Exit SubcMc Target.Offset(0…