9.3 不间断会话服务

大家在学习sshd服务时,不知有没有注意到这样一个事情:当与远程主机的会话被关闭时,在远程主机上运行的命令也随之被中断。

如果我们正在使用命令来打包文件,或者正在使用脚本安装某个服务程序,中途是绝对不能关闭在本地打开的终端窗口或断开网络链接的,甚至是网速的波动都有可能导致任务中断,此时只能重新进行远程链接并重新开始任务。还有些时候,我们正在执行文件打包操作,同时又想用脚本来安装某个服务程序,这时会因为打包操作的输出信息占满用户的屏幕界面,而只能再打开一个执行远程会话的终端窗口,时间久了,难免会忘记这些打开的终端窗口是做什么用的了。

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

会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。

多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。

会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出信息共享。

在RHEL 7系统中,没有默认安装screen服务程序,因此需要配置Yum仓库来安装它。首先将虚拟机的CD/DVD光盘选项设置为“使用ISO镜像文件”,并选择已经下载好的系统镜像,如图9-12所示。

随书配套的软件资源请在这里下载:https://www.linuxprobe.com/tools/

RedHatEnterpriseLinux [RHEL]7.0——红帽操作系统(必需):

由开源软件及全球服务性系统开发商红帽公司出品,最稳定出色的Linux操作系统。

培训课程介绍视频:https://www.linuxprobe.com/training

确认光盘已被选中

图9-12 将虚拟机的光盘设备指向ISO镜像

然后,把光盘设备中的系统镜像挂载到/media/cdrom目录。

  1. [root@linuxprobe ~]# mkdir -p /media/cdrom
  2. [root@linuxprobe ~]# mount /dev/cdrom /media/cdrom
  3. mount: /dev/sr0 is write-protected, mounting read-only

最后,使用Vim文本编辑器创建Yum仓库的配置文件。下述命令中用到的具体参数的含义,可参考4.1.4小节。

  1. [root@linuxprobe ~]# vim /etc/yum.repos.d/rhel7.repo
  2. [rhel7]
  3. name=rhel7
  4. baseurl=file:///media/cdrom
  5. enabled=1
  6. gpgcheck=0

现在,就可以使用Yum仓库来安装screen服务程序了。简捷起见,刘遄老师将对后面章节中出现的Yum软件安装信息进行过滤—把重复性高及无意义的非必要信息省略。

  1. [root@linuxprobe ~]# yum install screen
  2. Loaded plugins: langpacks, product-id, subscription-manager
  3. This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
  4. rhel | 4.1 kB 00:00
  5. Resolving Dependencies
  6. --> Running transaction check
  7. ---> Package screen.x86_64 0:4.1.0-0.19.20120314git3c2946.el7 will be installed
  8. --> Finished Dependency Resolution
  9. Dependencies Resolved
  10. ================================================================================
  11. Package Arch Version Repository
  12. Size
  13. ================================================================================
  14. Installing:
  15. screen x86_64 4.1.0-0.19.20120314git3c2946.el7 rhel 551 k
  16. Transaction Summary
  17. ================================================================================
  18. Install 1 Package
  19. Total download size: 551 k
  20. Installed size: 914 k
  21. Is this ok [y/d/N]: y
  22. Downloading packages:
  23. Running transaction check
  24. Running transaction test
  25. Transaction test succeeded
  26. Running transaction
  27. Installing : screen-4.1.0-0.19.20120314git3c2946.el7.x86_64 1/1
  28. Verifying : screen-4.1.0-0.19.20120314git3c2946.el7.x86_64 1/1
  29. Installed:
  30. screen.x86_64 0:4.1.0-0.19.20120314git3c2946.el7
  31. Complete!

9.3.1 管理远程会话

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

下面创建一个名称为backup的会话窗口。请各位读者留心观察,当在命令行中敲下这条命令的一瞬间,屏幕会快速闪动一下,这时就已经进入screen服务会话中了,在里面运行的任何操作都会被后台记录下来。

  1. [root@linuxprobe ~]# screen -S backup
  2. [root@linuxprobe ~]#

执行命令后会立即返回一个提示符。虽然看起来与刚才没有不同,但实际上可以查看到当前的会话正在工作中。

  1. [root@linuxprobe ~]# screen -ls
  2. There is a screen on:
  3. 32230.backup (Attached)
  4. 1 Socket in /var/run/screen/S-root.

要想退出一个会话也十分简单,只需在命令行中执行exit命令即可。

  1. [root@linuxprobe ~]# exit
  2. [screen is terminating]

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

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

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

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

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

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

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

9.3.2 会话共享功能

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

screen的会话共享功能的流程拓扑如图9-13所示。

screen会话共享

图9-13 会话共享功能的流程拓扑

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

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

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

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

出现问题?大胆提问!

因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

Linux技术交流请加A群:560843(),B群:340829(推荐),C群:463590(推荐),点此查看全国群

*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。

本章节的复习作业(答案就在问题的下一行哦,用鼠标选中即可看到的~)

1.在Linux系统中有多种方法可以配置网络参数,请列举几种。

答:配置网卡参数可以使用nmtui命令、nmcli命令或者直接编辑网卡配置文件来实现对网卡参数的修改。

2.在RHEL 7系统中使用网卡会话技术的目的是什么?

答:使用nmcli命令来管理网卡会话的目的是为了快速切换网卡参数,以便适应不同的工作场景。

3.请简述网卡绑定技术mode6模式的特点。

答:平时两块网卡均工作,且自动备援,无须交换机设备提供辅助支持。

4. 在Linux系统中,当通过修改其配置文件中的参数来配置服务程序时,若想要让新配置的参数生效,还需要执行什么操作?

答:需要重新启动相关的服务程序,或让服务程序重新加载配置文件,或重启系统。

5.sshd服务的口令验证与密钥验证方式,哪个更安全?

答:一般情况下,密钥验证方式更加安全。若用户若认证有更高的安全需求,还可以再对密钥文件进行口令加密,从而实现双重加密。

6. 想要把本地文件/root/out.txt传送到地址为192.168.10.20的远程主机的/home目录下,且本地主机与远程主机均为Linux系统,最为简便的传送方式是什么?

答:执行命令scp /root/out.txt root@192.168.10.20:/home,并在进行口令验证后即可开始传送。

7.请简述配置Yum仓库的步骤。

答:首先应该创建挂载目录并把光盘镜像文件与其关联,然后修改Yum的配置文件,填写入相关参数,尤其需要注意挂载目录的存放路径要正确无误,最后便可使用Yum命令来安装相关的服务程序了。

8. screen服务程序能够让用户实现远程控制的不间断会话服务,即便网络发生中断也不丢失对远程主机的会话控制。那么,当想要恢复到一个名为linux的会话窗口时,应该怎么做呢?

答:执行命令screen -r linux即可恢复到这个会话窗口中。

本文原创地址:https://www.linuxprobe.com/chapter-09.html   编辑:刘遄,审核员:暂无

为您推荐一些与本文相关的文章:

转载必需保留本文链接:https://www.linuxprobe.com/chapter-09.html

本文依据CC-BY-NC-SA 3.0协议发布,竭诚为读者提供Linux视频教程、Linux学习资料以及红帽考试资料等优质学习资源。