前言
到现在为止,你已经学会了在本地编辑文档的所有技巧,那么你就可以尽情地表达你的想法了。
这篇文章,是为了教会你如何用SSH远程连接服务器。再生成密钥对,实现免密码登录。
时隔四年,重启Hexo历险计划!
SSH为Secure Shell
的缩写,是为远程登录会话和其他网络服务提供安全性的协议。只要本机和远程服务器都有SSH服务,那么就可以使用SSH服务进行连接,实现文件复制和命令运行。
检查SSH
Linux
先检查一下远程服务器是否有ssh服务,一般来说是都有的,出现如图结果即为存在。那么你就可以直接跳过安装SSH,直接开始生成密钥对。
sudo ps -e |grep ssh
Windows
:开启服务
net start sshd
Mac
sudo systemsetup -getremotelogin
安装SSH
但是,倘若是新购买的服务器,或者是新拉取的Docker系统镜像中也是存在没有的可能性。
Linux
以CentOS系统为例,使用包管理器yum
安装sshd
服务。
# 更新包管理器
yum update -y
# 安装初始化脚本和网络工具
yum install -y initscripts net-tools.x86_64
# 安装包括ssh在内的诸多小工具。
yum install -y openssh-server
Windows
设置->应用->可选功能->添加功能,选择OpenSSH服务器,点击下载即可。
Mac
Mac本身是安装了SSH服务,只是默认情况下是不会开机自启的。
: 启动sshd服务:
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
: 停止sshd服务:
sudo launchctl unload -w /System/Library/LaunchDaemons/ssh.plist
:打开开机自启服务
sudo systemsetup -setremotelogin on
:关闭开机自启服务
sudo systemsetup -setremotelogin off
本地配置长时间连接
一般来说,SSH连接如果一段时间内没有信息交互,就会自动断开。
所以为了长时间保持ssh连接,可以修改/etc/ssh/ssh_config
文件,要求60s内发送一个信息来保持连接。
ServerAliveInterval 30
ServerAliveCountMax 10
生成密钥对
首先,在本地生成了密钥对,以[email protected]
邮箱为例。
运行命令会询问你,是否要配置SSH密钥的密码,一般来说都是直接敲击两次回车,直接生成没有密码的密钥。没错,密钥也是可以设置密码的。但是我使用密钥的原因,就是为了省去输入密码的麻烦,自然不会再多此一举。
ssh-keygen -t rsa -C '[email protected]' -f ~/.ssh/github_id_rsa
-
-t
:指定要创建的密钥类型为RSA -
-C
:添加注释,一般是用邮箱 -
-f
:指定用来保存密钥的目录位置及文件名,~/.ssh/github_id_rsa
可以用编辑器打开私钥文件github_id_rsa
查看内容。一般私钥文件是保存到自己本地PC的,不要在网络上存储备份,也不要发给任何人,因为只有他能通过公钥校验的。
-----BEGIN OPENSSH PRIVATE KEY-----
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
n0I6NcH5GwQ30AAAALMTIzQDEyMy5jb20=
-----END OPENSSH PRIVATE KEY-----
可以用编辑器打开公钥文件github_id_rsa.pub
查看内容。公钥文件一般就是放在服务器的指定位置,当本地PC通过SSH服务进行连接时会用公钥和私钥进行计算匹配,如果不匹配就只能用账号和密码登录了。
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCz2g8WxP4rSXSogMoMg+rmeniH6GG7EroodU4YtuwmZ5jZHXw+IrY4IXSulEHqCj/+j5nZ4nyzsgTFGT9zoYIR5ikpOSc0xM4qpEsCrQrkMVFR2BrFs+uRLqJ/IkF3URqk4vFkeoentdCwgd93fXookM+5PwQomCwHNl4TXaRzxPVYKO5D3HUlvzQJDzBtwMqRZlRPQEPUTcwKmp2g4qDHtvc889nE6JsBUZSLDdbNYJcmrKvmCiOxrV0GgSQtuPGOwhpP0QzsZM86t7lcsYF8kRNooFj4XEJU8gdgNLOBI+IbD8l1QkKPRVBxu5tPz9PicOoLm0/jR6xsvy2zu0sTfKWvhs/GKo7GhU0Uj820iNqVQMqEbTwZpH/WKDRCciGRJBym3gpw7sGGWW3KZTI9Yn4177xZRYqjqM1xqzLay2I7+VgOJuNWR1ZDq+EofJgGYykFWrBDQqBYkXT0EkRqQdNuhpAZ6vy+KcXY7RExaJbVIgDXm00cdlIh7iIkKIc= [email protected]
服务器配置公钥
往远程服务器上面配置密钥总共有三种方式:
- 登录阿里云控制台,从网页导入SSH公钥证书
- 在本地PC使用
ssh-copy-id
命令来复制公钥到指定服务器的指定用户下 - 手动复制公钥内容到服务器
小白第一次玩服务器就用第一个方法吧,简单粗暴地配置root
账户!就是会默认把密码登录禁用,只能使用秘钥登录。当然可以改为同时用密钥和密码登录。
第二个方法也简单,一个命令就能完成复制。而且弥补了第一个方法只能配置root
账户的缺陷,老手就是用它配置其他自定义账户。中间会需要账户的密码进行一次校验,之后就不需要了。
第三个方法是最复杂的,需要手动修改文件,很高的危险性。一个不小心就彻底GG,只能用备份文件恢复或者重置系统。好处就是你能够明确地了解自己究竟干了什么。
三个方法各有优劣吧,一般来说就是第一和第二个方法实现配置公钥。第三个方法很少使用。
阿里云控制台导入证书
致敬官方文档。
在阿里云控制台导入证书的话,阿里云对root用户做的事是两步:
- 将公钥信息追加到服务器的
/root/.ssh/authorized_keys
文件中; - 修改
/etc/ssh/sshd_config
文件中的PasswordAuthentication
为no
这种方式会默认把密码登录禁用,只能使用秘钥登录。
ssh-copy-id
在本地PC使用ssh-copy-id
命令,一条命令可以完成复制公钥。注意:中间需要输入账户密码。
: ssh-copy-id -i 公钥文件 账户名称@服务器的公网IP
ssh-copy-id -i ~/.ssh/github_id_rsa.pub [email protected]
-
-i
:指定私钥文件位置,例如我的就是~/.ssh/github_id_rsa.pub
- 账户名称,指定的是管理员账户
root
- 我之前服务器是阿里云的,外网IP就是
39.96.12.167
手动复制公钥
SSH在尝试远程登录的时候,会去指定用户的根目录下寻找~/.ssh/authorized_keys
文件,再依次读取文件中的每一行公钥跟本地PC的密钥进行匹配,如果匹配成功就建立连接。
既然如此,那么我们以给keen用户新增公钥来进行一次示例。
第一步,将本地的github_id_rsa.pub
公钥信息追加到远程服务器的~/.ssh/authorized_keys
文件,注意附加权限。
# 切换至自己创建的keen用户
su keen
# 创建 ~/.ssh 文件夹
mkdir ~/.ssh
# 创建 ~/.ssh/authorized_keys 文件
vim ~/.ssh/authorized_keys
# 按`i`进入编辑模式,用剪贴板把本地的公钥复制进去
# 按`ESC`退出编辑模式
# 输入英文的`:wq`写入文件并退出到命令行
#并赋予相应的权限
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
第二步,修改服务器SSH配置文件,如果觉得用vim
比较不习惯可以用scp
复制到本地,用界面化的应用(类似VS Code
)编辑后再重新复制回去,注意保存备份!
# 编辑配置文件
vim /etc/ssh/sshd_config
# 将服务器文件复制到本地电脑
scp [email protected]:/etc/ssh/sshd_config /Users/keen/Downloads
# 将本地文件复制到目标服务器
scp /Users/keen/Downloads/sshd_config [email protected]:/etc/ssh/
配置修改的内容如下,重点是一定要打开RSA认证,允许公钥验证,至于是否允许密码登录看个人喜好了。其他的配置都是锦上添花,不配置也无妨的。
# RSA验证
RSAAuthentication yes
# 公钥校验
PubkeyAuthentication yes
# 指定公钥文件
AuthorizedKeysFile .ssh/authorized_keys
# 允许密码登录
PasswordAuthentication yes
# 保持长时间的链接
ClientAliveInterval 60
ClientAliveCountMax 3
# 最大允许链接数,默认10
MaxSessions 1000
# 最大允许保持多少个未认证链接(未输入登录密码),默认值是10
MaxStartups 10
第三步,重启sshd
服务,让配置生效。
systemctl restart sshd.service
成功效果
如果不需要输入密码出现这个画面,证明成功。
ssh root@server_ip
本地配置多个私钥
如果你跟我一样是有多个服务器需要同时配置SSH密钥免密码登录,那么你就可以看看这个配置。
再生成一个 Gitlab 用的密钥对,其中 gitlab_id_rsa
为密钥的文件名,~/.ssh/gitlab_id_rsa
为密钥目录位置。
ssh-keygen -t rsa -C '[email protected]' -f ~/.ssh/gitlab_id_rsa
新建配置文件~/.ssh/config
,来指定哪个服务器使用哪个密钥。
touch ~/.ssh/config
其中文件内容如下。
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id_rsa
# gitlab
Host gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitlab_id_rsa
# 如果生成多个 SSH-Key , 则按上面的格式继续往下写
-
Host
:服务器的域名或者IP -
HostName
:服务器的域名或者IP -
IdentityFile
指定私钥的路径,在生成SSH-Key
时,我们已经指定该路径,拷贝过来即可
注意:需要给配置文件指定权限!
Mac系统直接使用命令即可指定配置文件的权限。
sudo chmod 600 ~/.ssh/id_rsa
Windows系统,在id_rsa
文件上右击,选择路径为属性-安全-高级
,点击窗口左下角的禁用继承
,然后删除权限条目里除自己以外的人。
断开SSH
在本地终端断开ssh连接而不关闭终端窗口的方法有两个。
-
法1:快捷键
Ctrl+D
-
法2:输入命令
logout
重新连接
如果在重置了远程服务器后,由于.ssh/known_hosts
中的信息不匹配,会出现如下警告。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:Vg0673orrEkccGdVfQzK8viE/V+rv9DxceMgIBaIdik.
Please contact your system administrator.
Add correct host key in /c/Users/Administrator/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /c/Users/Administrator/.ssh/known_hosts:6
解决方案有两个,你可以运行命令选择性删除,也可以直接删除known_hosts
文件。
ssh-keygen -R 39.96.12.167
-
-R
:从known_hosts
文件中删除所有属于39.96.12.167
的密钥信息。
感谢
感谢现在的坚韧,为了能成为更好的自己。
感谢过去好奇的我,给现在的我留下来这么大的工作量!
Linux下使用vim命令编辑与修改文本内容
一次性把 Hexo 博客部署到自己的服务器
远程连接到Linux操作系统实例
linux 中chmod命令使用的详细解释
SSH 远程登录错误解决办法 WARNING: REMOTE