ssh 命令详解

news2024/9/30 17:21:03

一、命令简介

ssh ​命令用于安全登录远程主机,以便在远程机上执行命令或传输数据。

例如登录远程主机 169.10.222.23 ​上的 soulio ​用户:

ssh soulio@169.10.222.23

更多示例参考第三章。

了解背景知识:ssh 加密

1. 加密类型
  • 对称加密: 在数据传输过程中使用相同的密钥进行加密和解密。常见的对称加密算法包括 AES(高级加密标准)、Blowfish 和 3DES(Triple Data Encryption Standard)。
  • 非对称加密: 使用一对密钥(公钥和私钥)来加密和解密数据。公钥可以公开,而私钥则应保密。常见的非对称加密算法包括 RSA 和 DSA。
  • 哈希函数: 用于确保数据完整性,防止数据在传输过程中被篡改。常见的哈希算法包括 SHA-256 和 SHA-1。
2. SSH 加密过程
  1. 密钥交换: 在连接开始时,客户端和服务器通过非对称加密交换公钥,以安全地生成共享的会话密钥。
  2. 会话密钥生成: 一旦密钥交换成功,双方生成一个对称的会话密钥,后续的通信将使用这个会话密钥进行加密。
  3. 数据加密: 使用会话密钥加密所有发送的数据,包括命令、输出和文件传输。
  4. 数据完整性检查: 在传输过程中,SSH 使用哈希函数确保数据的完整性,防止数据被篡改。
3. SSH 密钥管理
  • 密钥对生成: 用户可以使用 ssh-keygen​ 工具生成 SSH 密钥对(公钥和私钥)。
  • 公钥分发: 将公钥添加到远程主机的 ~/.ssh/authorized_keys​ 文件中,以便通过私钥进行身份验证。
  • 私钥安全性: 私钥应妥善保管,通常加密存储,并在使用时输入密码。
4. SSH 加密的优点
  • 安全性高: SSH 加密保护了数据传输过程中的机密性和完整性,防止窃听和数据篡改。
  • 身份验证: SSH 支持多种身份验证方式,包括密码、密钥对和基于证书的认证,提供了灵活的安全选项。
  • 远程管理: SSH 使得系统管理员能够安全地管理远程服务器,执行命令和文件传输。
5. 总结

SSH 加密是保护远程连接和数据传输的关键技术,广泛应用于网络管理和安全通信。通过对称和非对称加密、密钥交换和数据完整性检查,SSH 确保了用户在使用网络时的数据安全。

除了 ssh ​命令外,stfp​ 和 scp​ 这两个文件传输命令也建议在 SSH 加密之上。

二、命令参数

命令格式

ssh [选项] [用户名@]主机名或IP地址 [命令]

常用参数

  • -p port​: 指定连接的端口号,默认是 22。
  • -i identity_file​: 指定私钥文件用于身份验证。
  • -v​: 启用详细模式,显示连接过程中的调试信息。
  • -X​: 启用 X11 转发,以便在本地显示远程 GUI 应用程序。
  • -C​: 启用压缩,提高传输速度。

选项太多,这里仅做收集,方便用时查阅。此刻的你不用记,甚至不用看。

更多选项

  • -p​: 指定端口(例如:ssh -p 2222 user@example.com​)。
  • -i​: 指定私钥文件(例如:ssh -i /path/to/private/key user@example.com​)。
  • -l​: 指定登录用户名(例如:ssh -l user example.com​)。
  • -o​: 指定自定义 SSH 选项(例如:ssh -o "OptionName Value" user@example.com​)。
  • -4​: 强制使用 IPv4 地址(例如:ssh -4 user@example.com​)。
  • -6​: 强制使用 IPv6 地址(例如:ssh -6 user@2001:db8::1​)。
  • -C​: 启用压缩(例如:ssh -C user@example.com​)。
  • -c​: 指定加密算法(例如:ssh -c blowfish,user@example.com​)。
  • -D​: 动态端口转发(例如:ssh -D 1080 user@example.com​)。
  • -L​: 本地端口转发(例如:ssh -L 8080:localhost:80 user@example.com​)。
  • -R​: 远程端口转发(例如:ssh -R 8080:localhost:80 user@example.com​)。
  • -N​: 不执行远程命令,用于端口转发(例如:ssh -N -L 8080:localhost:80 user@example.com​)。
  • -f​: 后台执行(例如:ssh -f -L 8080:localhost:80 user@example.com​)。
  • -g​: 允许远程主机连接到转发的端口(例如:ssh -g -L 8080:localhost:80 user@example.com​)。
  • -T​: 禁用伪终端分配(例如:ssh -T user@example.com​)。
  • -t​: 分配伪终端(例如:ssh -t user@example.com​)。
  • -v​: 详细模式(例如:ssh -v user@example.com​)。
  • -X​: 启用 X11 转发(例如:ssh -X user@example.com​)。
  • -Y​: 信任的 X11 转发(例如:ssh -Y user@example.com​)。

