关于 SSH 我想要记住的事情

2025-05-24

关于 SSH 我想要记住的事情

SSH,即 Secure Shell(安全外壳)的缩写,是一种用于安全网络通信的协议。它广泛用于在远程服务器上执行命令以及文件上传或下载。如果您使用 Django、使用 Git 版本控制或管理服务器,那么您肯定在使用 SSH。在本文中,我想分享一些关于它的技术细节。

安全外壳使用私钥和公钥对。您可以使用自动生成的私钥和公钥以及密码,也可以手动生成私钥和公钥。在手动生成私钥和公钥的情况下,您需要将私钥保存在计算机上,并将公钥上传到远程服务器。

手动创建一对 SSH 密钥

如果您正在使用 GitHub、Bitbucket、DigitalOcean 或其他服务,您可能已经看到了上传公共 SSH 密钥以直接访问远程服务器的可能性。

在要建立安全连接的计算机(本地计算机或有权访问其他服务器或服务的服务器之一)上,通常可以按照以下方式创建 SSH 密钥。在终端中,您可以执行以下命令:

$ ssh-keygen
$ ssh-agent /usr/local/bin/bash
$ ssh-add ~/.ssh/id_rsa
Enter fullscreen mode Exit fullscreen mode

id_rsa是默认 SSH 私钥的名称。公钥为id_rsa.pub。默认情况下,它们都位于 下~/.ssh/

运行时,ssh-keygen您可以选择不同的密钥名称,甚至可以添加密码。例如,您可以拥有用于与 GitHub 通信的github_id_rsa密钥github_id_rsa.pub。我建议为每个新服务创建一个新的私钥-公钥对,这样,如果您需要将计算机数据传输到其他计算机,就可以选择性地将访问权限转移到远程服务器。

另外,如果您没有使用 SSH 密钥对的密码,我建议您加密磁盘并为计算机设置一个安全的用户密码。这样,即使您的笔记本电脑被盗,窃贼在不知道您电脑密码的情况下也无法访问您的远程服务器。

通过 SSH 密钥创建对远程服务器的访问

对于 GitHub、Bitbucket 和其他具有 SSH 通信的在线服务,通常必须将公钥的内容复制到 Web 表单中的文本字段中。

如果您想通过手动生成的私钥-公钥与部署 Django 项目的服务器建立安全通信,您应该将公钥的内容附加到~/.ssh/authorized_keys远程服务器上的文件中。

要在终端中获取公钥的内容,您可以使用:

$ cat ~/.ssh/id_rsa.pub
Enter fullscreen mode Exit fullscreen mode

然后将输出复制到剪贴板。

或者在 macOS 上你可以pbcopy按如下方式运行:

$ pbcopy < ~/.ssh/id_rsa.pub 
Enter fullscreen mode Exit fullscreen mode

要将公钥的内容附加到远程服务器,您可以执行以下操作:

$  echo "...pasted public key...">>~/.ssh/authorized_keys
Enter fullscreen mode Exit fullscreen mode

通过密码在远程服务器上创建授权

如果您想建立具有密码和自动生成的私钥-公钥的 SSH 连接,则需要编辑/etc/ssh/sshd_config并确保这两个设置:

PasswordAuthentication yes
PermitEmptyPasswords no
Enter fullscreen mode Exit fullscreen mode

更改后,您可以使用以下命令重新启动 ssh 服务器:

$ sudo service ssh restart
Enter fullscreen mode Exit fullscreen mode

另外,请确保您连接的用户有密码:

$ sudo passwd the_user
Enter fullscreen mode Exit fullscreen mode

连接到远程服务器

通过 SSH 连接到带有密码的远程服务器的默认方式是在终端中执行以下操作:

$ ssh the_user@example.com
Enter fullscreen mode Exit fullscreen mode

要使用私钥连接,您可以执行以下操作:

$ ssh -i ~/.ssh/examplecom_id_rsa the_user@example.com
Enter fullscreen mode Exit fullscreen mode

