SSH config

news/2025/1/22 4:52:30/

背景

起因就是我发现大部分人对 SSH 只会基本的 ssh user@ip 的方式登录服务器,至多再会个配置免密,而对 SSH config 几乎不了解。事实上 SSH 可以灵活批量配置服务器信息,配置跳板等等。本文努力普及一些使用细节,希望有一天大家都熟练了 SSH config,以后我就可以直接给别人发送 SSH config 配置项而不需要作任何解释了。

SSH config

SSH config 作用就是可以把 SSH 相关的信息都记录到一个配置文件,可以简化操作、节约时间。
SSH config 有一个系统级的,一个用户级的。一般普通用户只关注用户级的。文件路径为 ~/.ssh/config 。

基本写法一般一个服务器写成一小段,形如:

Host Server1
Hostname 172.16.0.1
User zhangsan
Port 22
ServerAliveInterval 180
IdentityFile ~/.ssh/secret_key.pem
这段的含义为有一个服务器:
  1. 我们为它起了个名字叫 Server1
  2. 它的 IP 是 172.16.0.1(也可以填 Hostname)
  3. 我在上面的用户名是 zhangsan
  4. SSH 服务监听端口号为 22(即默认值,也可以不写这一行)
  5. ServerAliveInterval 180 表示在建立连接后,每 180 秒客户端会向服务器发送一个心跳,避免用户长时间没操作连接中断
  6. 最后一行表示使用一个专用的密钥,如果没有专用的密钥则删除该行即可。
登录这台服务器的话,输入:
$ ssh Server1
拷贝文件(反过来就是从服务器往本地下载文件):
$ scp /path/to/local/file Server1:/path/to/remote/
可以看到,这样的好处有:
(1)简洁,不需要记忆 IP 地址、端口号。
(2)可以保持连接。
配置免密也相同,输入以下命令并输入密码:
$ ssh-copy-id Server1

通配符

如果有一批服务器都是相同的配置,更是可以用通配符统一处理:
Host Server*
User zhangsan
Port 22
ServerAliveInterval 180
Host Server1
Hostname 172.16.0.1
Host Server2
Hostname 172.16.0.2
Host Server3
Hostname 172.16.0.3
相信读者已经猜到其中的含义。第一段表示所有名字为 Server 开头的服务器,他们的用户名都是 zhangsan,端口都是 22,同时都有保持连接的心跳。然后下面列了 3 台服务器,我们只需要指定它们的 IP 地址。

多文件管理

如果需要管理非常多的服务器,全写到一个文件里会很乱很难维护,也不方便共享。事实上,~/.ssh/config 中支持引用其它文件。我一般习惯新建一个这样的配置 ~/.ssh/config-cluster-shanghai ,在其中编写类似上文的内容。然后在 ~/.ssh/config 的开头加入如下一行即可:
Include config-cluster-shanghai
事实上这里也可以用通配符,比如:
Include config-*
这样 ~/.ssh/ 目录下的所有 config- 开头的文件都会被引用到。

跳板

很多集群需要跳板机才可登录,我们需要先登录跳板机,再从跳板机登录内部机器。这会引入两个麻烦,一是登录要两次,如果配置 SSH config 还需要在跳板机也配置一份儿;二是拷贝文件十分麻烦,要拷贝两次。
对此可以这样写配置:
Host Jumper
Hostname 1.2.3.4
User zhangsan
Host Server*
User zhangsan
ProxyJump Jumper
ServerAliveInterval 180
Host Server1
Hostname 172.16.0.1
Host Server2
Hostname 172.16.0.2
第一段为跳板机的登录方式,第二段中新增了一个 ProxyJump 字段,表示所有 Server 开头的服务器,在登录的时候都要从 Jumper 这个服务器跳转一下。这时候我们想登录 172.16.0.1,只需要直接输入:
$ ssh Server1
$ scp /path/to/local/file Server1:/path/to/remote/
注意一个细节是,这种配置下我们是直接从本地登录内部服务器,所以在配置免密时,是需要把本地的公钥放到内部服务器的。