三、命令示例

1 最简单登录

1.命令格式

ssh user@example.com
  • user:要登录的用户
  • example.com:要登录的主机,可以是一个 域名​,也可以是一个 ip​,还可以是一个 别名​。最终都会指向某台主机。

对于未指定的信息,将会使用默认配置,比如端口使用 22

2.开始登录

登录会验证用户密码,密码验证成功后进入远程主机的终端。

Clip_2024-09-25_18-25-58

现在你可以管理这台远程主机:执行命令,传输文件等操作。

3.退出登录

输出 exit ​退出登录,将会回到本地主机的终端中。

Clip_2024-09-25_18-30-53

2 指定端口登录

ssh -p 2222 user@example.com

通常 SSH 使用默认端口 22 进行通信,但是有些管理员可能会修改默认端口号,以避免网络攻击。如果你不知道正确的端口号,就无法与远程主机建立 SSH 连接。如果你知道正确端口号,可以使用 -p​ 指定,如上所示:-p 2222​ 指定连接远程主机的 2222 端口,而非 22 端口。

3 让远程计算机执行一条命令

ssh user@example.com 'ls'

需要让远程计算机执行的命令,写在 ssh 命令的最后。通常命令执行后会有一个输出,输出会直接返回到当前终端中。这个例子将会返回在远程计算机上执行 ls​ 的结果,也就是列出远程计算机 example.com 的 user 用户的家目录列表。

Clip_2024-09-25_18-23-31

4 秘钥管理

如果你经常登录某个远程主机,每次都要输密码就会显得很麻烦。有没有方法,让我们不需要输入密码就可以登录远程主机?有。

方法一:使用 SSH 客户端

比如 Termius

将登录信息保存到客户端中

recording

下次登录时,客户端会调用你的配置(用户名、主机、密码)。从而用户无需输入。

recording

方法二:使用公钥

将本地计算机的公钥发送远程计算机上,下次登录就不需要输入密码。真正的免密登录。

1.生成秘钥

如果新装的系统,可能还没有生成秘钥信息,使用以下命令生成秘钥:

ssh-keygen

中间会有两三次提示,不用管,直接按回车键。看到类似提示就成功了。

Clip_2024-09-25_18-57-38

2.把公钥部署到远程主机

ssh-copy-id user@example.com
  • user 换成你在远程主机上的用户名
  • example.com 换成你的远程主机,可以是域名,可以是 ip,还可以是别名。最终都会指向你的主机。

tips:如果你有多个公钥,可以在命令中加上 -i 目录 ​部署指定公钥。

执行命令,成功会有类似输出

Clip_2024-09-25_19-07-47

现在登录远程主机就不会再验证密码了。

Clip_2024-09-25_19-10-25

5 使用别名

Clip_2024-09-25_22-18-46

例如用 armbian ​作为 soulio@192.168.10.36 ​的别名,这样用 ssh armbian ​就可以登录指定主机,输入起来更友好。

实现步骤:

第一步,修改本地 ~/.ssh/config​ 文件,添加主机别名:

Host armbian
    HostName 192.168.10.36
    User soulio
    Port 22 #可选的配置
    IdentityFile ~/.ssh/id_rsa #可选的配置

第二步,使用别名登录远程主机:

ssh armbian

6 端口转发

在 SSH 中,端口转发和代理转发是两种非常有用的功能,它们允许用户通过 SSH 会话来转发网络流量,从而绕过防火墙、访问内网资源或保护网络通信。

SSH 端口转发是通过 SSH 通道安全地传输 TCP 流量的功能,可以分为三种类型:本地端口转发远程端口转发动态端口转发。它们分别允许将本地端口、远程端口或任意的流量通过 SSH 通道进行转发。

本地端口转发 (远程发到本地)

