双 11 期间入手了一台云服务器,备案花了一两个星期,这两天终于备案通过了.于是在个人服务器上装了 Docker 容器用于部署项目,准备尽量把所有的服务都打包成容器,方便统一管理运维.

于是利用 docker 搭建了 nginx 作为反向代理服务器,负责请求分发,用 nginx 部署静态博客,用 mysql 暴露给个人项目使用...

但是千里之行始于足下,一切还要从登录登出远程服务器开始,本文基于 Centos7.6 环境,不保证其他环境正常.

环境准备

服务器要求

如果你已经有云服务器或者虚拟机服务器,首先需要验证服务器上是否已经安装 ssh 服务,如果没有安装则需要提前安装.

登录服务器后,在命令行窗口中输入 rpm -qa | grep ssh 查看是否包括 ssh 相关文件.

[root@snowdreams1006 ~]# rpm -qa | grep ssh
openssh-clients-7.4p1-16.el7.x86_64
libssh2-1.4.3-12.el7_6.2.x86_64
openssh-server-7.4p1-16.el7.x86_64
openssh-7.4p1-16.el7.x86_64

默认情况下运行 netstat -antp | grep sshd 命令,可以看到 sshd 服务监听的端口正是默认的 22 端口.

[root@snowdreams1006 ~]# netstat -antp | grep sshd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1051/sshd
tcp        0      0 *.*.*.*:22        *.*.*.*:46797   ESTABLISHED 17334/sshd: root@pt 

其实一般云服务器均已预装好 ssh 服务,如果没有上述输出,则说明可能并没有安装 ssh 服务,可以使用 yum install openssh-server 进行安装.

下面总结一些关于 sshd 的常用命令,如下

  • 查看 sshd 运行状态
systemctl status  sshd

如果运行结果包括 Active: active (running) 则证明 sshd 服务处于激活状态,如果是 Active: inactive (dead) 则表示服务已关闭.

[root@snowdreams1006 ~]# systemctl status  sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since 五 2019-11-29 21:05:08 CST; 16h ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 1051 (sshd)
    Tasks: 1
   Memory: 10.9M
   CGroup: /system.slice/sshd.service
           └─1051 /usr/sbin/sshd -D
  • 启动|关闭|重启 sshd 服务
systemctl start  sshd
systemctl stop  sshd
systemctl restart  sshd
  • 开机自启|禁止自启 sshd 服务
systemctl list-unit-files | grep enabled
systemctl list-unit-files | grep enabled | grep sshd
systemctl enable sshd
systemctl disable sshd

如果你现在还没有服务器但又想学习体验一下,要么立即花钱去买服务器要么免费安装虚拟机,或者先收藏起来以后再看!

针对立即购买服务器的小伙伴,请私信联系我,用我的推广链接购买,你有优惠,我有分成,何乐而不为呢?

针对免费安装虚拟机体验的用户,可以根据自己的操作系统,参考以下推文进行安装,有问题也可以联系我!

下面是之前推文关于什么是虚拟机以及如何安装 Centos 服务器的相关文章,可以点击直接阅读.

客户端要求

因为登录服务器需要使用到 ssh 协议,所以首先需要验证本机客户端命令行是否支持 ssh 协议.

打开你正在使用的命令行,直接输入 ssh 如果有下列提示证明是可以的,如果没有请安装支持 ssh 协议命令行终端.

如果你是 Mac 用户,打开默认的 terminal 终端输入 ssh 返回用法说明,证明是支持 ssh 协议的.

snowdreams1006$ ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]

如果你是 Windows 用户正在使用 cmd 命令行窗口,很遗憾并不支持 ssh 协议,请自行选择类 unix 终端进行操作.

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\Administrator>ssh
'ssh' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\Users\Administrator>

命令行登录

ssh 登录服务器前提是知道账号密码,先用密码登录的方式进行设置,然后才能用 ssh 方式进行免密登录.

一般情况下,密码都是自己设置的,如果不清楚默认密码是多少可以询问云服务器厂商或者选择重设密码,这里不再赘述,假设你已经知道服务器密码并且知道服务器公网 ip.

下面我们将会在本机客户端的命令行中远程登录云服务器,从最简单方便的密码登录到无密码的密钥登录再到最后的别名登录,快点跟着我一起动起来吧!

密码登录

打开熟悉的命令行终端,运行 ssh <登录账号>@<服务器公网 ip> 命令直接登录远程云服务器.

$ ssh root@snowdreams1006.cn
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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:/RJ5aI+c41Brr1dcBMhdNHQJa7daP+8fbupqsGmHRHc.
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:5
ECDSA host key for 121.40.223.69 has changed and you have requested strict checking.
Host key verification failed.

