目录

一、简介

2.创建远程服务器

3.通过cmd终端访问远程服务器(使用密码)

4.在新服务器上更新包

5.关于SSH密钥

6.创建 SSH 密钥

7.访问公钥

8.发送公钥到远程服务器

9.通过cmd终端访问远程服务器(使用SSH密钥)

10.从客户端发送文件到服务器

11.从服务器发送文件到客户端

12.在服务器上创建用户

13.在服务器上禁用密码访问

14.在服务器上禁用root访问

15.创建SSH配置文件(非常好用)

16.在服务器上托管网站

17.管理SSH服务器的轻量级客户端

18.通过 SFTP 传输文件

19.审核 SSH 密钥

简介

在使用 SSH 管理远程机器的好处中,我们可以列出:

  • 不需要密码

  • 加密通信

很多人,特别是Windows,倾向于推荐一个叫PuTTY的 GUI 客户端来设置 SSH 连接。只要你在Windows 10上,OpenSSH就已经在你的计算机上,所以不要费心安装PuTTY

在本文结束时,您将学会如何:

  • 创建远程servers

  • Windows/Linux设备创建 SSH 连接以访问这些servers

  • servers上禁用密码验证,因此它们将不易受到暴力攻击

  • 在本地设备和这些设备之间来回传输文件servers

  • 在远程servers上托管您的自定义网站

创建远程服务器

这部分我们将使用Digital Ocean。创建server非常简单。在那里寻找 create droplet 选项。在这里,我们对要创建的新server有一些设置建议:

  • 选择图像/操作系统:Ubuntu

  • 选择计划:最便宜的一个

  • 选择一个数据中心:哪个离你更近

  • 身份验证方法:密码。我们将手动设置 SSH,然后禁用密码验证(暂时将此密码保存到文本文件中)

  • 液滴数(服务器):1

  • 选择一个主机名:ubuntu-one

现在点击“创建液滴”按钮

一些参考截图:

