编辑
2023-03-08
Linux学习
00
请注意,本文编写于 561 天前,最后修改于 558 天前,其中某些信息可能已经过时。

目录

配置SSHD服务
安全密钥验证
远程传输命令
不间断会话服务
管理远程会话
会话共享功能

配置SSHD服务

SSH( Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux 系统的首选方式。在此之前,一般使用 FTP 或 Telnet 来进行远程登录。

使用 SSH 协议来远程管理 Linux 系统, 则需要部署配置 sshd 服务程序。sshd 是基于 SSH 协议开发的一款远程管理服务程序, 不仅使用起来方便快捷, 而且能够提供两种安全验证的方法:

  • 基于口令的验证—用账户和密码来验证登录;
  • 基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全。

sshd 服务的配置信息保存在/etc/ssh/sshd_config 文件中。

sshd 服务配置文件中包含的重要参数如表所示。

参数作用
Port 22默认的 sshd 服务端口
ListenAddress 0.0.0.0设定 sshd 服务器监听的 IP 地址
Protocol 2SSH 协议的版本号
HostKey /etc/ssh/ssh_host_keySSH 协议版本为 1 时, DES 私钥存放的位置
HostKey /etc/ssh/ssh_host_rsa_keySSH 协议版本为 2 时, RSA 私钥存放的位置
HostKey /etc/ssh/ssh_host_dsa_keySSH 协议版本为 2 时, DSA 私钥存放的位置
PermitRootLogin yes设定是否允许 root 管理员直接登录
StrictModes yes当远程用户的私钥改变时直接拒绝连接
MaxAuthTries 6最大密码尝试次数
MaxSessions 10最大终端数
PasswordAuthentication yes是否允许密码验证
PermitEmptyPasswords no是否允许空密码登录(很不安全)

ssh 命令进行远程连接,其格式为“ssh [参数] 主机 IP 地址”。要退出登录则执行 exit 命令。

如果禁止以 root 管理员的身份远程登录到服务器,则可以大大降低被黑客暴力破解密码的几率。下面进行相应配置。首先使用 Vim 文本编辑器打开 sshd 服务的主配置文件,然后把第 48 行#PermitRootLogin yes 参数前的井号( #)去掉,并把参数值 yes 改成 no,这样就不再允许 root 管理员远程登录了。记得最后保存文件并退出。

[root@linuxprobe ~]# vim /etc/ssh/sshd_config ………………省略部分输出信息……………… 46 47 #LoginGraceTime 2m 48 PermitRootLogin no 49 #StrictModes yes 50 #MaxAuthTries 6 51 #MaxSessions 10 52 ………………省略部分输出信息………………

一般的服务程序并不会在配置文件修改之后立即获得最新的参数。如果想让新配置文件生效,则需要手动重启相应的服务程序。最好也将这个服务程序加入到开机启动项中,这样系统在下一次启动时,该服务程序便会自动运行,继续为用户提供服务。

[root@linuxprobe ~]# systemctl restart sshd [root@linuxprobe ~]# systemctl enable sshd

安全密钥验证

配置了密钥验证方式,其步骤如下。

第 1 步:在客户端主机中生成“密钥对”。

[root@linuxprobe ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa):按回车键或设置密钥的存储路径 Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): 直接按回车键或设置密钥的密码 Enter same passphrase again: 再次按回车键或设置密钥的密码 Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 40:32:48:18:e4:ac:c0:c3:c1:ba:7c:6c:3a:a8:b5:22 root@linuxprobe.com The key's randomart image is: +--[ RSA 2048]----+ |+*..o . | |*.o + | |o* . | |+ . . | |o.. S | |.. + | |. = | |E+ . | |+.o | +-----------------+

第 2 步:把客户端主机中生成的公钥文件传送至远程主机:

[root@linuxprobe ~]# ssh-copy-id 192.168.10.10 The authenticity of host '192.168.10.20 (192.168.10.10)' can't be established. ECDSA key fingerprint is 4f:a7:91:9e:8d:6f:b9:48:02:32:61:95:48:ed:1e:3f. Are you sure you want to continue connecting (yes/no)? yes /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@192.168.10.10's password:此处输入远程服务器密码 Number of key(s) added: 1 Now try logging into the machine, with: "ssh '192.168.10.10'" and check to make sure that only the key(s) you wanted were added.

