关于 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
这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
然后将输出复制到剪贴板。
或者在 macOS 上你可以pbcopy
按如下方式运行:
$ pbcopy < ~/.ssh/id_rsa.pub
要将公钥的内容附加到远程服务器,您可以执行以下操作:
$ echo "...pasted public key...">>~/.ssh/authorized_keys
通过密码在远程服务器上创建授权
如果您想建立具有密码和自动生成的私钥-公钥的 SSH 连接,则需要编辑/etc/ssh/sshd_config
并确保这两个设置:
PasswordAuthentication yes
PermitEmptyPasswords no
更改后,您可以使用以下命令重新启动 ssh 服务器:
$ sudo service ssh restart
另外,请确保您连接的用户有密码:
$ sudo passwd the_user
连接到远程服务器
通过 SSH 连接到带有密码的远程服务器的默认方式是在终端中执行以下操作:
$ ssh the_user@example.com
要使用私钥连接,您可以执行以下操作:
$ ssh -i ~/.ssh/examplecom_id_rsa the_user@example.com
接下来,让我们看看如何使用一些本地 SSH 配置来简化这一点。
配置本地 SSH 客户端
~/.ssh/config
为要定义的每个 SSH 连接编辑并添加以下行:
Host examplecom
HostName example.com
User the_user
IdentityFile ~/.ssh/examplecom_id_rsa
如果网站的域名还没有指向服务器的IP地址,您也可以通过IP地址进行连接:
Host examplecom
HostName 1.2.3.4
User the_user
IdentityFile ~/.ssh/examplecom_id_rsa
下面允许您使用以下几行手动生成的私钥-公钥登录到您的远程服务器:
$ ssh examplecom
要请求密码而不是使用手动生成的密钥,您需要按如下方式修改代码片段:
Host examplecom
HostName example.com
User the_user
PubkeyAuthentication=no
当你通过 SSH 连接后,如果 30 分钟左右没有输入任何内容,连接就会断开。不过,你可以要求客户端每 4 分钟左右连接到服务器一次,只需在~/.ssh/config
本地计算机上的 开头添加以下几行:
Host *
ServerAliveInterval 240
使用 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
这是一个相同但具有自定义~/.ssh/config
配置的示例:
$ scp examplecom:~/src/myproject/myproject/settings/secrets.json ./myproject/settings/secrets.json
要将文件从本地计算机复制到远程服务器,您需要切换源和目标的位置:
$ scp ./myproject/settings/secrets.json examplecom:~/src/myproject/myproject/settings/secrets.json
rsync
要同步服务器和本地的目录,可以使用以下rsync
命令。下载目录的操作如下media/
(注意,末尾的斜杠很重要):
$ rsync --archive --compress --partial --progress the_user@example.com:~/src/myproject/myproject/media/ ./myproject/media/
以下是具有自定义配置的示例~/.ssh/config
:
$ rsync --archive --compress --partial --progress examplecom:~/src/myproject/myproject/media/ ./myproject/media/
要将media/
目录上传到远程服务器,您需要再次切换源和目标的位置:
$ rsync --archive --compress --partial --progress ./myproject/media/ examplecom:~/src/myproject/myproject/media/
安全FTP
像 Transmit 这样的 FTP 客户端允许您通过用户名和密码或用户名和私钥建立 SFTP 连接。您甚至可以直接在应用程序中生成私钥和公钥。
SFTP 的工作方式与 FTP 类似,但所有通信都经过加密。
最后的话
仅使用加密连接进行网络通信,如果使用手动生成的私钥-公钥则加密硬盘,并使用强密码。
注意安全!
封面照片由Jason D拍摄。
文章来源:https://dev.to/djangotricks/things-i-want-to-remember-about-ssh-21el