[图像](https://res.cloudinary.com/practicaldev/image/fetch/s--FNEGYur5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/pq08uz1awffw5ljcunov.png)

[图像](https://res.cloudinary.com/practicaldev/image/fetch/s--_wfiih9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/2iw7gx1ghynsnln9ar2b.png)

创建服务器后,您将可以访问其 IP 地址。我的是142.93.169.195,而你的将是不同的。

通过在此网站上验证其 IP 地址来检查机器是否“真实”:

http://ifconfig.co/?ip=142.93.169.195(使用你的IP,而不是这个)

通过cmd终端访问远程服务器(使用密码)

ssh root@142.93.169.195

进入全屏模式 退出全屏模式

在哪里:

root:用户

142.93.169.195:服务器IP

系统将提示您输入有关 ECDSA 密钥指纹的消息。键入**“是”**。

一旦你对此说,请注意在$HOME/.ssh文件夹中将有一个known_hosts文件。此文件“记住”当前client设备之前连接的servers。每次您连接到新的server时,其指纹都会保存在这里(您会收到通知)。这是一种验证您正在连接的server确实是您认为的那个的机制。

系统将提示您输入密码(创建server时设置的密码)。粘贴到这里。

它就在那里。如果您的终端更改为root@ubuntu-one,则您已连接到远程server!

在新服务器上更新包

这是可选的,但推荐,因为您可能会在此server上安装其他软件。在server上运行:

apt update
apt upgrade

进入全屏模式 退出全屏模式

关于SSH密钥

SSH 是一种身份验证方法,我们将在访问远程servers时将其用作使用密码的替代方法。SSH 密钥是由两部分组成的密钥。以下是它们的不同之处:

  • Public: 它旨在共享,并放置在您将连接到的server上。

  • 私人: 它不应该被共享,甚至不应该被其他任何人看到。如果这部分落入坏人之手,有人可能会在他们的client计算机上使用它并访问密钥的servers! ⚠️

您可以在设备上存储多个 SSH 密钥。一旦你有了一个,将public部分发送到server。在那里,它将被存储在一个专门的地方。要建立连接,您将选择一个private密钥,而server将检查与它们预先存在的public密钥是否匹配。

[图像](https://res.cloudinary.com/practicaldev/image/fetch/s--9llNx6_R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/6sqzj5rl0hozt4gpbapq.png)

创建 SSH 密钥

为了使其更容易,请下载并运行以下脚本之一。他们使用ed25519算法来创建密钥,因为它提供了更复杂的加密并生成了更小的密钥。

创建 SSH 密钥时,系统会提示您输入一个可选的passphrase,当您尝试使用它时会要求您输入。 强烈建议您设置passphrase,因为如果您的private密钥被泄露并且它没有passphrase,那么其他人实际上可以在他们的client计算机上使用它,并且很可能能够访问密钥具有的servers进入。 😱

Windows (PowerShell)

Linux (bash)

通常,SSH 密钥存储在$HOME/.ssh目录下(.表示.ssh是隐藏文件夹),但您可以在其他地方拥有它们。我创建了一个名为costa的 SSH 密钥,所以在这里我可以期望在 2 个文件中看到 2 部分密钥:

  • costa(专用,无分机)

  • costa.pub(公)

访问公钥

通过以下方式查看其内容:

cat costa.pub 

进入全屏模式 退出全屏模式

或者使用文本编辑器,你会得到这样的东西:ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN7ioJG5Axxcksw47AujdY/Lke8ZJoWRPSDsV6pc/reK costa

将公钥发送到远程服务器

登录server,然后:

cd /root/.ssh

进入全屏模式 退出全屏模式

在那里您将找到authorized_keys文件,这是必须插入public密钥的位置。通过使用文本编辑器打开文件,在此处手动粘贴public密钥:

nano authorized_keys

进入全屏模式 退出全屏模式

或者直接使用>>命令:

echo <your_public_key_content> >> authorized_keys

进入全屏模式 退出全屏模式

如果您使用第二个选项,请确保您使用>>(追加)而不是>(覆盖)⚠️

authorized_keys文件视为一个保管库,其中包含来自所有授权 SSH 的设备的所有public密钥,使用 SSH 密钥连接到此server

通过cmd终端访问远程服务器(使用SSH密钥)

现在public位于server上,我们应该准备好使用 SSH 密钥访问server!

首先,如果您在server上,请使用exit命令退出。

回到client,使用以下命令访问server。这次不会提示您输入密码。

ssh -i <private_key_file> <user>@<ip>

进入全屏模式 退出全屏模式

请注意,您实际上不需要使用-i提供private密钥路径,因为存储在/.ssh下的密钥会自动选取。但是当您开始添加更多键时,很可能在某些时候您将开始收到不匹配键的错误。为避免此类问题,我建议您始终指定密钥。

从客户端发送文件到服务器

回到client,让我们在您所在的当前目录中创建一个示例文件:

touch hello.txt 

进入全屏模式 退出全屏模式

现在让我们将其发送到server:

scp -i <private_key> hello.txt root@142.93.169.195:

进入全屏模式 退出全屏模式

在哪里:

::hello.txt将在server上保存的目录。本例中为 main/root 文件夹。

返回到server并验证hello.txt是否存在。

将文件从服务器发送到客户端

这个过程有点反直觉,因为你需要在client这边。就好像您正在 fetching 一个以前存储在server上的文件。

client上,我希望将hello.txt(已经保存在server上的那个)发送到client。首先,删除我们刚刚在client上创建的hello.txt:

rm hello.txt

进入全屏模式 退出全屏模式

现在获取hello.txt:

scp -i <private_key> root@142.93.169.195:hello.txt .

进入全屏模式 退出全屏模式

在哪里:

::表示server上的文件路径

.(最后):我希望将文件保存在client上的路径。注意.之前的空格。现在,确保您可以在client上看到hello.txt

在服务器上创建用户

以下脚本将创建一个新用户,授予其sudo权限并获取root用户的authorized_keys文件的副本。请记住,每个用户都有自己的authorized_keys文件。 ⚠️

client发送create-user.shserver上的主文件夹:

scp create-user.sh root@142.93.169.195:

进入全屏模式 退出全屏模式

回到server,您会看到create-user.sh在那里。运行它来创建一个新用户:

. create-user.sh

进入全屏模式 退出全屏模式

注意你的终端变成了<new_user>@ubuntu-one。现在检查<new_user>authorized_keys的内容:

cat /home/<new_user>/.ssh/authorized_keys

进入全屏模式 退出全屏模式

您将在此处看到您添加到root用户的相同public密钥。这意味着现在您可以使用相同的private密钥以<new_user>而不是rootSSH 连接到此server

现在您可以在连接到server时将root替换为<new_user>

在服务器上禁用密码访问

这不是必需的,但请注意,如果您尝试在没有 SSH 密钥的情况下连接到server,仍然会提示您输入密码。我们将禁用它,以便使用密码保护server免受暴力攻击。在server上,运行:

sudo nano /etc/ssh/sshd_config

进入全屏模式 退出全屏模式

请注意,要更改此文件,您需要sudo权限,因此需要sudo命令。

此文件包含有关 SSH 的设置。在其内容中,查找PasswordAuthentication。它可能已设置为yes,因此将其更改为no。另外,请确保它也没有**注释 (#)。保存更改并关闭此文件。

现在您需要重新启动 SSH 服务才能使更改生效:⚠️

systemctl restart sshd

进入全屏模式 退出全屏模式

从这一刻起,在尝试 SSH 连接到server时将不再提示您输入密码!😎

/etc/ssh/sshd_config文件中的设置适用于所有用户,因为 Linux 中的/etc文件夹具有全局范围。

在服务器上禁用 root 访问

这也不是必需的,但请记住,作为root用户远程连接到服务器存在许多安全问题。这个用户就像是Linux机器上的_上帝模式_,所以这个用户在server上可以造成很大的伤害! ⚠️

要禁用root访问,请返回:

sudo nano /etc/ssh/sshd_config

进入全屏模式 退出全屏模式

PermitRootLogin设置为no。现在再次重新启动 SSH Daemon 服务:

systemctl restart sshd

进入全屏模式 退出全屏模式

现在继续尝试以root用户身份访问server。您应该能够登录。

创建SSH配置文件(非常方便)

该文件使 SSH 连接到远程servers变得更加容易,而无需键入其 IP 地址和用户。这非常有用,特别是如果您计划连接到多个servers

client上,使用以下模板创建一个名为config的文件,并将其放在您的/.ssh文件夹中:

如果您想知道Port,22 是 SSH 连接的默认port。可以在server上的/etc/ssh/sshd_config文件上更改。另外,Host *下的设置广播到所有Hosts

设置此文件后,可以这样进行 SSH 连接:

ssh <custom_name>

进入全屏模式 退出全屏模式

简而言之,现在您可以将用户+IP地址+私钥+端口替换为简单的自定义别名。很方便,对吧? 😎

管理SSH服务器的轻量级客户端

SECRET是我在 GitHub 上的项目之一。在其中,您将找到shecret.exe(适用于 Windows)和secret(适用于 Linux)。这是一个通过命令行的轻量级 SSH/SFTP 客户端。您还可以使用它使用ed25519算法创建 SSH 密钥!

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--8biURxRi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/do78hza32b63jd1tkr6s.png)

在服务器上托管网站

我们将使用Apache作为 HTTP 服务器。在server上安装:

sudo apt install apache2 -y

进入全屏模式 退出全屏模式

client上,转到你的browser并访问server的 IP 地址。你会看到一个类似这样的页面:

[图像](https://res.cloudinary.com/practicaldev/image/fetch/s--_6aAlaxc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/nwnnq25cuk3ibpg15114.png)

下一步是在server上找到此页面,并将其替换为我们的自定义网站内容。

回到server,进入这个目录:

cd /var/www/html

进入全屏模式 退出全屏模式

您将在此处找到一个index.html文件。如果您检查其内容,您会注意到这是您在上页看到的文件。

我们将使用我的个人作品集作为我们自定义网站的示例。

回到client,在这里下载作为.zip文件,然后发送到server(主文件夹):

scp portfolio-master.zip <custom_name>:

进入全屏模式 退出全屏模式

回到server和 ,在那里有portfolio-master.zip文件,将此文件移动到/var/www/html/目录:

sudo mv portfolio-master.zip /var/www/html/

进入全屏模式 退出全屏模式

去那里:

cd /var/www/html/

进入全屏模式 退出全屏模式

安装unzip来解压这个文件:

sudo apt install unzip

进入全屏模式 退出全屏模式

现在您可以解压缩它:

unzip portfolio-master.zip

进入全屏模式 退出全屏模式

您也可以删除先前存在的index.html文件,因为我们将使用不同的文件:

rm index.html

进入全屏模式 退出全屏模式

解压后,我们得到一个/portfolio-master文件夹。我们不需要文件夹,只需要它的内容。所以我们将它们移动到当前文件夹(/var/www/html/):

sudo mv portfolio-master/* .

进入全屏模式 退出全屏模式

在哪里:

*:/portfolio-master文件夹中的所有文件

.:当前目录

现在您应该会在/var/www/html/中看到一堆文件,其中包括一个全新的index.html文件。

client端,再次访问browser上的 IP 地址,您将看到我的投资组合页面!

[图像](https://res.cloudinary.com/practicaldev/image/fetch/s--5TXh5jce--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/tef21x0yccfz4u50u2cn.png)

您现在可以安全地删除/portfolio-master文件夹和portfolio-master.zip文件,因为我们不再需要它们:

sudo rm -r portfolio-master/
sudo rm portfolio-master.zip

进入全屏模式 退出全屏模式

通过 SFTP 传输文件

我们了解到,scp可以用于从clientserver来回传输文件。但是,这种方法有一些局限性:

  • 在发出命令之前,您需要知道remotelocal机器上的文件及其各自的路径。

  • 如果传输由于某种原因中断,您需要重新开始。当传输大文件或互联网连接不稳定时,这可能会成为一个问题。

简而言之,它是包含 SSH 电池的 FTP(文件传输协议)。这意味着您可以使用已用于 SSH 的相同凭据。使用 SFTP 的好处包括:

  • 您可以在浏览server目录时选择要传输的文件。

  • 如果传输中断,可以恢复传输。

  • 它在自己的外壳中工作,具有非常有用的功能。

此时我假设您正在使用config文件来管理您的 SSH 连接,因此为了使用来自local的 SFTP 进行连接:

sftp <custom_connection_name>

进入全屏模式 退出全屏模式

您的外壳应该已更改为sftp>。⚠️

SFTP 的一些主要可能性:

下载serverlocal的文件:

get <filename>

进入全屏模式 退出全屏模式

local上传文件到server:

put <filename>

进入全屏模式 退出全屏模式

恢复下载失败:

如果下载失败或中断,您可以继续下载:

reget <filename>

进入全屏模式 退出全屏模式

恢复上传失败:

如果上传失败或中断,您可以恢复它:

reput <filename>

进入全屏模式 退出全屏模式

使用单个命令:

echo 'put <local_file_path_to_upload>'| sftp -i <key> <user>@<ip>
echo 'get <remote_file_path_to_download>'| sftp -i <key> <user>@<ip>

进入全屏模式 退出全屏模式

获取server的磁盘使用信息:

在将大文件发送到server之前方便使用。

df

进入全屏模式 退出全屏模式

列出local机器上的目录:

我个人觉得这个非常方便。

lls

进入全屏模式 退出全屏模式

切换到local机器上的shell:

!
#when you are done, exit

进入全屏模式 退出全屏模式

有关更多命令,请键入help

审核 SSH 密钥

当您授予更多人 SSH 访问您的服务器的权限时,您可能会想知道哪些密钥已用于登录以及何时登录等等。在 Linux 上,journactlctl用作审计工具。在我们的场景中,假设我想了解我的servertoday 的 SSH 连接。

journalctl -u ssh -S today

进入全屏模式 退出全屏模式

您会发现一些与此类似的条目:

Oct 06 02:46:03 ubuntu sshd[2403]:从 192.168.18.1 端口 54006 ssh2 接受的 costa 公钥:ED25519 SHA256:KcZdwz9jSWutRXORHXH995E2ThQn9zci1yaeSaaPKxc

乍一看,您可能会认为这是对存储在authorized_keys中的公共 SSH 的引用。实际上,它是公钥的哈希码。现在,检查authorized_keys中键的哈希码:

ssh-keygen -l -f .ssh/authorized_keys

进入全屏模式 退出全屏模式

现在您可以查找与journalctl条目的匹配项。在我们的例子中:SHA256:KcZdwz9jSWutRXORHXH995E2ThQn9zci1yaeSaaPKxc

您可以使用ssh-keygen -l -f <public_or_private_key_file>检查 SSH 密钥的哈希码。您会注意到公钥和私钥共享相同的哈希!

就是这样,人们。

感谢您花时间阅读本文!

跟着我:

领英|开发到|给我买杯咖啡|GitHub

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