接下来,让我们看看如何使用一些本地 SSH 配置来简化这一点。

配置本地 SSH 客户端

~/.ssh/config为要定义的每个 SSH 连接编辑并添加以下行:

Host examplecom
    HostName example.com
    User the_user
    IdentityFile ~/.ssh/examplecom_id_rsa
Enter fullscreen mode Exit fullscreen mode

如果网站的域名还没有指向服务器的IP地址,您也可以通过IP地址进行连接:

Host examplecom
    HostName 1.2.3.4
    User the_user
    IdentityFile ~/.ssh/examplecom_id_rsa
Enter fullscreen mode Exit fullscreen mode

下面允许您使用以下几行手动生成的私钥-公钥登录到您的远程服务器:

$ ssh examplecom
Enter fullscreen mode Exit fullscreen mode

要请求密码而不是使用手动生成的密钥,您需要按如下方式修改代码片段:

Host examplecom
    HostName example.com
    User the_user
    PubkeyAuthentication=no
Enter fullscreen mode Exit fullscreen mode

当你通过 SSH 连接后,如果 30 分钟左右没有输入任何内容,连接就会断开。不过,你可以要求客户端每 4 分钟左右连接到服务器一次,只需在~/.ssh/config本地计算机上的 开头添加以下几行:

Host *
    ServerAliveInterval 240
Enter fullscreen mode Exit fullscreen mode

使用 SSH 连接上传和下载文件

通常,安全 Shell 允许您使用 bash、zsh、sh 或其他 Shell 在远程服务器上执行终端命令。但很多时候,您还需要安全地与服务器之间传输文件。为此,您可以选择以下选项:scp命令、rsync命令或SFTP支持 FTP 的客户端。

SCP

代表scp安全复制。

这是将secrets.json文件从远程服务器复制到本地开发环境的方法:

$ scp the_user@example.com:~/src/myproject/myproject/settings/secrets.json ./myproject/settings/secrets.json
Enter fullscreen mode Exit fullscreen mode

这是一个相同但具有自定义~/.ssh/config配置的示例:

$ scp examplecom:~/src/myproject/myproject/settings/secrets.json ./myproject/settings/secrets.json
Enter fullscreen mode Exit fullscreen mode

要将文件从本地计算机复制到远程服务器,您需要切换源和目标的位置:

$ scp ./myproject/settings/secrets.json examplecom:~/src/myproject/myproject/settings/secrets.json
Enter fullscreen mode Exit fullscreen mode

rsync

要同步服务器和本地的目录,可以使用以下rsync命令。下载目录的操作如下media/(注意,末尾的斜杠很重要):

$ rsync --archive --compress --partial --progress the_user@example.com:~/src/myproject/myproject/media/ ./myproject/media/
Enter fullscreen mode Exit fullscreen mode

以下是具有自定义配置的示例~/.ssh/config

$ rsync --archive --compress --partial --progress examplecom:~/src/myproject/myproject/media/ ./myproject/media/
Enter fullscreen mode Exit fullscreen mode

要将media/目录上传到远程服务器,您需要再次切换源和目标的位置:

$ rsync --archive --compress --partial --progress ./myproject/media/ examplecom:~/src/myproject/myproject/media/
Enter fullscreen mode Exit fullscreen mode

安全FTP

像 Transmit 这样的 FTP 客户端允许您通过用户名和密码或用户名和私钥建立 SFTP 连接。您甚至可以直接在应用程序中生成私钥和公钥。

SFTP 的工作方式与 FTP 类似,但所有通信都经过加密。

最后的话

仅使用加密连接进行网络通信,如果使用手动生成的私钥-公钥则加密硬盘,并使用强密码。

注意安全!


封面照片由Jason D拍摄。

文章来源:https://dev.to/djangotricks/things-i-want-to-remember-about-ssh-21el
PREV
在 .NET 8 中轻松构建 REST API!
NEXT
我如何构建我的 React /TS 应用程序(2021)