使用 SSH 和 SFTP 连接管理远程服务器:分步指南
目录
一、简介
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.sh
到server
上的主文件夹:
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>
而不是root
SSH 连接到此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
可以用于从client
到server
来回传输文件。但是,这种方法有一些局限性:
-
在发出命令之前,您需要知道
remote
和local
机器上的文件及其各自的路径。 -
如果传输由于某种原因中断,您需要重新开始。当传输大文件或互联网连接不稳定时,这可能会成为一个问题。
简而言之,它是包含 SSH 电池的 FTP(文件传输协议)。这意味着您可以使用已用于 SSH 的相同凭据。使用 SFTP 的好处包括:
-
您可以在浏览
server
目录时选择要传输的文件。 -
如果传输中断,可以恢复传输。
-
它在自己的外壳中工作,具有非常有用的功能。
此时我假设您正在使用config
文件来管理您的 SSH 连接,因此为了使用来自local
的 SFTP 进行连接:
sftp <custom_connection_name>
进入全屏模式 退出全屏模式
您的外壳应该已更改为sftp>
。⚠️
SFTP 的一些主要可能性:
下载server
到local
的文件:
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
用作审计工具。在我们的场景中,假设我想了解我的server
上 today 的 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
更多推荐
所有评论(0)