Ubuntu下如何管理多个ssh密钥

前言

我一直在逃避这个问题,误以为我能够单纯地用一个 ssh 走天下。

好吧,现实是我不得不管理多个 ssh 做,那就写个博客总结一下吧。

查阅后发现前人已经总结了不少,那我就结合之后,再发展一下吧,参考资料按照 markdown 的规范,放在文末。

Note:

  • 笔者 Ubuntu​ 为 24.04 LTS


目录


如何生成并添加第一个密钥

  1.  ssh-keygen -t rsa -C "youremail@yourcompany.com"

    然后一路回车,就会在 ~/.ssh​ 下生成 id_rsa​, id_rsa.pub

  2.  ssh-add ~/.ssh/id_rsa

    将密钥 id_rsa​ 添加到 ssh-agent​ 中。

  3.  ssh-add -l

    可以通过该命令来确认私钥列表。

  4.  ssh-add -D

    该命令可以清空私钥列表。

至于如何配置 gitee​ 和 github​ 等,则默认都会,这篇文章的重心在于如何管理多个 ssh 密钥。


生成并添加多个密钥

生成并添加多个密钥,我们就需要编辑 config​ 文件。

  1.  ssh-keygen -t rsa -C "username@address"

    然后,它就会让你 Enter file in which to save the key​,以及有一个默认的路径。

    可以手动输入自己想要保存的路径(绝对路径)。

    之后,会让你 Enter passphrase (empty for no passphrase)​,就是输入口令,空则无口令。这个口令,是用来加密你的私钥的,避免你的私钥泄漏后,任何人都能用这个私钥冒充你。

    确认一遍口令,Enter same passphrase again​。

    接下来就会告诉你 identification​ 私钥被存在哪里,以及 public key​ 公钥被存在哪里等等信息。

  2.  ssh-add ~/.ssh/your_identification

    我们将其添加到 ssh-agent​ 中。

  3.  vim ~/.ssh/config

    创建 ssh​ 的 config​ 文件。

    # gitee
    Host gitee.com
    HostName gitee.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/your_identification
    User You # github
    Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/your_identification
    User You

    Host: 取任意名字

    HostName: 这个是真实的域名地址

    IdentityFile:这里是 identification​ (私钥)的地址

    PreferredAuthentications:配置登录时用什么权限认证

    User:配置使用用户名

    1. PreferredAuthentications

      1. keyboard-interactive

        交互式认证方式,当 SSH 客户端尝试连接到服务器时,如果服务器配置为使用 keyboard-interactive​ 认证,服务器会向客户端发送一系列问题(通常是用户名和密码),客户端需要提供答案。

      2. password

        需要输入用户名和密码来连接服务器。

      3. publickey

        用户生成密钥对,将公钥配置在服务器上,连接服务器时,服务器会要求用户提供公钥对应的私钥来证明身份。

  4.  ssh -T git@[Host]

    配置完成后,你就可以通过上面的命令来检验是否配置正确。


算力平台与服务器

password 或 keyboard-interactive 登录

通常,你只能获得服务器地址,用户名和密码(也就是,你不能编辑服务器的 ssh​ 设置的话)。这种情况下,我们只能这样进行 config​ 文件的编辑,即不设置 IdentityFile​,PreferredAuthentications​ 设置 password​ 或者 keyboard-interactive​ :

Host platform
HostName address
PreferredAuthentications keyboard-interactive
User You


配置 publickey 登录

如果说,你能编辑服务器的 ssh​ 设置,或者说你能获得服务器的 ~/.ssh/authorized_keys​ 的文件中所允许的公钥所对应的密钥的话,那么,我们就可以去设置 publickey​ 登录。