如果你没有遇到上述提示,恭喜你,可以接着输入账号密码就可以登录到服务器了!

如果你和我一样遇到这种问题,很可能是之前登陆过服务器,不过后来服务器又重装系统,导致无法登录,可以清除本机 ~/.ssh/known_hosts 重新登录.

rm -rf ~/.ssh/known_hosts

强制删除 ~/.ssh/known_hosts 文件后重新 ssh root@snowdreams1006.cn 登录到远程云服务器,按照提示选择继续连接 yes ,然后输入自己的密码 password ,登录成功后默认进入到家目录.

$ ssh root@snowdreams1006.cn
The authenticity of host 'snowdreams1006.cn (*.*.*.*)' can't be established.
ECDSA key fingerprint is SHA256:/**********************************.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'snowdreams1006.cn,*.*.*.*' (ECDSA) to the list of known hosts.
root@snowdreams1006.cn's password:
Last login: *** from *.*.*.*

Welcome to Alibaba Cloud Elastic Compute Service !

[root@snowdreams1006 ~]#

来都来了,不留下点什么东西不好不意思跟别人说过自己曾将来过,那就随便意思意思好了.

  • 悟空到此一游
[root@snowdreams1006 ~]# whoami
root
[root@snowdreams1006 ~]# pwd
/root
[root@snowdreams1006 ~]#  who -u
root     tty1         2019-11-29 21:05  旧的         596
root     pts/0        2019-11-30 14:15   .         17506 (115.217.243.122)
root     pts/1        2019-11-30 14:28 00:05       17533 (115.217.243.122)
[root@snowdreams1006 ~]# last -a | head -6
root     pts/1        Sat Nov 30 14:28   still logged in    115.217.243.122
root     pts/0        Sat Nov 30 14:15   still logged in    115.217.243.122
root     pts/0        Sat Nov 30 13:10 - 13:51  (00:41)     115.217.243.122
root     pts/0        Sat Nov 30 12:24 - 12:25  (00:00)     115.217.243.122
root     pts/1        Fri Nov 29 22:08 - 23:12  (01:03)     112.17.241.55
root     pts/0        Fri Nov 29 21:33 - 22:13  (00:39)     112.17.241.55
  • 好像不认识你

如果发现登录用户除了自己还有别人或者不记得自己其他终端登陆过没有退出,这时候应该踢出这些登录终端.

如果要踢出别人,首先要自己登录的终端终端中哪个是自己,不能自己把自己踢了,那就好笑了!

whoami 仅仅打印登录名,没有登录终端信息,但是 who am i 展示信息就相对多了,这里要记住当前用户登录终端的名称!

[root@snowdreams1006 ~]# who am i
root     pts/0        *** (*.*.*.*)

who -u 可以展示全部登录用户,不过这里推荐使用 w 查看登录用户终端信息,因为敲入的命令更少!

[root@snowdreams1006 ~]# w
 14:53:04 up 17:48,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      五21   17:46m  0.00s  0.00s -bash
root     pts/0    115.217.243.122  14:15    0.00s  0.81s  0.00s w
root     pts/1    115.217.243.122  14:51    1:37   0.00s  0.00s -bash
# pkill -kill -t pts/1
[root@snowdreams1006 ~]# w
 14:58:46 up 17:53,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      五21   17:52m  0.00s  0.00s -bash
root     pts/0    115.217.243.122  14:15    6.00s  0.83s  0.00s w
  • 回家洗洗睡吧

登录到服务器查看了一些信息,并成功踢出了其他终端,天已经黑了,是时候洗洗睡了,这时候需要退出服务器回到本地客户端的命令行.

[root@snowdreams1006 ~]# exit
登出
Connection to ssh.snowdreams1006.cn closed.

密钥登录

一般来说,使用密码登录的方式更加适合不常用的场合,偶尔用终端登录一下没什么问题,如果是经常性需要登录到远程服务器的话,每次连接都需要登录就比较费事了.

既然不用密码登录,那怎么证明自己的身份以保证合法性登录请求呢?

这里就要用到密钥代替密码进行登录,首先在本机客户端生成一种认证信息,然后将这种认证信息安装到远程服务器中,只要完成这种操作就意味着下一次来自该客户端的登录请求都是合法的,不然服务端怎么会有你的认证信息?

所以,可以猜想的是,即使是相同的账号,如果使用的是不同的认证信息,那么远程服务器还是会已保存的认证信息为准,比如你的 Mac 已经实现免密登录,但是你的 Windows 由于并没有上传自己的认证信息,所以免密登录只对 Mac 有效!

当然,如果 MacWindows 电脑的认证信息是一样的,那么服务器保存一份是不是可以免密登录了呢?

答案是: 正确的!

由此可见,密钥登录是针对终端设备而言的,特别适合常用的终端,偶尔性的电脑前往不要设置密钥,不然哪天你忘记了,人家都能直接登录你的服务器,多可怕!

所以,要完成免密登录,需要两个操作,一是本地客户端生成认证文件,二是远程服务器保存该认证文件.

  1. 本地客户端生成公钥
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0gC0u4gR4oba4oHS59Tcc4eAVkaJHsCmys0v4IupoSLQKkdUJVxSfkmL5JZEkr7JNySD7Y52ukRcxx1ZMW0oK7lq+FvfEwzIfAOqVoM4bCoh2D/iC6Xf43ilxCM6oMhpWyITGtxPVzW/ZmmxRGcQzeVrrvoSLhOt0+L0rvFuiQZmnhkV0zqGTRKTQ5uEKycigfdItEaHFIg9fMxugN/bgeflJoEBZjAJHXkqd0mq/4AqeAbkoruEz6D+OiqBhoN8CsbaPCaccMoKd8Tze5UszC3PsQWo96nQoXMXk7HYoFwvJCAgAfKP0CaTwGEK/D7SFvXm3UMlFwAHxELr2bbTv snowdreams1006@163.com

如果你的本地客户端没有该文件,可以使用 ssh-keygen -t rsa 生成一份,按照提示输入相关的信息即可,然后再次运行 cat ~/.ssh/id_rsa.pub 就能查看公钥文件的具体内容了.

  1. 远程服务器接收公钥

本地客户端将自己的公钥文件内容追加到远程服务器的授权文件中就能完成免密登录,那么问题来了,公钥文件保存在哪呢?

答案是: ~/.ssh/authorized_keys

[root@snowdreams1006 ~]# cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0gC0u4gR4oba4oHS59Tcc4eAVkaJHsCmys0v4IupoSLQKkdUJVxSfkmL5JZEkr7JNySD7Y52ukRcxx1ZMW0oK7lq+FvfEwzIfAOqVoM4bCoh2D/iC6Xf43ilxCM6oMhpWyITGtxPVzW/ZmmxRGcQzeVrrvoSLhOt0+L0rvFuiQZmnhkV0zqGTRKTQ5uEKycigfdItEaHFIg9fMxugN/bgeflJoEBZjAJHXkqd0mq/4AqeAbkoruEz6D+OiqBhoN8CsbaPCaccMoKd8Tze5UszC3PsQWo96nQoXMXk7HYoFwvJCAgAfKP0CaTwGEK/D7SFvXm3UMlFwAHxELr2bbTv snowdreams1006@163.com

这里可以看出,远程服务器的 ~/.ssh/authorized_keys 内容包含了本地客户端的 ~/.ssh/id_rsa.pub 公钥内容.

所以接下来的动作就是复制粘贴的操作,复制本地客户端的 ~/.ssh/id_rsa.pub 公钥文件内容,粘贴到远程服务器的 ~/.ssh/authorized_keys 文件中.

只不过这里需要用到 vim 操作,这也是对于新手来说唯一的挑战了,但是我们还有神器来简化这种复制粘贴操作!

那就是: ssh-copy-id root@snowdreams1006.cn

首先确保本地客户端已经生成公钥,这里查看一下公钥文件的内容: cat ~/.ssh/id_rsa.pub

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1UGGBXbqINEfQNCweCOWDlqvRfw3iIqkX9UnI71GgyJkkPUZbycw3L4dVeBkpo76OJjJhJmsAGbHAuhYLloqoNjD9+c/hk7vgP0uZHqVXehqKuP5VvOOkqeLXZkjdXQ49MhARHBVm1LaD44iOOneYclSPiRjKs+6eCxU9SQp+dVUcZMrbAE1lktGgDQEkjtFl8BE9BQkCU24r8xcOUix4iZgdDIa5gnE9YLg1rNXO6LgQG61JLvErrc2g7KkkR4i2P1R+0uV3KdYyMv8Y2aYwYGqY1PjqXUVfaJjTor4Dr8HHBp4VHE3kNVZitLJ2S7RFYuYGFXTEX0xmi6o1r5xP Administrator@snowdreams1006

这里是 Windows 电脑,演示前并没有配置免密登录,所以执行完 ssh-copy-id root@snowdreams1006.cn 应该也像 Mac 电脑一样支持免密登录.

$ ssh-copy-id root@snowdreams1006.cn
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/c/Users/Administrator/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@snowdreams1006.cn's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@snowdreams1006.cn'"
and check to make sure that only the key(s) you wanted were added.

这里接着用已经免密登录到远程服务器的 Mac 电脑验证一下,Windows 电脑的公钥是否已经添加到远程服务器的 ~/.ssh/authorized_keys .

[root@snowdreams1006 ~]# cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0gC0u4gR4oba4oHS59Tcc4eAVkaJHsCmys0v4IupoSLQKkdUJVxSfkmL5JZEkr7JNySD7Y52ukRcxx1ZMW0oK7lq+FvfEwzIfAOqVoM4bCoh2D/iC6Xf43ilxCM6oMhpWyITGtxPVzW/ZmmxRGcQzeVrrvoSLhOt0+L0rvFuiQZmnhkV0zqGTRKTQ5uEKycigfdItEaHFIg9fMxugN/bgeflJoEBZjAJHXkqd0mq/4AqeAbkoruEz6D+OiqBhoN8CsbaPCaccMoKd8Tze5UszC3PsQWo96nQoXMXk7HYoFwvJCAgAfKP0CaTwGEK/D7SFvXm3UMlFwAHxELr2bbTv snowdreams1006@163.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1UGGBXbqINEfQNCweCOWDlqvRfw3iIqkX9UnI71GgyJkkPUZbycw3L4dVeBkpo76OJjJhJmsAGbHAuhYLloqoNjD9+c/hk7vgP0uZHqVXehqKuP5VvOOkqeLXZkjdXQ49MhARHBVm1LaD44iOOneYclSPiRjKs+6eCxU9SQp+dVUcZMrbAE1lktGgDQEkjtFl8BE9BQkCU24r8xcOUix4iZgdDIa5gnE9YLg1rNXO6LgQG61JLvErrc2g7KkkR4i2P1R+0uV3KdYyMv8Y2aYwYGqY1PjqXUVfaJjTor4Dr8HHBp4VHE3kNVZitLJ2S7RFYuYGFXTEX0xmi6o1r5xP Administrator@snowdreams1006

可以看到,远程服务器已经保存了 Windows 电脑刚刚上传的公钥文件内容,所以说 ssh-copy-id 简直就是神器,再也不用手动复制粘贴公钥了!

至于登陆后可以做什么,我想你还是可以到此一游,顺便再踢出其他终端之类的,最后别忘了退出登录 exit 命令哟!

别名登录

无论是密码登录还是密钥登录,我们都是采用 ssh 协议进行登录,而密钥登录的配置也是依赖于密码登录,不管怎么说,两者敲入的命令都不少!

怎不能快速登录呢?

答案是: 可以的!

既然想要快速登录,但是登录信息肯定是必不可少的,所以无外乎是将必要的登录信息写到配置文件中,登录时再读取配置文件进行登录.

原理很好理解,关键是实现过程需要我们自己去实现么?

幸运的是: 不需要!

同样地,编辑 ssh 的配置文件设置一些登录信息即可,配置文件的位于 ~/.ssh/config .

Host <主机 id>
User <登录账号>
HostName <主机名称>

按照上述格式,将登录信息配置如下:

Host github.com
User snowdreams1006
Hostname ssh.github.com

Host snowdreams1006.cn
User root
Hostname ssh.snowdreams1006.cn

其中 Host 是对外暴露的唯一标识,通过 Host 就可以代替账号和 ip 了,两个变成一个是不是简化了呢?

原来的登录命令是 ssh <登录账号>@<服务器公网 ip> 而现在则是 ssh <主机 id>

$ ssh snowdreams1006.cn
Last login: **** from *.*.*.*

Welcome to Alibaba Cloud Elastic Compute Service !

[root@snowdreams1006 ~]# 

图形化登录

推荐 SecureCRT 图形化工具远程连接 Linux 实例,图形化工具基本上很容易上手,配置一下就可以登录成功了,这里已 Windows 电脑为例演示一下相关过程.

首次登录后会弹出快速连接配置,基本上是关于服务域名端口之类的,并没有密码的配置项.

点击连接后会弹出是否加入主机指纹之类的,选择接受并保存.

输入密码后选择确定,过一会就连接到服务器了.

来都来了,还是随便敲个命令再走吧!

云服务登录

登录控制台找到 ECS 服务器 ,然后找到自己的云服务器,因此远程连接->连接密码->用户名/密码,然后就可以登录成功了!

回顾总结

密码登录和密钥登录两者均存在适合场景,如果觉得密码登录不安全的话,也可以禁用密码登录只保留密钥登录!

远程登录到服务器,找到 /etc/ssh/ssh_config 文件并编辑如下内容来禁用密码登录.

Host *
  PasswordAuthentication no
  • 密码登录
$ ssh <登录账号>@<服务器公网 ip>
  • 密钥登录
$ ssh <登录账号>@<服务器公网 ip>
  • 简化登录
$ ssh <主机 id>

阅读更多

02-11 20:36