SCP 服务器间拷贝文件

scp 的基本用法相信大家都会,上文也多次提到。但如果想在两台服务器之间拷贝文件,事实上是可以在本地执行 scp 的:
$ scp Server1:/path/to/file Server2:/path/to/file2
这个命令要求 Server1 可以直接访问 Server2。如果不满足这个条件,可以用本机转发,只需要增加一个参数 -3 表示用本地机器当转发机:
$ scp -3 Server1:/path/to/file Server2:/path/to/file2

批量操作 PSSH

如果有一组机器要做相同的操作,可以使用 PSSH 工具。 很遗憾的是,这个工具原作者已经不维护了,但 GitHub 上散落着原仓库的副本,同时也有大家新增的逻辑。
安装:
$ python3 -m pip install pssh
准备一个 iplist:
$ cat iplist
Server1
Server2
批量操作:
$ pssh -ih iplist echo Hello
[1] 14:27:50 [SUCCESS] Server1
Hello
[2] 14:27:50 [SUCCESS] Server2
Hello
-i 表示把 stdout 输出,否则只会显示命令执行是否成功。-h 表示 host 的列表,后接 iplist 这个文件名。pssh 默认会在命令超时后强制结束, 不希望超时,可以加一个 -t 0 表示超时时间为 0 秒,0 表示无穷大。
PSSH 也可以把每个服务器的结果输出到不同的目录、可以单独指定 Host 等等,大家可以参考 manpage:
$ man pssh

http://www.ppmy.cn/news/1565135.html

相关文章

Web前端开发技术之HTMLCSS知识点总结

学习路线 一、新闻网界面1. 代码示例2. 效果展示3. 知识点总结3.1 HTML标签和字符实体3.2 超链接、颜色描述与标题元素3.3 关于图片和视频标签:3.4 CSS引入方式3.5 CSS选择器优先级 二、flex布局1. 代码示例2. 效果展示3. 知识点总结3.1 span标签和flex容器的区别3.…

算法每日双题精讲 —— 二分查找(二分查找,在排序数组中查找元素的第一个和最后一个位置)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!&#x1f4aa…

Kotlin 2.1.0 入门教程(四)

基本类型 从某种意义上说,一切都是对象,因为您可以在任何变量上调用成员函数和属性。 虽然某些类型在运行时具有优化的内部表示形式(如数字、字符、布尔值等),但它们看起来和行为都像普通类。 即使基本类型&#xf…

PyTorch使用教程(3)-Tensor包

1、张量Tensor 张量(Tensor)是PyTorch深度学习框架中的核心数据结构,在PyTorch软件框架中,几乎所有的数据计算和信息流都是以Tensor的形式在表达。官方给出的定义是: 一个 torch.Tensor是一个包含单个数据类型元素的多维矩阵 关键词 单个数…

React 第二十一节 useDeferredValue 开发中用法注意事项

1、概述 useDeferredValue 是用于延迟渲染视图UI组件的,可以帮助我们管理视图渲染过程中的状态,并提高程序运行的性能; 2、用法 const deferredVal useDeferredValue(params)params: 是我们需要延迟的数据;可以是任何类型的数…

第7章:Python TDD测试Franc对象乘法功能

写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…

基于springboot+thymeleaf+Redis仿知乎网站问答项目源码

项目介绍 基于springbootthymeleafRedis仿知乎网站问答项目源码,可以作为毕业设计项目参考学习 按照需要一定动手能力 发文章,发视频,发想法,提问回答,注册登录 开发环境 使用技术:springbootthymeleafRe…

【Docker】搭建一个功能强大的自托管虚拟浏览器 - n.eko

前言 本教程基于群晖的NAS设备DS423的docker功能进行搭建,DSM版本为 DSM 7.2.2-72806 Update 2。 n.eko 支持多种类型浏览器在其虚拟环境中运行,本次教程使用 Chromium​ 浏览器镜像进行演示,支持访问内网设备和公网地址。 简介 n.eko 是…