我们以 Ubuntu​ 服务器为例。

  1. 在能够连接到服务器的前提下(无论是用 password​ 方式登录也好,还是远程桌面也好,亦或者是直接在网页登录也好)

  2. 首先,假设服务器(你试图连接的)和客户端(你目前在用的电脑之类的)上没有密钥对

  3. 生成一个密钥对,并添加私钥到客户端(具体操作看前面)

  4. 把公钥使用 ssh-copy-id​ 复制到远端服务器(成功的话,就会自动将公钥添加到服务器的~/.ssh/authorized_keys​文件中,并且会处理好目录和文件权限的问题)

    ssh-copy-id [options] user@host-ip

    如果你的服务器没有 openssh 服务器的话(大部分情况下都会预下载有),你可以通过下面的命令来安装

    sudo apt -y update
    sudo apt -y install openssh-server

    然后输入下面的命令检查 SSH 服务状态

    systemctl status ssh

    不出意外,会看到 active (running)​ 类似的字样。

    如果说,没有启动的话,通过下面的命令启动

    systemctl start ssh
  5. 有人或许会问,我直接复制公钥内容粘贴可以不,当然可以,只是步骤稍微复杂一点,你需要手动处理一个问题

    1. 你需要手动将公钥的内容,添加到 ~/.ssh/authorized_keys​ 文件中
  6. 你需要编辑服务器的 SSH 配置文件 /etc/ssh/sshd_config

    sudo vim /etc/ssh/sshd_config

    找到 #Port 22​ 修改端口号(16位数字)为一个合适的数字,注册端口(Registered Ports) \([1024,49151]\) 或者动态或私有端口(Dynamic or Private Ports) \([49152,65535]\),假设我们设置为 8888

  7. 编辑 config 文件

    Host ExampleHost
    HostName 192.168.1.100
    Port 8888
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/example_rsa_key
    User user
  8. ssh -T user@[Host] -p [Port]​ 测试一下能否连接

还有一种情况,你能获取服务器的 ssh 私钥(即服务器上有密钥对),那么你要做的很简单:

  1. 添加你所获取到的密钥到客户端的 ssh-agent
  2. 确认 ~/.ssh/authorized_keys​ 中有无获取的密钥的公钥,无则添加
  3. 确认 /etc/ssh/sshd_config​ 的配置,端口号等信息
  4. 编辑 config 文件
  5. ssh -T user@[Host] -p [Port]​ 测试一下能否连接


连接gitee,但出现问题

你可能会看到类似这样的信息,如果你直接回车,就会告诉你 Host key verification failed​ ,然后就退出来,无法连接:

The authenticity of host 'gitee.com (180.76.198.77)' can't be established.
ED25519 key fingerprint is SHA256:+ULzij2u99B9eWYFTw1Q4ErYG/aepHLbu96PAUCoV88.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

这是 SSH 客户端用来防止中间人攻击(MITM)的的措施,当你第一次连接到一个 SSH 服务器时,客户端会要求你确认服务器的密钥指纹是否与你已知的指纹匹配。如果指纹匹配,你可以确信你正在连接到正确的服务器。

也就是说,我们需要自己确认一下服务器的密钥指纹是否正确,如果正确,我们要进行添加才能避免这样的信息出现。

如果我们确认密钥指纹正确,我们就可以输入 yes​ 的选项,则会有下面的信息:

Warning: Permanently added 'gitee.com' (ED25519) to the list of known hosts.

警告我们,已经永久把这个服务器的密钥指纹添加到已知指纹中了。

此后再连接 gitee.com​ ,就不会出现这样上面的问题了。


结合 vscode​ 使用

结合 vscode​ 使用很简单,下载对应的插件即可(如果前面你已经在相应文件下写了 config​ 文件的话)。

个人下载了下面的插件:

  • Remote - SSH
  • Remote - SSH: Editing Configuration Files
  • Remote - Tunnels
  • Remote Explorer

然后,不出意味的话,点击左边旁栏的 Remote Explorer​ 就可以看到先前已经配置好的远程服务器了。


参考资料