第 3 步:对服务器进行设置,使其只允许密钥验证,拒绝传统的口令验证方式。记得在修改配置文件后保存并重启 sshd 服务程序。

[root@linuxprobe ~]# vim /etc/ssh/sshd_config ………………省略部分输出信息……………… 74 75 # To disable tunneled clear text passwords, change to no here! 76 #PasswordAuthentication yes 77 #PermitEmptyPasswords no 78 PasswordAuthentication no 79 ………………省略部分输出信息……………… [root@linuxprobe ~]# systemctl restart sshd

第 4 步:在客户端尝试登录到服务器,此时无须输入密码也可成功登录。

[root@linuxprobe ~]# ssh 192.168.10.10 Last login: Mon Apr 13 19:34:13 2017

远程传输命令

scp( secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,其格式为“scp[参数] 本地文件 远程帐户@远程 IP 地址:远程目录”。

scp 命令中可用的参数及作用:

参数作用
-v显示详细的连接进度
-P指定远程主机的 sshd 端口号
-r用于传送文件夹
-6使用 IPv6 协议

在使用 scp 命令把文件从本地复制到远程主机时,首先需要以绝对路径的形式写清本地文件的存放位置。如果要传送整个文件夹内的所有数据,还需要额外添加参数-r 进行递归操作。然后写上要传送到的远程主机的 IP 地址,远程服务器便会要求进行身份验证了。当前用户名称为 root,而密码则为远程服务器的密码。如果想使用指定用户的身份进行验证,可使用用户名@主机地址的参数格式。最后需要在远程主机的 IP 地址后面添加冒号,并在后面写上要传送到远程主机的哪个文件夹中。

[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt [root@linuxprobe ~]# scp /root/readme.txt 192.168.10.20:/home root@192.168.10.20's password:此处输入远程服务器中 root 管理员的密码 readme.txt 100% 26 0.0KB/s 00:00

此外,还可以使用 scp 命令把远程主机上的文件下载到本地主机,其命令格式为“scp [参数] 远程用户@远程 IP 地址:远程文件 本地目录”。

例如,可以把远程主机的系统版本信息文件下载过来,这样就无须先登录远程主机,再进行文件传送了,也就省去了很多周折。

[root@linuxprobe ~]# scp 192.168.10.20:/etc/redhat-release /root root@192.168.10.20's password:此处输入远程服务器中 root 管理员的密码 redhat-release 100% 52 0.1KB/s 00:00 [root@linuxprobe ~]# cat redhat-release Red Hat Enterprise Linux Server release 7.0 (Maipo)

不间断会话服务

screen 是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异 常中断或为了同时控制多个远程终端窗口而设计的程序。用户还可以使用 screen 服务程序同 时在多个远程会话中自由切换,能够做到实现如下功能。

  • 会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
  • 多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
  • 会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出信息共享。

管理远程会话

screen 命令能做的事情非常多:可以用-S 参数创建会话窗口;用-d 参数将指定会话进行离线处理;用-r 参数回复指定会话;用-x 参数一次性恢复所有的会话;用-ls 参数显示当前已有的会话;以及用-wipe 参数把目前无法使用的会话删除,等等。

在日常的生产环境中,其实并不是必须先创建会话,然后再开始工作。可以直接使用screen 命令执行要运行的命令,这样在命令中的一切操作也都会被记录下来,当命令执行结束后 screen 会话也会自动结束。

[root@linuxprobe ~]# screen vim memo.txt welcome to linuxprobe.com

为了演示 screen 不间断会话服务的强大之处,我们先来创建一个名为 linux 的会话,然后强行把窗口关闭掉(这与进行远程连接时突然断网具有相同的效果):

[root@linuxprobe ~]# screen -S linux [root@linuxprobe ~]# [root@linuxprobe ~]# tail -f /var/log/messages Feb 20 11:20:01 localhost systemd: Starting Session 2 of user root. Feb 20 11:20:01 localhost systemd: Started Session 2 of user root. Feb 20 11:21:19 localhost dbus-daemon: dbus[1124]: [system] Activating service name='com.redhat.SubscriptionManager' (using servicehelper) Feb 20 11:21:19 localhost dbus[1124]: [system] Activating service name='com. redhat.SubscriptionManager' (using servicehelper) Feb 20 11:21:19 localhost dbus-daemon: dbus[1124]: [system] Successfully activated service 'com.redhat.SubscriptionManager' Feb 20 11:21:19 localhost dbus[1124]: [system] Successfully activated service 'com. redhat.SubscriptionManager' Feb 20 11:30:01 localhost systemd: Starting Session 3 of user root. Feb 20 11:30:01 localhost systemd: Started Session 3 of user root. Feb 20 11:30:43 localhost systemd: Starting Cleanup of Temporary Directories... Feb 20 11:30:43 localhost systemd: Started Cleanup of Temporary Directories.

由于刚才关闭了会话窗口,这样的操作在传统的远程控制中一定会导致正在运行的命令 也突然终止,但在 screen 不间断会话服务中则不会这样。我们只需查看一下刚刚离线的会话 名称,然后尝试恢复回来就可以继续工作了:

[root@linuxprobe ~]# screen -ls There is a screen on: 13469.linux (Detached) 1 Socket in /var/run/screen/S-root. [root@linuxprobe ~]# screen -r linux [root@linuxprobe ~]# [root@linuxprobe ~]# tail -f /var/log/messages Feb 20 11:20:01 localhost systemd: Starting Session 2 of user root. Feb 20 11:20:01 localhost systemd: Started Session 2 of user root. Feb 20 11:21:19 localhost dbus-daemon: dbus[1124]: [system] Activating service name='com.redhat.SubscriptionManager' (using servicehelper) Feb 20 11:21:19 localhost dbus[1124]: [system] Activating service name='com. redhat.SubscriptionManager' (using servicehelper) Feb 20 11:21:19 localhost dbus-daemon: dbus[1124]: [system] Successfully activated service 'com.redhat.SubscriptionManager' Feb 20 11:21:19 localhost dbus[1124]: [system] Successfully activated service 'com.redhat.SubscriptionManager' Feb 20 11:30:01 localhost systemd: Starting Session 3 of user root. Feb 20 11:30:01 localhost systemd: Started Session 3 of user root. Feb 20 11:30:43 localhost systemd: Starting Cleanup of Temporary Directories... Feb 20 11:30:43 localhost systemd: Started Cleanup of Temporary Directories. Feb 20 11:40:01 localhost systemd: Starting Session 4 of user root. Feb 20 11:40:01 localhost systemd: Started Session 4 of user root.

如果我们突然又想到了还有其他事情需要处理,也可以多创建几个会话窗口放在一起使用。如果这段时间内不再使用某个会话窗口,可以把它设置为临时断开( detach)模式,随后在需要时再重新连接( attach)回来即可。这段时间内,在会话窗口内运行的程序会继续执行。

会话共享功能

screen 命令不仅可以确保用户在极端情况下也不丢失对系统的远程控制,保证了生产环境中远程工作的不间断性,而且它还具有会话共享、分屏切割、会话锁定等实用的功能。其中,会话共享功能是一件很酷的事情,当多个用户同时控制主机的时候,它可以把屏幕内容共享出来,也就是说每个用户都可以看到相同的内容。

会话共享功能的流程拓扑:

要实现会话共享功能,首先使用 ssd 服务程序将终端 A 远程连接到服务器,并创建一个会话窗口。

[root@client A ~]# ssh 192.168.10.10 The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established. ECDSA key fingerprint is 70:3b:5d:37:96:7b:2e:a5:28:0d:7e:dc:47:6a:fe:5c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts. root@192.168.10.10's password: 此处输入 root 管理员密码 Last login: Wed May 4 07:56:29 2017 [root@client A ~]# screen -S linuxprobe [root@client A ~]#

然后,使用 ssh 服务程序将终端 B 远程连接到服务器,并执行获取远程会话的命令。接下来,两台主机就能看到相同的内容了。

[root@client B ~]# ssh 192.168.10.10 The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established. ECDSA key fingerprint is 70:3b:5d:37:96:7b:2e:a5:28:0d:7e:dc:47:6a:fe:5c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts. root@192.168.10.10's password: 此处输入 root 管理员密码 Last login: Wed Feb 22 04:55:38 2017 from 192.168.10.10 [root@client B ~]# screen -x [root@client B ~]
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Gustav

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!