本地端口转发将本地计算机的一个端口绑定到远程服务器上的某个端口。这种方式常用于从本地访问远程服务器上的内部资源。

语法

ssh -L [local_port]:[remote_host]:[remote_port] [user@ssh_server]
  • local_port​: 本地机器上将绑定的端口。
  • remote_host​: 远程主机地址,可以是服务器的内部 IP 或域名。
  • remote_port​: 远程主机的端口号。
  • ssh_server​: 用于建立 SSH 连接的服务器。

示例

ssh -L 8080:intranet.example.com:80 user@ssh_server.com

这个命令将本地机器的 8080​ 端口与远程服务器 ssh_server.com​ 上的内部主机 intranet.example.com​ 的 80 端口相连。你可以通过在浏览器中访问 http://localhost:8080​ 来访问远程内网的资源。

在局域网中实验

ssh -L 8080:localhost:32769 soulio@192.168.10.63
  • 源:在 192.168.10.63:32769 上搭建 web 页面

Clip_2024-09-26_00-22-47

  • 转发:转发到本地 8080

Clip_2024-09-26_00-25-17

远程端口转发 (本地发到远程)

远程端口转发允许将远程服务器上的一个端口绑定到本地计算机或另一个远程机器的端口上,通常用于将外部网络的请求转发到本地计算机上。

语法

ssh -R [remote_port]:[local_host]:[local_port] [user@ssh_server]
  • remote_port​: 远程服务器上的端口。
  • local_host​: 本地计算机的地址。
  • local_port​: 本地机器上的端口。

示例

ssh -R 8080:localhost:3000 user@ssh_server.com

此命令将远程服务器 ssh_server.com​ 的 8080​ 端口绑定到本地机器的 3000​ 端口。任何对 ssh_server.com:8080​ 的请求都会转发到你本地计算机的 3000​ 端口。

设置-允许远程转发

编辑远程主机 sudo nano /etc/ssh/sshd_config

GatewayPorts yes

GatewayPorts 默认为 no,不允许远程转发。必须开启。修改配置后重启 ssh 服务使其生效。

在局域网中实验

ssh -R 8081:localhost:16601 soulio@192.168.10.63
  • 源:在本地 3000 端口搭建一个 web 页面

这里源不局限于本地主机,只要是本地主机可以访问到的页面都可以,比如 192.168.10.55:16601

  • 转发:转发到 192.168.10.63:8080
动态端口转发

动态端口转发是一种灵活的方式,它将本地机器的一个端口用作 SOCKS 代理,可以转发任意的网络请求。这种方式允许你通过 SSH 通道代理所有网络流量,类似于 VPN 的效果。

语法

ssh -D [local_port] [user@ssh_server]
  • local_port​: 用于 SOCKS 代理的本地端口。

示例

ssh -D 1080 user@ssh_server.com

此命令将本地端口 1080​ 设置为 SOCKS 代理端口。你可以在浏览器或其他应用中设置 SOCKS 代理为 localhost:1080​,通过 SSH 服务器转发所有网络流量。

Clip_2024-09-26_02-20-55

使用体验:但不好用。用了几分钟就开始报错,超时。建议用其他简单、稳定的工具呢。也可能是我未能掌握关键。

Clip_2024-09-26_03-46-01

设置-允许动态转发

编辑远程主机 sudo nano /etc/ssh/sshd_config

AllowTcpForwarding yes 	#默认是yes
PermitTunnel yes		#默认是no 改为yes

确保这些选项被设置为 yes​,然后重启 SSH 服务:

sudo systemctl restart ssh

7 代理转发

  • 代理转发,例如本地端口 1080
ssh -D 1080 user@example.com
  • SSH 代理转发 (Agent Forwarding)

SSH 代理转发是一种允许在远程服务器上使用本地 SSH 代理功能的机制。通过代理转发,你可以在远程服务器上使用本地的 SSH 私钥进行身份验证,而不需要将私钥复制到远程服务器上。这对于通过中间跳板服务器访问更多服务器时非常有用。

  • 工作原理

SSH 代理转发通过 SSH 代理 (ssh-agent​) 进程,将本地机器的 SSH 代理功能转发到远程服务器。这样,远程服务器上的应用程序可以通过本地 SSH 代理进行密钥认证,而不会暴露私钥。

  • 使用方式

使用 -A​ 选项启用 SSH 代理转发。