Ubuntu下如何管理多个ssh密钥的更多相关文章

  1. Mac OS X下配置远程Linux 服务器SSH密钥认证自动登录

    1. 在本地机器创建公钥 打开万能的终端,执行如下命令,无视一切输出,一路欢快地回车即可. ssh-keygen -t rsa -C 'your email@domain.com' -t 指定密钥类型 ...

  2. Git管理多个SSH密钥,Git多帐号配置

    版权声明:转载须标明本文转自严振杰的博客 https://blog.csdn.net/yanzhenjie1003/article/details/69487932版权声明:转载必须注明本文转自严振杰 ...

  3. ubuntu下显卡管理

    1 Ubuntu下卸载ATI显卡驱动并还原开源驱动[转] 首先卸载已经安装的ATI显卡驱动:cd /usr/share/ati/sudo ./fglrx-uninstall.sh 接着执行下面的代码: ...

  4. SourceTree Git可视化管理工具通过 ssh 密钥登录

    整个流程分三步:① 生成SSH密钥:② Github/Gitee/Coding 代码托管平台绑定公钥:③ SourceTree 拉取代码 1.生成 SSH 密钥 这里直接使用 SourceTree 来 ...

  5. Ubuntu下升级Git以及获取ssh keys的代码

    今天开始用的git,记下获取ssh keys 的代码 ? 1 2 3 ssh-keygen -t rsa -C "your_email@example.com" # Enter f ...

  6. Mac下配置远程Linux 服务器SSH密钥认证自动登录

    1. 在本地机器创建公钥 打开万能的终端,执行如下命令,无视一切输出,一路欢快地回车即可. ssh-keygen -t rsa -C 'your email@domain.com' -t 指定密钥类型 ...

  7. Linux Ubuntu下软件包管理

    自己整理的一个关于dpkg, apt, aptitude三者的常用命令,方便以后查阅. dpkg: dpkg是用来安装.deb文件,但不会解决模块的依赖关系,且不会关心ubuntu的软件仓库内的软件, ...

  8. Ubuntu下Hadoop的安装和配置

    最近又需要要搭hadoop环境,所以开始学习,下面是我的笔记,仅供大家参考! Hadoop安装: JDK1.6+ 操作系统:Linux,Window和Unix也可以做Hadoop的开发,只有Linux ...

  9. Git客户端部署使用-生成ssh密钥2

    1. 设置用户名 其中双引号中的 XXX 是用户名,记得替换成自己的用户名,需要注意的是这里的用户名是git服务器所使用的名称,一般公司用的都是员工名称的全拼. # 在git窗口中输入命令行: git ...

  10. Ubuntu下SSH设置

    网上有很多介绍在Ubuntu下开启SSH服务的文章,但大多数介绍的方法测试后都不太理想,均不能实现远程登录到Ubuntu上,最后分析原因是都没有真正开启ssh-server服务.最终成功的方法如下: ...

随机推荐

  1. Qt编写物联网管理平台44-告警邮件转发

    一.前言 上一篇文章说的是告警短信发送,这种效率非常高,缺点也很明显,需要购买特定的短信硬件设备支持才行,而且每条短信都要收费,如果要求发送的短信数量特别多,这个费用常年累月下来也是不少的,客户就不愿 ...

  2. 阿里IM技术分享(五):闲鱼亿级IM消息系统的及时性优化实践

    本文由阿里闲鱼技术团队有攸分享,原题"向消息延迟说bybye:闲鱼消息及时到达方案",有修订和改动,感谢作者的分享. 1.引言 IM消息作为闲鱼用户重要的交易咨询工具,核心目标有两 ...

  3. CH32V203F6P6-TSSOP20测试之01---初次测试

    一.收到空板 今天收到嘉立创打样的CH32V203F6P6-TSSOP20测试板子, 二.焊上元件 赽快焊接上元件并作测试. 三.上机测试 插好USB线,运行WCHISPStudio, 按BOOT不放 ...

  4. 中间件 vs 过滤器

    在 ASP.NET Core 中,中间件(Middleware) 和 过滤器(Filters) 是两种不同的机制,用于处理请求和响应的管道.它们的作用和适用场景有所不同,以下是它们的对比和详细说明: ...

  5. 10.3 - AM - 模拟赛 总结

    复盘 T1 很水,一道异或求和,但是某两位仁兄因没打括号而死. T2 很水,一道字符串处理,但是我和某位仁兄因没特判而死(虽然没有 hack 掉我,所以我理论上还是满分). T3 不水,看了很久,没想 ...

  6. NET Core3.1 Cors 添加跨域支持

    在 Startup 里加: services.AddCors(options => options.AddPolicy( DefaultCors, p => p.SetIsOriginAl ...

  7. STL 容器操作

    vector set转化为vector:vec.assign(set.begin(), set.end()) map 1. map默认从小到达排序,想要从大到小,可以: map<string, ...

  8. MongoDB 常用指令(详细)

    # MongoDB 常用指令## 基础命令### 启动与连接```bash# 启动 MongoDB 服务mongod# 连接 MongoDB 客户端mongo```### 数据库操作```bash# ...

  9. Codeforces Round 961 (Div. 2)

    题目链接:Codeforces Round 961 (Div. 2) 总结:B1wa两发可惜,C出得有点小慢. A. Diagonals fag:贪心 Description:给定一个\(n * n\ ...

  10. 0425-字符输入流FileReader

    package A10_IOStream; import java.awt.datatransfer.StringSelection; import java.io.IOException; impo ...