一、配置网络服务
1.配置网络参数
(1)使用nmtui命令配置网络参数
(2)使用vim编辑ifcfg-eno16777728配置文件,设置ONBOOT=yes
# vim /etc/sysconfig/network-scripts/ifcfg-eno16777728
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777728
UUID=dc9bf613-4d3d-4883-8be8-8282582b6fc3
ONBOOT=yes
GATEWAY0=192.168.31.1
HWADDR=00:0C:29:64:8B:37
PROXY_METHOD=none
BROWSER_ONLY=no
IPADDR=192.168.1.145
PREFIX=24
GATEWAY=192.168.1.1
# systemctl restart network
# ping -c 4 192.168.1.145
PING 192.168.1.145 (192.168.1.145) 56(84) bytes of data.
64 bytes from 192.168.1.145: icmp_seq=1 ttl=64 time=0.295 ms
64 bytes from 192.168.1.145: icmp_seq=2 ttl=64 time=0.111 ms
64 bytes from 192.168.1.145: icmp_seq=3 ttl=64 time=0.107 ms
64 bytes from 192.168.1.145: icmp_seq=4 ttl=64 time=0.107 ms
--- 192.168.1.145 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.107/0.155/0.295/0.080 ms
2.创建网络会话
RHEL 和 CentOS 系统默认使用 NetworkManager 来提供网络服务,这是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态。可以使用 nmcli 命令来管理 NetworkManager 服务。nmcli 是一款基于命令行的网络配置工具,功能丰富,参数众多。它可以轻松地查看网络信息或网络状态:
# nmcli connection show
NAME UUID TYPE DEVICE
eno16777728 dc9bf613-4d3d-4883-8be8-8282582b6fc3 ethernet eno16777728
virbr0 212a6f0b-0909-497a-aa69-79ca1c3043bb bridge virbr0
# nmcli con show eno16777728
connection.id: eno16777728
connection.uuid: dc9bf613-4d3d-4883-8be8-
8282582b6fc3
connection.stable-id: --
connection.type: 802-3-ethernet
connection.interface-name: --
connection.autoconnect: yes
connection.autoconnect-priority: 0
connection.autoconnect-retries: -1 (default)
connection.auth-retries: -1
connection.timestamp: 1564968668
connection.read-only: no
connection.permissions: --
connection.zone: --
connection.master: --
connection.slave-type: --
connection.autoconnect-slaves: -1 (default)
connection.secondaries: --
connection.gateway-ping-timeout: 0
connection.metered: unknown
connection.lldp: default
connection.mdns: -1 (default)
802-3-ethernet.port: --
802-3-ethernet.speed: 0
802-3-ethernet.duplex: --
802-3-ethernet.auto-negotiate: no
802-3-ethernet.mac-address: 00:0C:29:64:8B:37
802-3-ethernet.cloned-mac-address: --
另外,RHEL7 系统支持网络会话功能,允许用户在多个配置文件中快速切换(非常类似于 firewalld 防火墙服务中的区域技术) 。 如果我们在公司网络中使用笔记本电脑时需要手动指定网络的 IP 地址,而回到家中则是使用 DHCP 自动分配 IP 地址。这就需要麻烦地频繁修改IP 地址,但是使用了网络会话功能后一切就简单多了 — 只需在不同的使用环境中激活相应的网络会话,就可以实现网络配置信息的自动切换了。
可以使用 nmcli 命令并按照“connection add con-name type ifname”的格式来创建网络会话。假设将公司网络中的网络会话称之为 company,将家庭网络中的网络会话称之为 house,现在依次创建各自的网络会话。使用 con-name 参数指定公司所使用的网络会话名称 company,然后依次用 ifname 参数指定本机的网卡名称(千万要以实际环境为准,不要照抄书上的 eno16777728) ,用autoconnect no 参数设置该网络会话默认不被自动激活,以及用 ip4 及 gw4 参数手动指定网络的 IP 地址:
# nmcli connection add con-name company ifname eno16777728 autoconnect no type ethernet ip4 192.168.1.145/24 gw4 192.168.1.1
Connection 'company' (c7c3bb65-ef25-4152-a842-e1a16728c17b)
successfully added.
使用 con-name 参数指定家庭所使用的网络会话名称 house。因为我们想从外部 DHCP 服务器自动获得 IP 地址,因此这里不需要进行手动指定。
# nmcli connection add con-name house type ethernet ifname eno16777728
Connection 'house' (2b89f9fd-ae29-43f9-9411-e46ac0fb19e4)
successfully added.
# nmcli connection show
NAME UUID TYPE DEVICE
eno16777728 dc9bf613-4d3d-4883-8be8-8282582b6fc3 ethernet eno16777728
virbr0 212a6f0b-0909-497a-aa69-79ca1c3043bb bridge virbr0
company c7c3bb65-ef25-4152-a842-e1a16728c17b ethernet --
house 2b89f9fd-ae29-43f9-9411-e46ac0fb19e4 ethernet --
使用nmcli命令配置过的网络会话是永久生效的, 这样当我们下班回家后, 顺手启用 house网络会话,网卡就能自动通过 DHCP 获取到 IP 地址了。
# nmcli connection up house
Connection successfully activated (D-Bus active path:
/org/freedesktop/NetworkManager/ActiveConnection/8)
3.绑定两块网卡
一般来讲,生产环境必须提供 7×24 小时的网络传输服务。借助于网卡绑定技术,不仅可以提高网络传输速度,更重要的是,还可以确保在其中一块网卡出现故障时,依然可以正常提供网络服务。假设我们对两块网卡实施了绑定技术,这样在正常工作中它们会共同传输数据,使得网络传输的速度变得更快;而且即使有一块网卡突然出现了故障,另外一块网卡便会立即自动顶替上去,保证数据传输不会中断。
下面我们来看一下如何绑定网卡。
(1)在虚拟机系统中再添加一块网卡设备,请确保两块网卡都处在同一个网络连接中(即网卡模式相同)。处于相同模式的网卡设备才可以进行网卡绑定,否则这两块网卡无法互相传送数据。
(2)使用vim文本编辑器来配置网卡设备的绑定参数。网卡绑定的理论知识类似于前面学习的RAID硬盘组,我们需要对参与绑定的网卡设备逐个进行“初始设置”。需要注意的是,这些原本独立的网卡设备此时需要被配置成为一块“从属”网卡,服务于“主”网卡,不应该再有自己的IP地址等信息。在进行了初始设置之后,它们就可以支持网卡绑定。
# vim /etc/sysconfig/network-scripts/ifcfg-eno16777728
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=eno16777728
MASTER=bond0
SLAVE=yes
# vim /etc/sysconfig/network-scripts/ifcfg-ens35
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
DEVICE=ens35
MASTER=bond0
SLAVE=yes
还需要将绑定后的设备命名为 bond0 并把 IP 地址等信息填写进去, 这样当用户访问相应服务的时候,实际上就是由这两块网卡设备在共同提供服务。
# vim /etc/sysconfig/network-scripts/ifcfg-bond0
BOOTPROTO="static"
TYPE=Ethernet
ONBOOT=yes
USERCTL=no
DEVICE=bond0
IPADDR=192.168.1.145
PREFIX=24
GATEWAY=192.168.1.1
DNS=192.168.1.1
NM_CONTROLLED=no
(3)让Linux内核支持网卡绑定驱动。觉见的网卡绑定驱动有三种模式-mode0、mode1和mode6。下面以绑定两块网卡为例,讲解使用的情景。
➢ mode0(平衡负载模式) :平时两块网卡均工作,且自动备援,但需要在与服务器本地网卡相连的交换机设备上进行端口聚合来支持绑定技术。
➢ mode1 (自动备援模式) : 平时只有一块网卡工作, 在它故障后自动替换为另外的网卡。
➢ mode6(平衡负载模式) :平时两块网卡均工作,且自动备援,无须交换机设备提供辅助支持。
比如有一台用于提供 NFS 或者 samba 服务的文件服务器,它所能提供的
最大网络传输速度为 100Mbit/s,但是访问该服务器的用户数量特别多,那么它的访问压力一定很大。在生产环境中,网络的可靠性是极为重要的,而且网络的传输速度也必须得以保证。针对这样的情况,比较好的选择就是 mode6 网卡绑定驱动模式了。因为 mode6 能够让两块网卡同时一起工作, 当其中一块网卡出现故障后能自动备援,且无需交换机设备支援,从而提供了可靠的网络传输保障。
下面使用 Vim 文本编辑器创建一个用于网卡绑定的驱动文件,使得绑定后的 bond0 网卡设备能够支持绑定技术(bonding) ;同时定义网卡以mode6 模式进行绑定,且出现故障时自动切换的时间为 100 毫秒。
# vim /etc/modprobe.d/bond.conf
alias bond0 bonding
options bond0 miimon=100 mode=6
(4)重启网络服务后网卡绑定操作即可成功。正常情况下只有bond0网卡设备才会有IP地址等信息:
# systemctl restart network
# ifconfig
注意:如果出现network.service - LSB: Bring up/down networking报错,则关半网络管理服务,再重启网卡即可。操作命令如下:
# systemctl stop NetworkManager
# systemctl disable NetworkManager
可以在本地主机执行 ping 192.168.10.10 命令检查网络的连通性。为了检验网卡绑定技术的自动备援功能,我们突然在虚拟机硬件配置中随机移除一块网卡设备,可以非常清晰地看到网卡切换的过程(一般只有 1 个数据丢包) 。然后另外一块网卡会继续为用户提供服务。
注意:linux网卡bonging的备份模式实验在真实机器上做完全没问题(前提是linux内核支持),但是在vmware workstation虚拟中做就会出现如下问题:
适配器Ethernet0的MAC地址00:0c:29:64:8b:37属于预留的地址范围,或者系统上的另一个虚拟适配器正在使用该地址。
配置完成后出现如上问题,但是bond0能够正常启动也能够正常使用,只不过没有起到备份模式的效果。当使用ifdown eth0后,网络出现不通现象。
二、远程控制服务
1.SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux 系统的首选方式。想要使用 SSH 协议来远程管理 Linux 系统, 则需要部署配置 sshd 服务程序。 sshd 是基于 SSH协议开发的一款远程管理服务程序, 不仅使用起来方便快捷, 而且能够提供两种安全验证的方法:
➢ 基于口令的验证 — 用账户和密码来验证登录;
➢ 基于密钥的验证 — 需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全。
sshd 服务的配置信息保存在/etc/ssh/sshd_config 文件中。
sshd 服务配置文件中包含的参数以及作用
Port 22:默认的sshd服务端口
ListenAddress 0.0.0.0:设定sshd服务器监听的IP地址
Protocol 2:SSH协议的版本号
HostKey /etc/ssh/ssh_host_key:SSH协议版本为1时,DES私钥存放的位置
HostKey /etc/ssh/ssh_host_rsa_key:SSH协议版本为2时,RSA私钥存放的位置
HostKey /etc/ssh/ssh_host_dsa_key:SSH协议版本为2时,DSA私钥存放的位置
PermitRootLogin yes:设定是否允许root管理员直接登录
StrictModes yes:当远程用户的私钥改变时直接拒绝连接
MaxAuthTries 6:最大密码尝试次数
MaxSessions 10:最大终端数
PasswordAuthentication yes:是否允许密码验证
PermitEmptyPasswords no:是否允许空密码登录(很不安全)
在 RHEL 7 系统中,已经默认安装并启用了 sshd 服务程序。接下来使用ssh 命令进行远程连接,其格式为“ssh [参数] 主机 IP 地址” 。要退出登录则执行 exit 命令。
在另一台linux机器上登录
# ssh 192.168.1.145
The authenticity of host '192.168.1.145 (192.168.1.145)' can't be established.
ECDSA key fingerprint is SHA256:41Hr+tm8UA6vzobyTTECFOHk2kDSN82BeAhXR79grdI.
ECDSA key fingerprint is
MD5:0c:56:18:81:72:2a:e5:71:d6:e2:eb:9d:12:e7:0b:0c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.145' (ECDSA) to the list of known hosts.
[email protected]'s password: (此处输入远程主机root管理员的密码)
Last login: Mon Aug 5 14:33:36 2019
# exit
logout
Connection to 192.168.1.145 closed.
如果禁止以 root 管理员的身份远程登录到服务器,则可以大大降低被黑客暴力破解密码的几率。下面进行相应配置。首先使用 Vim 文本编辑器打开 sshd 服务的主配置文件,然后把第 38 行PermitRootLogin yes 参数前的井号(#)去掉,并把参数值 yes 改成 no,这样就不再允许 root 管理员远程登录了。记得最后保存文件并退出。
# vim /etc/ssh/sshd_config
………………省略部分输出信息………………
36
37 #LoginGraceTime 2m
38 PermitRootLogin no
39 #StrictModes yes
40 #MaxAuthTries 6
41 #MaxSessions 10
42
………………省略部分输出信息………………
# systemctl restart sshd
# systemctl enable sshd
在另一台linux机器上登录
# ssh 192.168.1.145
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
2.安全密钥验证
加密是对信息进行编码和解码的技术,它通过一定的算法(密钥)将原本可以直接阅读的明文信息转换成密文形式。密钥即是密文的钥匙,有私钥和公钥之分。在传输数据时,如果担心被他人监听或截获, 就可以在传输前先使用公钥对数据加密处理, 然后再行传送。 这样,只有掌握私钥的用户才能解密这段数据,除此之外的其他人即便截获了数据,一般也很难将其破译为明文信息。
(1)在客户端主机中生成“密钥对”。
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): (按回车键或设置密钥的存储路径)
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:
SHA256:AzPd+VllrzDkZDFXaU9CmOhLqvrVPf7YSg2PlnydPbM
The key's randomart image is:
+---[RSA 2048]----+
| .*=o.=|
| . ..*oo.=o|
| + ..o + ooo|
| + o. = ..|
| So .+ . |
| .o.o * .o|
| .. . O ++o|
| .. + = +|
| .o. +ooE |
+----[SHA256]-----+
(2)把客户端主机中生成的公钥文件传送至远程主机:
# ssh-copy-id 192.168.1.145
/bin/ssh-copy-id: INFO: Source of key(s) to be installed:"/root/.ssh/id_rsa.pub"
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s),to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
Authentication failed.
[root@linuxprobe1 ~]# ssh-copy-id 192.168.1.145
/bin/ssh-copy-id: INFO: Source of key(s) to be installed:"/root/.ssh/id_rsa.pub"
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s),to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password: (此处输入远程服务器密码)
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.1.145'" and check to make sure that only the key(s) you wanted were added.
(3)对服务器进行设置,使其只允许密钥验证,拒绝传统的口令验证方式。
记得在修改配置文件后保存并重启sshd服务程序。
# vim /etc/ssh/sshd_config
………………省略部分输出信息………………
61
62 # To disable tunneled clear text passwords, change to no
here!
63 #PasswordAuthentication yes
64 #PermitEmptyPasswords no
65 PasswordAuthentication no
66
………………省略部分输出信息………………
# systemctl restart sshd
(4)在客户端尝试登录到服务器,此时无须输入密码也可以成功登录。
# ssh 192.168.1.145
The authenticity of host '192.168.1.145 (192.168.1.145)' can't be established.
ECDSA key fingerprint is SHA256:41Hr+tm8UA6vzobyTTECFOHk2kDSN82BeAhXR79grdI.
ECDSA key fingerprint is MD5:0c:56:18:81:72:2a:e5:71:d6:e2:eb:9d:12:e7:0b:0c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.145' (ECDSA) to the list of known hosts.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
3.远程传输命令
scp(secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,其格式为“scp[参数] 本地文件 远程帐户@远程 IP 地址:远程目录”。与第 2 章讲解的 cp 命令不同,cp 命令只能在本地硬盘中进行文件复制,而 scp 不仅能够通过网络传送数据,而且所有的数据都将进行加密处理。例如,如果想把一些文件通过网络从一台主机传递到其他主机, 这两台主机又恰巧是 Linux 系统, 这时使用 scp命令就可以轻松完成文件的传递了。
scp 命令中可用的参数以及作用:
-v:显示详细的连接进度
-P:指定远程主机的sshd端口号
-r:用于传送文件侠
-6:使用IPv6协议
在使用 scp 命令把文件从本地复制到远程主机时,首先需要以绝对路径的形式写清本地文件的存放位置。如果要传送整个文件夹内的所有数据,还需要额外添加参数-r 进行递归操作。然后写上要传送到的远程主机的 IP地址,远程服务器便会要求进行身份验证了。当前用户名称为 root, 而密码则为远程服务器的密码。如果想使用指定用户的身份进行验证,可使用用户名@主机地址的参数格式。最后需要在远程主机的 IP 地址后面添加冒号,并在后面写上要传送到远程主机的哪个文件夹中。只要参数正确并且成功验证了用户身份,即可开始传送工作。由于 scp 命令是基于 SSH协议进行文件传送的,而 9.2.2 小节又设置好了密钥验证,因此当前在传输文件时,并不需要账户和密码。
# echo "Welcome to LinuxProbe.com" > readme.txt
# scp /root/readme.txt 192.168.1.155:/home
The authenticity of host '192.168.1.155 (192.168.1.155)' can't be established.
ECDSA key fingerprint is SHA256:6os3yo81DehU98Z+yHDW0A711BQyMM88+MUTs5rHF7g.
ECDSA key fingerprint is MD5:29:32:ae:8c:2f:76:24:e7:64:dc:7a:9e:71:a4:52:1d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.155' (ECDSA) to the list of known hosts.
[email protected]'s password: (此处输入远程服务器中root管理员的密码)
readme.txt 100% 26 12.3KB/s 00:00
此外,还可以使用 scp 命令把远程主机上的文件下载到本地主机,其命令格式为“scp [参数] 远程用户@远程 IP 地址:远程文件 本地目录” 。例如,可以把远程主机的系统版本信息文件下载过来,这样就无须先登录远程主机,再进行文件传送了,也就省去了很多周折。
# scp 192.168.1.155:/etc/redhat-release /root
[email protected]'s password: (此处输入远程服务器中root管理员的密码)
redhat-release 100% 38 8.3KB/s 00:00
# cat redhat-release
CentOS Linux release 7.6.1810 (Core)
三、不间断会话服务
大家在学习 sshd 服务时,不知有没有注意到这样一个事情:当与远程主机的会话被关闭时,在远程主机上运行的命令也随之被中断。如果我们正在使用命令来打包文件,或者正在使用脚本安装某个服务程序,中途是绝对不能关闭在本地打开的终端窗口或断开网络链接的,甚至是网速的波动都有可能导致任务中断, 此时只能重新进行远程链接并重新开始任务。 还有些时候, 我们正在执行文件打包操作,同时又想用脚本来安装某个服务程序, 这时会因为打包操作的输出信息占满用户的屏幕界面,而只能再打开一个执行远程会话的终端窗口,时间久了,难免会忘记这些打开的终端窗口是做什么用的了。
screen 是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序。用户还可以使用 screen 服务程序同时在多个远程会话中自由切换,能够做到实现如下功能。
➢ :即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
➢ :每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
➢ :当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出信息共享。
在 RHEL 7 系统中,没有默认安装 screen 服务程序,因此需要配置 Yum仓库来安装它。
# mkdir -p /media/cdrom
# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 is write-protected, mounting read-only
# vim /etc/yum.repos.d/rhel7.repo
[rhel7]
name=rhel7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0
# yum install screen
Loaded plugins: fastestmirror, langpacks, product-id, search-disabled-repos, : subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
Loading mirror speeds from cached hostfile base | 3.6 kB 00:00
centosplus | 3.4 kB 00:00
extras | 3.4 kB 00:00
rhel7 | 4.1 kB 00:00
updates | 3.4 kB 00:00
(1/2): rhel7/group_gz | 134kB 00:00
(2/2): rhel7/primary_db | 3.4MB 00:00
Resolving Dependencies
--> Running transaction check
---> Package screen.x86_64 0:4.1.0-0.25.20120314git3c2946.el7
will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=================================================================
Package Arch Version
Repository
Size
=================================================================
Installing:
screen x86_64 4.1.0-0.25.20120314git3c2946.el7
base 552 k
Transaction Summary
=================================================================
Install 1 Package
Total download size: 552 k
Installed size: 914 k
Is this ok [y/d/N]: y
Downloading packages:
screen-4.1.0-0.25.20120314git3c2946.el7.x86_64.rpm | 552kB 00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : screen-4.1.0-0.25.20120314git3c2946.el7.x86_64 1/1
rhel7/productid | 1.6 kB 00:00
Verifying : screen-4.1.0-0.25.20120314git3c2946.el7.x86_64 1/1
Installed:
screen.x86_64 0:4.1.0-0.25.20120314git3c2946.el7
Complete!
1.管理远程会话
screen 命令能做的事情非常多:可以用-S 参数创建会话窗口;用-d 参数将指定会话进行离线处理;用-r 参数恢复指定会话;用-x 参数一次性恢复所有的会话;用-ls 参数显示当前已有的会话;以及用-wipe 参数把目前无法使用的会话删除,等等。
下面创建一个名称为 backup 的会话窗口。请各位读者留心观察,当在命令行中敲下这条命令的一瞬间,屏幕会快速闪动一下,这时就已经进入screen 服务会话中了,在里面运行的任何操作都会被后台记录下来。
# screen -S backup
执行命令后会立即返回一个提示符。虽然看起来与刚才没有不同,但实际上可以查看到当前的会话正在工作中。
# screen -ls
There is a screen on:
12773.backup (Attached)
1 Socket in /var/run/screen/S-root.
要想退出一个会话也十分简单,只需在命令行中执行 exit 命令即可。
# exit
[screen is terminating]
在日常的生产环境中,其实并不是必须先创建会话,然后再开始工作。可以直接使用screen 命令执行要运行的命令, 这样在命令中的一切操作也都会被记录下来, 当命令执行结束后 screen 会话也会自动结束。
# screen vim memo.txt
welcome to linuxprobe.com
为了演示 screen 不间断会话服务的强大之处, 我们先来创建一个名为linux 的会话, 然后强行把窗口关闭掉(这与进行远程连接时突然断网具有相同的效果) :
# screen -S linux
#
# tail -f /var/log/messages
由于刚才关闭了会话窗口,这样的操作在传统的远程控制中一定会导致正在运行的命令也突然终止,但在 screen 不间断会话服务中则不会这样。
我们只需查看一下刚刚离线的会话名称,然后尝试恢复回来就可以继续工作了:
# screen -ls
here is a screen on:
12881.linux (Detached)
1 Socket in /var/run/screen/S-root.
# screen -r linux
如果我们突然又想到了还有其他事情需要处理,也可以多创建几个会话窗口放在一起使用。如果这段时间内不再使用某个会话窗口,可以把它设置为临时断开(detach)模式,随后在需要时再重新连接 (attach) 回来即可。 这段时间内, 在会话窗口内运行的程序会继续执行。
2.会话共享功能
screen 命令不仅可以确保用户在极端情况下也不丢失对系统的远程控制,保证了生产环境中远程工作的不间断性,而且它还具有会话共享、分屏切割、会话锁定等实用的功能。其中,会话共享功能是一件很酷的事情,当多个用户同时控制主机的时候,它可以把屏幕内容共享出来,也就是说每个用户都可以看到相同的内容。
screen 的会话共享功能的流程拓扑:
要实现会话共享功能,首先使用 ssh 服务程序将终端 A 远程连接到服务器,并创建一个会话窗口。
A终端
# ssh 192.168.1.145
# screen -S linuxprobe
B终端
# ssh 192.168.1.145
# screen -x
此文章参考刘遄老师所著的《linux就该这么学》,经过逐步调试,并验证后形成的。