语法

ssh -A user@ssh_server

示例

ssh -A user@jump_server

假设你通过 jump_server​ 访问另一台服务器 server2​,你可以在 jump_server​ 上通过 SSH 代理连接到 server2​,而无需在 jump_server​ 上存储私钥:

ssh user@server2

总结

  • 端口转发允许你通过 SSH 通道安全地转发本地或远程的网络流量,支持本地、远程和动态端口转发。
  • 代理转发允许在远程服务器上使用本地 SSH 代理进行身份验证,避免在远程服务器上存储私钥,增加了安全性和灵活性。

这两种功能在网络安全和远程访问方面提供了极大的便利,尤其是在访问内网资源或通过跳板服务器进行管理时。


注意事项

如果你使用 WSL 环境,可能在某些环节遇到网络问题。

Clip_2024-09-26_01-52-20

远程转发时,WSL 无法将 localhsost:xxx 转发到远程端口。在纯 Linux 环境则成功。

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

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

相关文章

C++之Person类中调用Date类

main.cpp #include <iostream> #include "Person.h" using namespace std;int main() {Person myPerson;// Person myPerson("S.M.Wang", 070145, "莲花路200号");cout << "请输入姓名:" ;string name;cin >> name…

【文档智能 RAG】浅看开源的同质化的文档解析框架-Docling

前言 RAG的兴起&#xff0c;越来越多的人开始关注文档结构化解析的效果&#xff0c;这个赛道变得非常的同质化。 关于文档智能解析过程中的每个技术环节的技术点&#xff0c;前期文章详细介绍了很多内容&#xff1a; 下面我们简单的看看Docling这个PDF文档解析框架里面都有什…

尚品汇-自动化部署-Jenkins的安装与环境配置(五十六)

目录&#xff1a; 自动化持续集成 &#xff08;1&#xff09;环境准备 &#xff08;2&#xff09;初始化 Jenkins 插件和管理员用户 &#xff08;3&#xff09;工作流程 &#xff08;4&#xff09;配置 Jenkins 构建工具 自动化持续集成 互联网软件的开发和发布&#xf…

AI:颠覆式创新 vs. 持续性创新

随着有关生成式人工智能 (GenAI) 的新闻不断出现在社交媒体上&#xff0c;包括 ChatGPT 4o 如何帮助你与朋友玩石头、剪刀、布&#xff0c;关于 GenAI 的“颠覆性”影响的惊人声明并不难找到。 事实证明&#xff0c;将 GenAI 本身称为“颠覆性”并没有多大意义。 它能成为颠覆…

libvirt中的qemu与kvm

在 libvirt 虚拟机管理中&#xff0c;domain_type 的设置决定了虚拟机使用的虚拟化技术。在 domain_type 中&#xff0c;qemu 和 kvm 是两种不同的虚拟化模式&#xff0c;它们的区别主要在于是否使用硬件虚拟化加速。 qemu 模式 定义&#xff1a;qemu 是一种完全软件模拟的虚…

Recorder录音插件使用日记

目录 一、安装插件 二、导入文件 1.app-xxx-support.js支持文件 2.RecordApp 三 功能的使用 3.1 请求录音权限 3.2 开始录音 3.3 停止录音 3.4 其他接口 四 、使用 4.1 开始录音实例 4.2 请求录音权限 4.3 停止录音——文件的下载与上传 一、安装插件 npm install…

c++ day06

类的栈 实现 #include <iostream>using namespace std;class Stack { private:static const size_t MAX 100; // 定义固定容量int data[MAX]; // 存储栈元素的数组size_t len; // 当前栈的大小public:// 构造函数Stack() : len…

排序(交换排序:冒泡,快排)

冒泡排序&#xff1a;定义两个指针&#xff0c;指向第一个和第二个位置&#xff0c;前一个比后一个大就交换&#xff0c;然后同时向后挪接着比较&#xff0c;把最大的放到最后一个位置。最坏的情况&#xff1a;O(N^2)&#xff0c;最好的情况&#xff1a;O(N)。冒泡和插入的时间…

【深度学习】03-神经网络 5 (完结篇) 一文讲解 pytroch手机价格神经网络分类与准确率优化案例

手机价格分类数据集已经上传&#xff0c;用户可以自行下载进行训练。 构建数据集 数据共有 2000 条, 其中 1600 条数据作为训练集, 400 条数据用作测试集。 我们使用 sklearn 的数据集划分工作来完成 。并使用 PyTorch 的 TensorDataset 来将数据集构建为 Dataset 对象&#x…

一款好用的远程连接工具:MobaXterm

在日常工作中&#xff0c;作为开发者或运维人员&#xff0c;你是否经常需要远程连接服务器进行调试和管理&#xff1f;传统的SSH工具常常不够灵活&#xff0c;操作繁琐&#xff0c;无法满足日益复杂的工作需求。而MobaXterm的出现&#xff0c;带来了远程连接工具的全新体验。它…

付费计量系统的标准化框架(上)

Generic processes 通用过程Specific system processes 专用系统过程Generic functions 通用功能Specific system functions 专用系统功能Data Elements 数据单元Specific system data elements 专用数据单元Customer_Information_System 用户信息系统CIS_to_POS_Interface Typ…

MySql中索引失效的情况及原因

1.索引失效的情况 这是正常查询情况&#xff0c;满足最左前缀&#xff0c;先查有先度高的索引。 1. 注意这里最后一种情况&#xff0c;这里和上面只查询 name 小米科技 的命中情况一样。说明索引部分丢失&#xff01; 2. 这里第二条sql中的&#xff0c;status > 1 就是范围…

鸿蒙小技巧

1.子调用父的方法 子组件 父组件 2.使用emitter实现孙子传爷 孙子组件 import emitter from ohos.events.emitter;let event: emitter.InnerEvent {eventId: 1,priority: emitter.EventPriority.HIGH};let eventData: emitter.EventData {data: {"state": true,…

QProgressDialog运行初始不显示的问题

我用的是qt手册上的示例代码&#xff0c;结果运行时却出现如下问题&#xff1a; 如图程序运行时&#xff0c;开始一段时间是不显示进度条、百分比之类的。 运行一段时间之后&#xff0c;到50%才显示。当时数字是2&#xff0c;总数是4。 我用了网上的方案&#xff0c;增加了一条…

mysql中的float vs double

mysql中的float vs double 1、精度2、存储空间3、适用场景 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在数据存储和计算领域&#xff0c;float和double是两种常见的浮点数类型&#xff0c;它们的主要区别如下&#xff1a; 1、精度 fl…

初试Bootstrap前端框架

文章目录 一、Bootstrap概述二、Bootstrap实例1、创建网页2、编写代码3、代码说明4、浏览网页&#xff0c;查看结果5、登录按钮事件处理6、浏览网页&#xff0c;查看结果 三、实战小结 一、Bootstrap概述 大家好&#xff0c;今天我们将一起学习一个非常流行的前端框架——Boot…

计算物理精解【2】-Julia计算基础

文章目录 Julia的命名规则1. 字符选择2. 大小写敏感3. 禁用字符4. Unicode支持5. 命名约定6. 示例 运算赋值类型String转换类型伴随矩阵Julia 符号计算-SymEngineJulia 符号计算-SymbolicUtils参考文献 Julia的命名规则 相对宽松但也有一些特定的要求&#xff0c;主要包括以下…

PMP和CSPM哪个含金量高?

CSPM 和 PMP 都是非常有价值的证书&#xff0c;都是适用于项目经理岗位的证书&#xff0c;究竟哪个含金量够高&#xff0c;必须结合你的实际情况来进行判断。先说结论:如果你的目标就业单位是外企&#xff0c;或者有海外业务的企业&#xff0c;就考 PMP 证书&#xff0c;反之就…

近万字深入讲解iOS常见锁及线程安全

什么是锁&#xff1f; 在程序中&#xff0c;当多个任务&#xff08;或线程&#xff09;同时访问同一个资源时&#xff0c;比如多个操作同时修改一份数据&#xff0c;可能会导致数据不一致。这时候&#xff0c;我们需要“锁”来确保同一时间只有一个任务能够操作这个数据&#…

2024年CSP-J认证 CCF信息学奥赛C++ 中小学初级组 第一轮真题-完善程序题解析

2024CCF认证第一轮&#xff08;CSP-J&#xff09;真题 三、完善程序题 第一题 判断平方数 问题&#xff1a;给定一个正整数 n&#xff0c;判断这个数 是不是完全平方数&#xff0c;即存在一个正整数 x 使得 x 的平方等于 n 试补全程序 #include<iostream> #include<…