管理服务器还是从远程登录比较方便!之前我们就有提过相关的用法!这里则是讲的更多啰!
维护网络服务器最简单的方式不是跑去实体服务器前面登录,而是通过远程连接服务器连接功能来登录主机, 然后再来进行其他有的没的维护就是了。Linux 主机几乎都会提供 sshd 这个连接服务,而且这个服务还是主动进行数据加密的! 消息在网络上面跑安全多了。同时我们还能通过 rsync 这个指令以 sshd 信道来达成异地数据备援的功能哩!相当不赖。 另外,如果需要服务器提供的图形界面软件,除了使用 VNC 之外,也可以使用 ssh 的 X forwarding 功能, 搭配类似 windterm 就能使用服务器的图形软件了!
我们在前面的防火墙章节、DNS 章节,为了方便管理员在不同的系统间切换,就一直是使用『 ssh user@server 』的方式来进入其他 Linux 系统,而不是通过直接取得 VNC 终端画面的方式~这个 ssh 就是远程连接服务器的用户端软件,服务器端基本上是要启动 sshd 服务的~那么什么是远程连接服务器?你也可能听过 telnet,那又是什么?我们连到虚拟机用的 VNC 也是取得远程服务器的方式, 这也是远程连接服务器嘛?就让我们来聊一聊。
首先,我们来了解一下,什么是『远程连接服务器』?这个东西的功能为何? 我想,你应该已经听过,一部开放到互联网上的服务器,基本上,它可以不需要屏幕、键盘、鼠标等等的周边配备,只要有基本的主板、CPU 、RAM、磁盘再加上一块好一点的网络卡,并且连上互联网,那这部主机就能够提供你有需要的网络服务了。 但如果你需要重新设置这部主机,该如何登录主机取得类似 bash 的接口来操纵与进行修改呢?那就得要通过连接服务器的服务了。
是的!你猜对啦,远程连接服务器在提供你由远程通过文本或图形接口的方式来登录系统, 让你在远程的工作机前面登录 Linux 主机以取得可操控主机之接口 (shell),而登录后的操作感觉上就像坐在系统前面一样! 所以啦,你当然不需要远程网络服务器的键盘、鼠标、屏幕等等。你只要工作机可以正常连接到远程主机即可啊。
当你的工作需要使用到 Linux 强大的编程语言编译功能时,那么你一定需要 Linux 对吧!而且最好是运算速度快一点的主机, 这个时候你可以将你研究室最快的那一部主机开放出来,设置一下远程连接服务器,让你的学生啦,或者是研究室的同仁啦, 可以通过这部机器帮他们进行研究的工作,这个时候,你的主机就可以让多人进行分享 Linux 运算的功能啦!
举例来说,台湾有个台湾杉系统,目前 (2024) 主力仍是三号机,这套系统目前提供台湾地区学者们登录进行数值仿真, 由于这套系统后端共有 5 万多个 CPU 内核数,可以提供用户相当大量的运算资源~那么广大的用户们难道每个都要冲进去高速网络中心用电脑? 当然不用!台湾杉系统就是提供 sshd 给大家来连接登录后,再进一步去操作后端运算资源的方式!甚至于这套系统也提供 GPU 资源,用在 AI 运算上也是相当有效益的!
但是否每一部连到 Internet 上面的主机都应该要开放远程连接的功能呢?其实并不尽然, 还是需要针对你的主机来进行规划的,我们底下分服务器与工作站来说明:
在一般对互联网开放服务的服务器中,由于开放的服务可能会有较为重要的信息,而远程连接程序连进主机之后, 可以进行的工作又太多了(几乎就像在主机前面工作一般!),因此服务器的远程连接程序通常仅针对少部分系统维护者开放而已! 除非必要,否则 Server 类型的主机的防火墙设置,还真的不建议开放连接的服务呢!
以鸟哥为例,我的主机提供了我们研究室使用 Mail 与 Internet 上面的 WWW 服务,如果还主动提供远程连接的话, 那么万一不小心被入侵,那可就伤脑筋了!因此,鸟哥仅开放『很小部分的网域』让系统管理员连进来, 其他来源的 IP 一律抵挡!不许使用远程连接的功能呢!
所谓的工作站就是不提供互联网服务的主机,仅提供大量的运算能力给用户,例如上面提到的台湾杉系统。 既然不提供互联网的服务,那你还开连接服务器干嘛?不是啊!这套系统还是得要提供给台湾的学者登录进行研究吧! 那就得要提供远程连接功能才行!不过,为了避免被攻击,其实台湾杉系统使用了多重身份验证进程,要登录台湾杉系统, 其实还真的很繁琐...那如果是我们自己内部架设的工作站呢?当然就不需要对互联网提供连接功能啰! 只需要针对内部,或者是特定的某些来源开放他们使用你的工作站就好啊!
连接服务器早期有文本界面、图形界面等等,文本界面还有分明码与密码传输!不过,自从 ssh 出来之后, 加上可以通过 ssh 信道做图形界面的转递 (X forwarding),因此,目前大多使用 ssh 了!但是一些旧系统, 可能还是得要使用比较旧的机制,因此,还是知道一些专有名词比较好!
什么是『明码』与『加密』的数据封包发送模式呢?为什么 telnet 使用明码就比较不安全?所谓的明码就是: 『当我们的数据封包在网络上传输时,该数据封包的内容为数据的原始格式』, 举个常见的例子,网址列 http:// 就是明码传输,网址列 https:// 就是加密传输~当你使用网络银行或网络 ATM 时, 总不希望你的帐号/密码被窃取吧?这时得用 https 对吧!所以,使用 ssh 取代 telent 当然就是必要的! 不管你输入什么指令,在互联网上面传输时,就是被编码过的密码,这样即使被窃听,问题也就比较小!
什么是『数据加密』呢?简单的说,就是将人们看的懂得原始电子数据,经过一些加密运算,让这些数据变成没有意义的乱码 (至少对人类来说),然后再让这个咚咚在网络上面传输,而当用户想要查阅这个数据时,再通过解密运算, 将这些咚咚反推出原始的电子数据。由于这些数据已经被重新处理过,所以,即使数据在互联网上被 cracker 监听而窃取,他们也不容易就推算得出来原始数据内容的。
加解密运算的机制与技术非常多,我们这里不去讨论复杂的理论问题,只谈对我们比较有关的一些加解密概念而已。 目前常见的网络封包加密技术通常是借由所谓的『非对称密钥系统』来处理的。 主要是通过两把不一样的公钥与私钥 (Public and Private Key) 来进行加密与解密的过程。由于这两把钥匙是提供加解密的功用, 所以在同一个方向的连接中,这两把钥匙当然是需要成对的!它的功用分别如下:
由于每部主机都应该有自己的密钥 (公钥与私钥),且公钥用来加密而私钥用来解密, 其中私钥不可外流。但因为网络连接是双向的,所以,每个人应该都要有对方的『公钥』才对!那如果以 ssh 这个通信协定来说,在用户端与服务器端的相对连接方向上,应该有如下的加密动作:
如上图所示,我们如果站在用户端的角度来看,那么,首先你必须要取得服务器端的公钥,然后将自己的公钥发送给服务器端, 最终在用户端上面的密钥会是『服务器的公钥加上用户端我自己的私钥』来组成的。
另外,目前 SSH 的协定版本有两种,分别是 version 1 与 version 2 ,其中 V2 由于加上了连接检测的机制, 可以避免连接期间被插入恶意的攻击码,因此,建议直接关掉 V1 仅使用 V2 就好。既然 server 与 client 都需要提供自己的公钥给对方加密, 那么这把公私钥又是如何运作与产生的呢?就让我们来看下去!
我们可以将 ssh 服务器端与用户端的连接步骤示意为下图,至于步骤说明如后:
在上述的第 4 步骤中,用户端的密钥是随机运算产生于本次连接当中的,所以你这次的连接与下次的连接的密钥可能就会不一样啦! 此外在用户端的用户家目录下的 ~/.ssh/known_hosts 会记录曾经连接过的主机的 public key ,用以确认我们是连接上正确的那部服务器。
什么时候会使用到 ssh 提供给我们的用户呢?如上面提到的高速网络中心的介绍,很多时候,我们会让用户连接到工作站进行数值模式仿真等任务, 同时,也可能通过 rsync 或其他 scp 等方式进行数据的异地备援,因此,在这个章节当中,我们预计会在 DMZ 的区域当中,建置两部新系统, 一部用来作为工作站,一部用来作为备份用服务器。基本上,相关的网络环境配置有点像底下这样:
要先记得,我们的母系统是在 cloud 的主机底下,然后我们拷贝的服务器来源文件,主要是由 server_raw 来的! 现在就让我们来处理 XML 以及映像档数据:
# 1. 拷贝 server_raw 给 server_workstation/server_bakcup 服务器档 [root@cloud ~]# cd /kvm/img/ [root@cloud img]# cp server_raw.img server_workstation.img [root@cloud img]# cp server_raw.img server_backup.img # 1.2. 由于 backup 容量要较大,因此将原本的 30G 磁盘放大到 100G! [root@cloud img]# qemu-img resize server_backup.img 100G [root@cloud img]# qemu-img info server_backup.img image: server_backup.img file format: qcow2 virtual size: 100 GiB (107374182400 bytes) disk size: 2.39 GiB cluster_size: 2097152 .... # 2.1. 前往设置 work station xml 设置档 [root@cloud img]# cd /kvm/xml/ [root@cloud xml]# cp server_raw.xml server_workstation.xml [root@cloud xml]# vim server_workstation.xml <name>server_workstation</name> <loader readonly="yes" type="pflash" secure="no">/usr/share/edk2/ovmf/OVMF_CODE.fd</loader> <nvram>/kvm/xml/server_workstation.uefi.fd</nvram> <source file="/kvm/img/server_workstation.img"/> <mac address="52:54:00:00:30:c4"/> <graphics type="vnc" port="5934" listen="0.0.0.0" passwd="rocky9"> # 2.2. 启动 work station 虚拟机 [root@cloud xml]# virsh create server_workstation.xml # 3.1. 前往设置 backup xml 设置档 [root@cloud xml]# cp server_raw.xml server_backup.xml [root@cloud xml]# vim server_backup.xml <name>server_bakcup</name> <loader readonly="yes" type="pflash" secure="no">/usr/share/edk2/ovmf/OVMF_CODE.fd</loader> <nvram>/kvm/xml/server_backup.uefi.fd</nvram> <source file="/kvm/img/server_backup.img"/> <mac address="52:54:00:00:30:c5"/> <graphics type="vnc" port="5935" listen="0.0.0.0" passwd="rocky9"> # 3.2. 启动 backup 虚拟机 [root@cloud xml]# virsh create server_backup.xml # 4. 观察两部系统的信息 [root@cloud xml]# virsh list Id Name State ------------------------------------ .... 18 server_workstation running 19 server_backup running [root@cloud xml]# netstat -tlunp | egrep '^Pro|qemu' Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5935 0.0.0.0:* LISTEN 2228145/qemu-kvm tcp 0 0 0.0.0.0:5934 0.0.0.0:* LISTEN 2227973/qemu-kvm
工作站用的网络规划如下:
底下的动作需要在刚刚激活的虚拟机底下实做 (vnc://192.168.201.249:5934),这是因为我们会修改网络参数的缘故啊!
# 在工作站虚拟机 (VNC 环境) 完成如下的参数设置: [root@server001 ~]# hostnamectl hostname works.server.vbird [root@dhcp ~]# nmcli connection modify enp1s0 ipv4.method manual ipv4.addresses 192.168.30.214/24 \ > ipv4.gateway 192.168.30.254 ipv4.dns 192.168.30.211,192.168.30.212 \ > ipv4.dns-search server.vbird,lan.vbird,ap.vbird [root@dhcp ~]# nmcli connection up enp1s0 [root@dhcp ~]# curl http://vbird.cn # 有回应网页信息就对了!
备份服务器的网络规划如下:
底下的动作需要在刚刚激活的虚拟机底下实做 (vnc://192.168.201.249:5935)
# 在备份服务器虚拟机 (VNC 环境) 完成如下的参数设置: [root@server001 ~]# hostnamectl hostname backup.server.vbird [root@dhcp ~]# nmcli connection modify enp1s0 ipv4.method manual ipv4.addresses 192.168.30.215/24 \ > ipv4.gateway 192.168.30.254 ipv4.dns 192.168.30.211,192.168.30.212 \ > ipv4.dns-search server.vbird,lan.vbird,ap.vbird [root@dhcp ~]# nmcli connection up enp1s0 [root@dhcp ~]# curl http://vbird.cn # 有回应网页信息就对了!
因为我们多了两个主机名称的对应,为了让这部主机的名称与 IP 地址能对应,所以我们就得要去修改 master DNS 的 server.vbird 的 zone file 内容才行!你应该要在 master DNS (dns1) 上面处理 intranet 的 server.vbird zone file,也就是 /var/named/named.server.vbird 这个文件内容才对!
# 底下所有的动作都应该要在 dns1 (master DNS) 上面动作: [root@dns1 ~]# vim /var/named/named.server.vbird @ IN SOA dns1.server.vbird. adm.mail.server.vbird. ( 2024032002 3H 15M 1D 600 ) .... works IN A 192.168.30.214 backup IN A 192.168.30.215 .... [root@dns1 ~]# vim /var/named/named.192.168.30 @ IN SOA dns1.server.vbird. adm.mail.server.vbird. ( 2024032002 3H 15M 1D 600 ) ... 214 IN PTR works.server.vbird. 215 IN PTR backup.server.vbird. ... [root@dns1 ~]# systemctl restart named-chroot [root@dns1 ~]# dig +short works.server.vbird 192.168.30.214 [root@dns1 ~]# dig +short backup.server.vbird 192.168.30.215 [root@dns1 ~]# dig +short -x 192.168.30.214 works.server.vbird. [root@dns1 ~]# dig +short -x 192.168.30.215 backup.server.vbird. [root@dns1 ~]# dig +short works.server.vbird @dns2 192.168.30.214 [root@dns1 ~]# dig +short -x 192.168.30.214 @dns2 works.server.vbird. # 从两部 DNS 系统上面都看到相同的 IP 地址与主机名称了!
我们在建置虚拟机磁盘的时候,有将备份服务器的磁盘『放大』到 100G 喔!原本仅有 30G 而已。那么如何使用到添加加的磁盘空间呢? 先让我们到备份用服务器来查阅一下磁盘的状态:
# 1. 在备份用服务器里面,先查看看磁盘容量有没有变化? [root@backup ~]# lsblk /dev/vda NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS vda 253:0 0 100G 0 disk ├─vda1 253:1 0 200M 0 part /boot/efi ├─vda2 253:2 0 1G 0 part [SWAP] └─vda3 253:3 0 28.8G 0 part /
我们很清楚的看到,容量长大到 100G 喔!这就是虚拟机愉快的地方!哈哈!磁盘容量可以放大咧! 因为未来不知道还会不会有需要使用到其他更多的磁盘空间,因此,目前我们预计使用 LVM 机制,将所有的多出来的容量, 通通放置到 /data 目录下!接下来的动作怎么进行啊?找一下 LVM 啰!很简单~这样做:
# 1. 创建新分割 [root@backup ~]# fdisk /dev/vda Command (m for help): n Partition number (4-128, default 4): ↵ First sector (62912512-209715166, default 62912512): ↵ Last sector, +/-sectors or +/-size{K,M,G,T,P} (62912512-209715166, default 209715166): ↵ Created a new partition 4 of type 'Linux filesystem' and of size 70 GiB. Command (m for help): 5 Partition number (1-4, default 4): 4 Partition type or alias (type L to list all): 30 Changed type of partition 'Linux filesystem' to 'Linux LVM'. Command (m for help): p Device Start End Sectors Size Type /dev/vda1 2048 411647 409600 200M EFI System /dev/vda2 411648 2508799 2097152 1G Linux swap /dev/vda3 2508800 62912511 60403712 28.8G Linux filesystem /dev/vda4 62912512 209715166 146802655 70G Linux LVM Command (m for help): w The partition table has been altered. Syncing disks. # 很快的,创建好所需要的 partition 并更新了分区的类型 (Linux LVM) # 2. 创建 PV [root@backup ~]# yum -y install lvm2 [root@backup ~]# pvcreate /dev/vda4 [root@backup ~]# pvscan PV /dev/vda4 lvm2 [70.00 GiB] Total: 1 [70.00 GiB] / in use: 0 [0 ] / in no VG: 1 [70.00 GiB] # 3. 创建名为 backvg 的 VG [root@backup ~]# vgcreate backvg /dev/vda4 [root@backup ~]# vgscan Found volume group "backvg" using metadata type lvm2 # 4. 创建名为 backlv 的 LV [root@backup ~]# vgdisplay backvg --- Volume group --- VG Name backvg System ID Format lvm2 .... VG Size <70.00 GiB PE Size 4.00 MiB Total PE 17919 Alloc PE / Size 0 / 0 Free PE / Size 17919 / <70.00 GiB [root@backup ~]# lvcreate -n backlv -l 17919 backvg [root@backup ~]# lvscan ACTIVE '/dev/backvg/backlv' [<70.00 GiB] inherit # 5. 格式化之后,进行自动挂载 [root@backup ~]# mkfs.xfs /dev/backvg/backlv [root@backup ~]# mkdir /data [root@backup ~]# vim /etc/fstab /dev/backvg/backlv /data xfs defaults 0 0 [root@backup ~]# systemctl daemon-reload [root@backup ~]# mount -a [root@backup ~]# df -Th /data / Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/backvg-backlv xfs 70G 532M 70G 1% /data /dev/vda3 xfs 29G 2.0G 27G 7% /
这样就使用了既有的放大的磁盘来创建 LVM 文件系统!未来如果还有额外的磁盘容量可以使用,通过上述相同的作法, 唯一的差别是,将新的 PV (假设 /dev/vda5) 加入到 backvg 当中,并且将 backlv 放大,再使用 xfs_growfs /data 来放大文件系统, 在不需要重新格式化的情况下,我们的 /data 目录内容,就可以放大容量啦!这就是 LVM 的好处!
在鸟哥这次的虚拟环境中,所有的 server 磁盘其实都来自原本的那个 server_raw.img,那当然啦!连同系统的 sshd 服务器密钥, 在所有的系统当中,也都是相同的!因此当你第一次使用 ssh 连接到我们新创建的工作站主机时,可能会出现如下图标:
# 1. 从骨干系统 (master) 第一次连接到工作站 (works) 的情况: [vbird@master ~]# ssh works The authenticity of host 'works (192.168.30.214)' can't be established. ED25519 key fingerprint is SHA256:Va9Z79fb2Kv16vT9QP46iRksvxDayLYKcMY64n3txv8. This host key is known by the following other names/addresses: ~/.ssh/known_hosts:1: 192.168.11.1 ~/.ssh/known_hosts:4: 192.168.21.1 ~/.ssh/known_hosts:5: client001 ~/.ssh/known_hosts:6: server001 ~/.ssh/known_hosts:7: 192.168.30.211 ~/.ssh/known_hosts:8: 192.168.30.212 ~/.ssh/known_hosts:9: dns1 ~/.ssh/known_hosts:10: dns2 (6 additional names omitted) Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'works' (ED25519) to the list of known hosts. vbird@works's password: 这里输入密码 Last login: Mon Nov 13 10:52:35 2023 from 192.168.30.254 [vbird@works ~]$ exit
上面的大意是说,我们的 master 上面的 vbird 用户,还未曾连接到 works 这部主机,这是第一次连接,因此需要将 server 的 public key 记载到 ~vbird/.ssh/known_hosts 文件内。不过,这个 public key 竟然在许多部主机上面都相同!上面就是列出具有相同 server public key 的主机群~你还是可以继续接受此密钥就是了。最终请离开 works 主机系统!
那如何创建属于自己的新系统的 server keys 呢?很简单!删除旧的 key 然后重新启动 sshd 就好了! 不过要注意的是,这是针对新的系统来设计的一个练习,请不要在已经运作许久的系统上面操作!因为...很可能让你的用户大受惊吓! 另外,也不要使用 ssh 的方式连接进新系统运作底下的流程,因为需要重新启动 sshd 嘛!所以,底下的动作鸟哥是通过 VNC 界面运作的!
# 1. 在工作站系统 (works) 用 root 的身份删除旧的 key [root@works ~]# rm /etc/ssh/ssh_host_* # 2. 重新启动 sshd 服务 [root@works ~]# systemctl restart sshd # 3. 查看是否有新的 keys 产生了! [root@works ~]# ll /etc/ssh/ssh_host_*
当你在区网内,某个 server 的 IP 地址突然被其他主机占用,因此,这个 IP 地址的 sshd 密钥当然不同! 另外的案例,就是在上个练习中,我们将 works 的 server keys 变更了!这就类似我们的 server 重新安装系统是一样的! 反正就是 sshd 的密钥改变了啦!此时,我们再次于 master 骨干连接到 works,就可能出现如下图标:
# [vbird@master ~]# ssh works @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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 ED25519 key sent by the remote host is SHA256:cwoKb9cr2Z6nuL1LoHiVhCkGjUincT7BbZtmtz71ANY. Please contact your system administrator. Add correct host key in /home/vbird/.ssh/known_hosts to get rid of this message. Offending ED25519 key in /home/vbird/.ssh/known_hosts:17 Host key for works has changed and you have requested strict checking. Host key verification failed.
上面的错误消息就是在告知我们,远程主机 sshd 密钥跟之前我们连接时所纪录的不同了!要注意这是正确的还是被攻击了? 然后,如上的特殊字体部份,在第 17 行的纪录可能就是冲突点!我们知道这是正常的错误!因为刚刚重建密钥而已嘛!那要如何处理呢? 超简单!只要根据上面提示的数据,到 ~user/.ssh/known_hosts 的该行,将那一行 (这个案例中就是第 17 行) 删除, 那就可以再次使用了。另外,如果不想要每次都按下 (yes) 才纪录到 .ssh/known_hosts 的话,也能够用特殊参数处理掉!
# 1. 先删除纪录数据 [vbird@master ~]# vim ~/.ssh/known_hosts # 请自己删除掉第 17 行喔! [vbird@master ~]# ssh -o StrictHostKeyChecking=no works Warning: Permanently added 'works' (ED25519) to the list of known hosts. vbird@works's password: ↵ Last login: Thu Mar 21 23:03:10 2024 from 192.168.30.254 [vbird@works ~]$
这样就自动加入 works 的密钥进入 .ssh/known_hosts 文件中了!这个参数其实很有效用的!尤其是在虚拟机环境中! 然后使用 shell script 进行某些测试时,不用疯狂按下 yes 啦!方便得很!
现代的 PC 使用的操作系统: Linux/Windows,以及苹果电脑的 MAC 系统,这三大主流台式机的系统当中,都有内置的 ssh 用户端软件, 且使用的语法方式几乎相同!唯一的差别是,Linux 启动的是类似 bash 的 shell 环境,Windows 与 MAC 则需要启动各自的终端机环境, 在 Windows 环境可以从搜索框输入『 cmd 』找到命令提示字符,MAC 则从『应用程序』、『工具程序』找到『终端机』来启动即可。 底下的指令大部分都可以在三个主流操作系统当中使用喔!
SSH 在 client 端使用的是 ssh 这个指令,也可以指定非正规的 ssh port (正规 ssh port 为 22)。不过,一般的用法可以使用底下的方式:
[vbird@master ~]# ssh [-f] [-o 参数项目] [-p 非正规端口口] [帐号@][IP|主机名] [指令] [vbird@master ~]# ssh -p 2233 user@server_name [vbird@master ~]# ssh user@server_name uptime
基本上,我们最常使用的是『 ssh user@server_name 』的方式来登录远程主机,但是,如果远程主机激活的端口口并非在正规端口口, 那就得要转用其他端口口来连接~所以可能会用到『 ssh -p 2233 user@server_name 』的方式。如果不想要登录远程主机, 仅需要在远程主机运行一个指令就离开,那就可以在后头加上需要运行的指令,例如『 ssh user@server_name uptime 』。 有时候你也可以加上一些特殊的参数,那就需要用到 -o 的选项,这部份我们在下一个小节再来详细介绍。
如果登录远程去立刻运行个指令就离开~也可以这样做:
[vbird@master ~]# ssh -f works find / &> ~/find.log [vbird@master ~]# <==你会发现,你的光标还是在自己原本的系统中喔!
让指令自己在 works 跑,我们立刻回来继续做 master 自己的任务!
ssh 除了可以『登录远程主机』之外,通过这个 ssh 的连接信道,我们也可以进行异地拷贝文件的功能!那就是通过 scp 这个指令的协助了! scp 常见的简单用法如下:
[vbird@master ~]# scp [-Cpr] [-l 速率] file [帐号@]主机:目录名 <==上传 [vbird@master ~]# scp [-Cpr] [-l 速率] [帐号@]主机:file 目录名 <==下载 选项与参数: -C :发送与接收进行压缩功能,适用于带宽较低的环境中 -p :保留原本文件的权限数据; -r :拷贝来源为目录时,可以拷贝整个目录 (含子目录) -l :可以限制传输的速度,单位为 Kbits/s ,例如 [-l 800] 代表传输速限 100Kbytes/s
其实上传或下载的重点是那个冒号 (:) 啰!连接在冒号后面的就是远程主机的文件。因此,如果冒号在前, 代表的就是从远程主机下载下来,如果冒号在后,则代表本机数据上传啦!而如果想要拷贝目录的话,那么可以加上 -r 的选项!
# 1. 将 /etc/hosts 及 /etc/fstab 发送到 works 的 /dev/shm 上 [vbird@master ~]# scp /etc/hosts /etc/fstab works:/dev/shm vbird@works's password: hosts 100% 246 645.5KB/s 00:00 fstab 100% 608 2.2MB/s 00:00
如果你的网络带宽比较低 (例如传输数据到不同国家去),而且你的数据比较属于文本型态的 (可压缩率比较高的文件格式), 那可以加上 -C 在送出之前进行压缩,这样在互联网上面传输时,可以加快速度!只是 server/client 两端就得要花费比较多的 CPU 资源进行压缩/解压缩。因此,在内网 (LAN) 时,就不建议使用 -C 这个增加压缩的参数。
# 1. 传输一个巨型文件到 works 上 [vbird@master ~]# dd if=/dev/zero of=/dev/shm/bigfile.txt bs=1M count=200 [vbird@master ~]# ll -h /dev/shm/bigfile.txt -rw-r--r--. 1 vbird vbird 200M Mar 31 17:13 /dev/shm/bigfile.txt [vbird@master ~]# scp -C /dev/shm/bigfile.txt works:/dev/shm vbird@works's password: bigfile.txt 100% 200MB 185.2MB/s 00:01 # 看看传输速率,有时候会提升到很莫名其妙的状态!就是因为压缩! # 2. 每秒 10Mbytes/s 的速度,发送到 works 上! [vbird@master ~]# scp -l 80000 /dev/shm/bigfile.txt works:/dev/shm vbird@works's password: bigfile.txt 100% 200MB 9.6MB/s 00:20 # 同样的传输方式,你会发现到速度变得比较慢! [vbird@master ~]# rm /dev/shm/bigfile.txt [vbird@master ~]# ssh works rm /dev/shm/bigfile.txt # 虽然是放置在 /dev/shm 底下~不过,安全起见,还是手动删除测试文件好了!
虽然 scp 也可以使用通配符来进行文件的传输,不过...如果你不知道文件的文件名,还得要去远程主机搜索时, 那就比较麻烦一点~此时,使用仿真 ftp 功能的 sftp ,就是你的好朋友~sftp 同样是登录到远程服务器, 只是, ssh 的功能是取得 shell 去跟系统交互,sftp 则是通过 ftp 功能去进行文件的传输!使用方式很简单:
[vbird@master ~]# sftp works vbird@works's password: Connected to works. sftp> help Available commands: bye Quit sftp cd path Change remote directory to 'path' ... exit Quit sftp get [-afpR] remote [local] Download file ... lcd path Change local directory to 'path' lls [ls-options [path]] Display local directory listing lmkdir path Create local directory ... lpwd Print local working directory ls [-1afhlnrSt] [path] Display remote directory listing ... mkdir path Create remote directory progress Toggle display of progress meter put [-afpR] local [remote] Upload file pwd Display remote working directory quit Quit sftp reget [-fpR] remote [local] Resume download file ... reput [-fpR] local [remote] Resume upload file sftp> exit
进入到 sftp 之后,那就跟在一般 FTP 模式下的操作方法没有两样了!底下我们就来谈一谈, sftp 这个接口下的使用指令吧!
针对远方服务器主机 (Server) 之行为 | |
---|---|
变换目录到 /etc/test 或其他目录 | cd /etc/test cd PATH |
列出目前所在目录下的文件名 | ls dir |
创建目录 | mkdir directory |
删除目录 | rmdir directory |
显示目前所在的目录 | pwd |
更改文件或目录群组 | chgrp groupname PATH |
更改文件或目录拥有者 | chown username PATH |
更改文件或目录的权限 | chmod 644 PATH 其中,644 与权限有关!回去看基础篇! |
创建链接档 | ln oldname newname |
删除文件或目录 | rm PATH |
更改文件或目录名称 | rename oldname newname |
离开远程主机 | exit (or) bye (or) quit |
针对本机 (Client) 之行为(都加上 l, L 的小写 ) | |
变换目录到本机的 PATH 当中 | lcd PATH |
列出目前本机所在目录下的文件名 | lls |
在本机创建目录 | lmkdir |
显示目前所在的本机目录 | lpwd |
针对数据上传/下载的行为 | |
将文件由本机上传到远程主机 | put [本机目录或文件] [远程] put [本机目录或文件] 如果是这种格式,则文件会放置到目前远程主机的目录下! |
将文件由远程主机下载回来 | get [远程主机目录或文件] [本机] get [远程主机目录或文件] 若是这种格式,则文件会放置在目前本机所在的目录当中!可以使用通配符,例如: get * get *.rpm 亦是可以的格式! |
就整体而言,sftp 在 Linux 底下,如果不考虑图形接口,那么他已经可以取代 FTP 了呢!因为所有的功能都已经涵盖啦! 因此,在不考虑到图形接口的 FTP 软件时,可以直接关掉 FTP 的服务,而改以 sftp-server 来提供 FTP 的服务吧! 让我们来玩一玩底下的流程:假设你要在 master/works 之间传输数据,但是希望可以随时观察两端的文件文件名数据, 可以这样做:
[vbird@master ~]# sftp -C works vbird@works's password: Connected to works. sftp> # 1. 跑到 works 的 /etc/yum.repos.d 目录,并查看里面的文件名 sftp> cd /etc/yum.repos.d/ sftp> ls -l -rw-r--r-- 1 root root 6586 Jun 11 2023 rocky-addons.repo -rw-r--r-- 1 root root 1161 Jun 11 2023 rocky-devel.repo -rw-r--r-- 1 root root 2379 Jun 11 2023 rocky-extras.repo -rw-r--r-- 1 root root 3405 Jun 11 2023 rocky.repo # 2. 切换本机 (master) 目录,到 /dev/shm 底下,并查看文件 sftp> lcd /dev/shm/ sftp> lpwd Local working directory: /dev/shm sftp> lls -l total 0 # 3. 在本机端 (master) 创建 copy_file 目录,并将 works 的 rocky.repo 文件拷贝过来 sftp> lmkdir copy_file sftp> lcd copy_file/ sftp> get rocky.repo Fetching /etc/yum.repos.d/rocky.repo to rocky.repo rocky.repo 100% 3405 4.1MB/s 00:00 # 4. 检查 works 有没有 /etc/vi* ,有的话就拷贝到 master 下 sftp> ls /etc/vi* /etc/vimrc /etc/virc sftp> get /etc/vi* Fetching /etc/vimrc to vimrc vimrc 100% 4017 233.7KB/s 00:00 Fetching /etc/virc to virc virc 100% 1184 279.1KB/s 00:00 sftp> lls -l total 12 -rw-r--r--. 1 vbird vbird 3405 Apr 4 23:20 rocky.repo -rw-r--r--. 1 vbird vbird 4017 Apr 4 23:23 vimrc -rw-r--r--. 1 vbird vbird 1184 Apr 4 23:23 virc sftp> exit
基本上,sftp 跟 scp 都是在进行文件的异地拷贝功能,不同的地方在,scp 每次进行,都需要重新登录与敲击密码, sftp 则是一次登录后,可以在远程进行数据查找、拷贝、下载、上传等任务,而且在上传/下载过程中,如果网络失败导致传输遗失的时候, 你可以通过 reget 或 reput 的方式,或者是 put -a 或 get -a 的方式,让文件可以在遗失点重新『继续』动作,而不用重复传输已经传输过的部份! 这对于节省带宽或者是实际传输大型文件的过程中来说,实在非常有帮助喔!
windows 原生的 ssh 指令在命令提示字符 (cmd) 环境下,用起来怪怪的~所以,一般鸟哥使用的工作机,比较常用的其实是 putty 这套软件。 putty 可以简单的调整字体大小,调整历史纪录数据,用鼠标进行拷贝粘贴也很简单。还有,也可以进行图形界面的转递 (X11 forwarder)。 基本上,你可以从底下的链接抓到 putty 的下载点,除了有安装版本,也有绿色运行档版本 (不需要安装)。通常鸟哥喜欢使用 putty.exe 而已, 所以,鸟哥仅下载使用 putty.exe 而已啰。
下载 putty.exe 之后,双击图标,就会出现如下的画面。基本上,你只要填写预计要连接的服务器 IP 或主机名称即可开始连接! 不过,鸟哥通常会喜欢做些额外的设置,那这个软件操作起来,才会更符合你自己的使用习惯!所以,就让我们来处理处理。 主要需要处理的部份大致有:
有时候,我们可能会需要同时做 ssh 与 sftp 等任务,有没有更简单的方式,可以让我们同时登录处理这些任务? 也是有的,此时需要用到图形用户界面。鸟哥只用过两套这种界面,分别是:
虽然两套都有免费版本,但 windterm 是完全自由的软件,同时支持 Linux/Windows/MAC 系统,而且标榜速度超级快!所以鸟哥单纯介绍 windterm。 此外,其实鸟哥都使用 putty 而已,用 windterm 的原因,只是要取得后面要介绍的 X11 forwarding 功能而已!现在,请到底下的链接, 开始下载 windterm 吧!鸟哥在实验时,使用的是 WindTerm_2.6.1_Windows_Portable_x86_64.zip 这个文件的下载, 您也可以下载更新的软件~
下载完毕之后,你可以将该文件解压缩在任何位置上,之后进入 WindTerm_version 目录,双击『WindTerm.exe』文件, 就可以出现如下的画面,因为可以纪录上次登录的信息,这里建议直接选择软件目录即可。
有趣的是,windterm 会从注册表当中抓取 putty 的设置,所以,如果一切无误,你可以在 windterm 右上方的是角落中,找到你刚刚的设置值。
假设你没有相关的 putty 设置,那此时只需要在『会议』选择『新会话』的按钮,如下所示:
在出现的新窗口中,填写你的主机号码 (主持人),之后就可以按下『连接』按钮,如下所示:
一切顺利的话,接下来就是要接受 server 的公钥,同时选择『 Account 』的页面,并输入你的帐号。windterm 连帐号都隐藏喔! 所以输入帐号名称的时候,也会跑出密码类似的样式!如下所示:
出现输入密码的画面,这个也很有趣!当你输入密码字符时,屏幕上出现的密码位数会改变喔~为了防止你的密码长度被人家猜到的缘故! 鸟哥觉得这相当有趣!如下所示:
顺利登录后的画面如下所示,中央的部份就是你可以下达指令的位置,左侧下方则是你目前目录的文件内容,你可以使用拖曳的方式, 将文件上传或下载,相当方便!只是,在鸟哥的环境中,上传/下载启动的时间颇长,不知道为什么。
最后要特别注意的,是这个 windterm 还有提供一个 X server 的功能!内置就提供,不用额外安装什么软件!同时,X 运作的效率颇强! 图形界面显示相当快速!在 windterm 右上方的画面就有一个 X 的图样,如下所示。鸟哥目前没有要用到这个,所以暂时不启动~ 之后讲到时,会再次使用喔!
ssh 的软件大致上就如上面的介绍,但是,通过 ssh 信道的软件应用就非常多!例如图形化界面的传输可以使用 Filezilla, 在线编辑可以使用 nodepad++,想要写复杂的程序,可以通过 vs code 等等,这些软件通通支持 SSH 信道!也就是说,一个 ssh, 大家都能使用!非常愉快啊!相关软件的官网如下,有兴趣的伙伴们可以自行前往下载应用。
鸟哥的学生很喜欢使用 vs code 进行程序,如 python, javascript, php 的撰写,而且 vs code 也是跨平台,各个平台都有相对的下载程序。 不过,鸟哥个人比较喜欢使用轻量的 nodepad++ 软件,写简单的程序颇方便,启动快速,设置简单!只是...目前只有 windows 版本, 比较可惜就是了。
我们在讲到 scp 指令应用中,曾经提到 -C 这个参数,他可以通过 server / client 两端在发送消息前,主动将消息压缩后传出, 这样可以节省带宽。那,你应该要问的问题是,如果缺省就是加强压缩了,能不能取消压缩?另外,能不能改用其他的消息加密机制 (ciphers)? 有没有什么特定的设置档呢?有的!那就是 /etc/ssh/ssh_config 设置档!这个设置档主要是针对用户端软件的缺省参数设计, 也就是针对 ssh, scp , sftp 等的默认值设计喔!我们可以在 master 系统上面,使用 ssh -v 来查找看看设置档在哪里:
# 使用 -v 参数,查找连接机制的缺省设置档文件名 [vbird@master ~]# ssh -v vbird@works OpenSSH_8.7p1, OpenSSL 3.0.7 1 Nov 2022 debug1: Reading configuration data /etc/ssh/ssh_config debug1: Reading configuration data /etc/ssh/ssh_config.d/50-redhat.conf debug1: Reading configuration data /etc/crypto-policies/back-ends/openssh.config debug1: configuration requests final Match pass debug1: re-parsing configuration debug1: Reading configuration data /etc/ssh/ssh_config debug1: Reading configuration data /etc/ssh/ssh_config.d/50-redhat.conf debug1: Reading configuration data /etc/crypto-policies/back-ends/openssh.config debug1: Connecting to works [192.168.30.214] port 22. debug1: Connection established. .....
你可以很清楚的看到基本设置档就是上面那几个~基本上,其实主设置档仅有 ssh_config 而已, 其他两个 (50-redhat.conf, openssh.config) 都是被主设置档或上层设置档引用 (include) 进来的! 那我们先来查查主设置档的内容吧:
[vbird@master ~]# vim /etc/ssh/ssh_config
# Host *
# ForwardAgent no
# ForwardX11 no
# PasswordAuthentication yes
....
# ConnectTimeout 0
# StrictHostKeyChecking ask
....
# Port 22
# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
....
Include /etc/ssh/ssh_config.d/*.conf
上面是大部分的默认值~如果你想要修改默认值,可以在该文件最后一行的设置值中,将自己的设置写入 /etc/ssh/ssh_config.d/file.conf 当中即可!那如果想要立刻查找目前的设置呢?可以使用 ssh -Q 喔!
# 1. 查找支持的压缩功能 [vbird@master ~]# ssh -Q compression none zlib@openssh.com zlib # 2. 查找支持的算法机密机制 [vbird@master ~]# ssh -Q ciphers 3des-cbc aes128-cbc .... aes128-gcm@openssh.com aes256-gcm@openssh.com chacha20-poly1305@openssh.com
目前的 CPU 都有 AES 加解密的硬件加速机制,所以,使用 aes 的传输速度会是比较快速的!因此,在 LAN 里面的传输, 建议『不要启动压缩,使用最低限度的加密演算』可能比较有利于网络传输!那要如何运行指令?可以这样做看看:
# 使用自订功能进行 ssh 连接 [vbird@master ~]# ssh -o Compression=no -o Ciphers=aes128-gcm@openssh.com works vbird@works's password: ↵ [vbird@works ~]$ exit
不过,除非有特殊要大家通通遵守的规定,否则,这个设置档就保留吧!不用更动他~要处理的,反而是底下这个文件。
如果每次都要加上『 -o... 』一堆数据,你可能会觉得很烦~那么有没有其他『个人化』的设置档可以指定某些特定的主机进行个别参数设置? 是有的!就直接修改家目录底下 .ssh/config 即可!这个文件的设置方式也很简单!基本上,都是照抄 /etc/ssh/ssh_config 而已! 假设你在 master 的 vbird 用户,可以这样指定你的设置值喔:
[vbird@master ~]# vim ~/.ssh/config # Host 自行设置的好记的名称 # Hostname 通常就是 IP 地址,或是可以找到 IP 地址的主机名称 # Compression 是否启动压缩功能 # Ciphers 使用的加密机制设计 Host works Hostname 192.168.30.214 Compression no Ciphers aes128-gcm@openssh.com Host backup Hostname 192.168.30.215 Compression no Ciphers aes128-gcm@openssh.com Host myserver Hostname my.server.name Port 3388 User myname Compression yes ForwardX11 yes [vbird@master ~]# ssh myserver
未来在使用 ssh 相关软件时,就会主动出现 works, backup, myserver 等主机名称,可以让你轻松的连接到你想要去的位置, 不但不用记忆 IP 地址,而且例如登录的端口口、用户帐号等,都可以额外设置在各自的环境下!使用相当方便! 更多的参数可以使用『 man ssh_config 』去查找看看。
什么时候你会需要使用 ssh 连接到工作站呢?鸟哥这边提供个例子来处理。鸟哥之前读书的时候,主要的工作在研究大气污染, 后来着重在了解污染源排放与扩散之后产生的环境影响相关的项目。那有什么数值软件可以仿真排放到空气中的污染物,经过气象条件 (风速、风向、温湿度的影响等) 的扩散/传输作用之后,到达下风处时,该空气污染物的浓度剩下多少呢?有的,那就是 AERMOD 这套软件。
AERMOD 这套软件主要是美国环保署开发,要给他们国内做空气品质研究的学者、顾问公司使用的一套扩散仿真的软件。 比较有趣的是,它还是开放源码!除了提供缺省的 Windows 预编运行档之外,也额外提供了 fortran 相关的代码,详细的流程请参考如下网站:
AERMOD 使用的编程语言为 fortran ,为了开发方便,所以将各个功能以多个不同的 fortran 程序文件撰写,因此会有很多代码文件, 编译过程就比较复杂~而且程序功能与时俱进,版本众多,目前 (2024) 提供的版本为 v23132 (2023/10/12)。 你可以在上面的网站下载原代码。不过,在进行软件的编译之前,我们的 Linux 也要成为开发环境才行啊!那...很多软件需要安装耶! 没关系,RHEL 提供了『Development Tools』开发工具组给大家使用~我们可以一次安装好大部分需要的开发软件:
# 前往 words 工作站主机,安装开发环境所需要的支持软件 [vbird@master ~]# ssh works [vbird@works ~]# sudo yum -y groupinstall "Development Tools" [vbird@works ~]# sudo yum -y install wget unzip gcc-gfortran
安装完毕,自然就可以下载原代码了!再次强调,鸟哥这边使用的是 v23132 的版本,但是台湾地区在 2024 年公告的模式依旧使用 v21112 的版本。 只是,美国环保署网站上面我找不到 v21112 的原代码了...所以只好拿 v23132 的版本来解说。鸟哥就不知道当读者们要使用时,到底剩下哪个版本可以用... 所以,鸟哥只好从美国环保署下载 v23132 的原代码提供大家操作使用~台湾模式支持中心的说明以及鸟站的下载点如下:
# 在 works 工作站,从鸟站下载 v23132 的 AERMOD 原代码 [vbird@works ~]# wget http://vbird.cn/linux_server/rocky9/0230sshd/aermod_source_v23132.zip [vbird@works ~]# unzip aermod_source_v23132.zip [vbird@works ~]# cd aermod_source_code_23132/
如果参考 gfortran-aermod.bat 这个原代码目录中提供的编译流程,你会发现到编译过程还挺麻烦的!所以, 我们通常建议写一只 Makefile 作为等等编译 (make) 的参考数据。只是这个文件的语法比较特别,需要注意的是:
# 开始设计 make 功能 [vbird@works aermod_source_code_23132]# vim Makefile # 1. 先规范编译器、编译参数、链接参数 FC = gfortran FFLAGS = -fbounds-check -Wuninitialized -O3 -march=native -Wno-uninitialized LFLAGS = -O3 -march=native # 2. 创建源文件案与处理目标文件 (object file) SRC = \ modules.f grsm.f aermod.f setup.f coset.f soset.f \ reset.f meset.f ouset.f inpsum.f metext.f iblval.f \ siggrid.f tempgrid.f windgrid.f calc1.f calc2.f prise.f \ arise.f prime.f sigmas.f pitarea.f uninam.f output.f \ evset.f evcalc.f evoutput.f rline.f bline.f OBJ = $(SRC:.f=.o) # 3. 处理编译流程 main: ${OBJ} ${FC} -o aermod.exe ${LFLAGS} ${OBJ} clean: rm -fv *.o *.mod [vbird@works aermod_source_code_23132]# make gfortran -fbounds-check -Wuninitialized -O3 -march=native -c -o modules.o modules.f gfortran -fbounds-check -Wuninitialized -O3 -march=native -c -o grsm.o grsm.f .... gfortran -o aermod.exe -O3 -march=native modules.o grsm.o aermod.o ... rline.o bline.o [vbird@works aermod_source_code_23132]# ll aermod.exe -rwxr-xr-x. 1 vbird vbird 2873720 Apr 9 15:33 aermod.exe # 将 aermod.exe 放置到所有用户都可以运行的 PATH 内 [vbird@works aermod_source_code_23132]# sudo cp -a aermod.exe /usr/local/bin [vbird@works aermod_source_code_23132]# aermod.exe --help usage: 0, 1, or 2 args Usage: AERMOD 23132 takes either no or one or two parameters. Either AERMOD Or AERMOD plumetest.inp Or AERMOD plumetest.inp plumetest.out The first parameter is the .INP file name, The second parameter is the .OUT file name,
上面的 Makefile 可以在底下的网址下载:
这样就编译成功,而且等待我们运行了!现在,我们可以从模式支持中心去下载适用的输入范例档,拿来作为运行过程的数据, 看看能否操作 aermod.exe 扩散模式~同样的,鸟哥为了方便大家下载,也先将模式支持中心的范例下载好了,大家直接取用吧:
# 前往用户家目录,下载范例档,然后解压缩 [vbird@works ~]# wget http://vbird.cn/linux_server/rocky9/0230sshd/aermod_example.tar.gz [vbird@works ~]# tar -zxvf aermod_example.tar.gz [vbird@works ~]# cd aermod_example/ [vbird@works aermod_example]# ll -rw-r--r--. 1 vbird vbird 588528 Jun 8 2022 aermod.pfl <==高空气象数据档 -rw-r--r--. 1 vbird vbird 1563673 Jun 8 2022 aermod.sfc <==地面气象数据档 -rw-r--r--. 1 vbird vbird 1780 Apr 9 2024 aermod.inp <==主要输入档 -rw-r--r--. 1 vbird vbird 24255 Sep 1 2022 grid.dat <==地形数据档 # 开始运作 aermod 主程序 [vbird@works aermod_example]# aermod.exe aermod.inp aermod.out +Now Processing SETUP Information +Now Processing Data For Day No. 1 of 2020 +Now Processing Data For Day No. 2 of 2020 ..... +Now Processing Data For Day No. 365 of 2020 +Now Processing Data For Day No. 366 of 2020 +Now Processing Output Options [vbird@works aermod_example]# ll -rw-r--r--. 1 vbird vbird 1780 Apr 9 15:54 aermod.inp -rw-r--r--. 1 vbird vbird 86897 Apr 9 15:57 aermod.out <==输出数据说明档 -rw-r--r--. 1 vbird vbird 588528 Jun 8 2022 aermod.pfl -rw-r--r--. 1 vbird vbird 1563673 Jun 8 2022 aermod.sfc -rw-r--r--. 1 vbird vbird 24255 Sep 1 2022 grid.dat -rw-r--r--. 1 vbird vbird 48452 Apr 9 15:57 plot.plt <==绘图档
很快的,我们就运行过一个简单的 AERMOD 范例程序~而且也顺利的跑出绘图档~未来只需要使用相同的方式,放置不同的输入参数数据, 这样就可以充分的应用工作站的运行能力了!
我们现在知道异地备份可以使用 scp 或者是脚本化的 sftp。但是,这些工具大部份都是『重新上传一次所有数据』的角度来处理备份的工作, 如果我需要的是『有需要的数据才备份』时,该如何处理?这时就可以使用 rsync 啦!rsync 也可以在本机上面做差异备份! 备份的方式挺简单!我们来测试看看:
# 1. 先登录 backup 备份服务器,看看服务器的内容 [vbird@master ~]# ssh backup Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.30.215' (ED25519) to the list of known hosts. vbird@192.168.30.215's password: [vbird@backup ~]# df -Th -x tmpfs -x devtmpfs Filesystem Type Size Used Avail Use% Mounted on /dev/vda3 xfs 29G 2.0G 27G 7% / /dev/vda1 vfat 200M 7.0M 193M 4% /boot/efi /dev/mapper/backvg-backlv xfs 70G 532M 70G 1% /data <==这个挂载点! # 2. 将 /etc, /root 备份到 /data/local 目录内 [vbird@backup ~]# sudo mkdir /data/local [vbird@backup ~]# sudo yum -y install rsync [vbird@backup ~]# sudo rsync -av /root /etc /data/local/ sending incremental file list etc/ etc/.pwd.lock etc/.updated etc/DIR_COLORS ..... root/anaconda-ks.cfg root/.ssh/ root/.ssh/known_hosts sent 20,096,002 bytes received 10,519 bytes 13,404,347.33 bytes/sec total size is 20,046,915 speedup is 1.00 [vbird@backup ~]# ll /data/local/ drwxr-xr-x. 99 root root 8192 Apr 9 17:13 etc dr-xr-x---. 3 root root 4096 Mar 20 23:26 root # 3. 再次备份看看 [vbird@backup ~]# sudo rsync -av /root /etc /data/local/ sending incremental file list sent 28,118 bytes received 266 bytes 56,768.00 bytes/sec total size is 20,046,915 speedup is 706.28 # 最后重新做一次 rsync,你会发现,根本没有东西被拷贝了喔!因为没有更新过!
最简单的 rsync 就这样使用~至于 rsync 一般常用的参数如下:
[vbird@backup ~]# rsync [-avrlptgoD] [-e ssh] [user@host:/dir] [/local/path] 选项与参数: -v :观察模式,可以列出更多的信息,包括镜像时的文件文件名等; -q :与 -v 相反,安静模式,略过正常信息,仅显示错误消息; -r :递归拷贝!可以针对『目录』来处理!很重要! -u :仅更新 (update),若目标文件较新,则保留新文件不会覆盖; -l :拷贝链接档的属性,而非链接的目标源文件案内容; -p :拷贝时,连同属性 (permission) 也保存不变! -g :保存源文件案的拥有群组; -o :保存源文件案的拥有人; -D :保存源文件案的设备属性 (device) -t :保存源文件案的时间参数; -I :忽略更新时间 (mtime) 的属性,文件比对上会比较快速; -z :在数据传输时,加上压缩的参数! -e :使用的信道协定,例如使用 ssh 信道,则 -e ssh -a :相当于 -rlptgoD ,所以这个 -a 是最常用的参数了! --del :若仅存在接收端,则将接收端文件删除 (危险!注意!) --mkpath:类似 mkdir -P 那个概念,会自己产生上层目录 更多说明请参考 man rsync 的解说!
rsync 最大的好处就是可以通过 ssh 信道直接进行数据传递!举例来说,我们要使用 root 的身份,将 master 系统的 /etc, /root, /home, /var/lib, /var/log 拷贝到 backup 备份系统上,那可以这样做看看:
# 1. 先在 backup 系统上面创建好 master 可以传来的消息 [vbird@backup ~]# sudo mkdir /data/master [vbird@backup ~]# sudo chown vbird:vbird /data/master [vbird@backup ~]# ll -d /data/master drwxr-xr-x. 2 vbird vbird 6 Apr 9 17:53 /data/master # 2. 在 master 系统上面,使用 root 身份,将数据送出去! [root@master ~]# yum install rsync [root@master ~]# rsync -avz -e ssh --del /etc /root /home vbird@backup:/data/master [root@master ~]# rsync -avz -e ssh --del /var/log /var/lib vbird@backup:/data/master/var/
要注意的是, -z 可以进行额外的压缩后送出的功能,可以节省带宽。至于 --del 可以将接收端存在的不需要文件直接删除, 使用上要特别注意!另外,目录后面有没有加上斜线 (/) 是不一样的!因为我们都是要将整个目录拷贝过去,因此接收端需要保留原有的目录名称, 所以不可以加上斜线喔!大致的意思,我们以 /root 来做说明。
另外,你可能会问,如果我需要 ssh 的不同额外参数,例如端口口号码或加密机制之类的变更协助,那应该如何下达指令呢? 很简单,就是在 -e 后面处理即可!例如底下的方式:
[root@master ~]# rsync -avz -e "ssh -c aes128-gcm@openssh.com" --del /etc /root /home vbird@backup:/data/master
正常的 ssh 用法,大概上面的章节就已经介绍的差不多了!但是呢,sshd 这个服务毕竟『不算太安全』,毕竟你只要能够登录系统, 就几近无敌!如果 sshd 被使用 root 登录了,那就麻烦了!因此,最好不要将 sshd 暴露在互联网上。另外,某些中心会将 port 22 自动导向或关闭,因此,你在某些单位里面,也没有办法使用 port 22 的啦!那怎办?只好通过转端口口的方式来处理啰! 底下就让我们来聊聊怎么做。
一般来说,如果你没有在安装的时候额外动手脚 (特别有勾选让 root 登录的功能),你的 root 是无法直接通过『输入密码』来 ssh 登录你的系统的。这个 跟 sshd 有关的设置值,就放在 /etc/ssh/sshd_config 里面!当然啦,还有包含被引入 (include) 进来的 /etc/ssh/sshd_config.d/*.conf 文件群。你可以使用 root 权限查看一下 /etc/ssh/sshd_config 文件的内容,里面大部分的注解都是默认值, 每个设置都讲也颇无聊~鸟哥只列出你应该要知道的项目来说说看:
# 在 backup 备份服务器上面,用 root 查看 sshd_config 内容 [root@backup ~]# vim /etc/ssh/sshd_config # If you want to change the port on a SELinux system, you have to tell # SELinux about this change. # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER #Port 22
这个 Port 22 可以下达多次,如果你有其他额外要激活的端口口,例如 3388 时,就可以将『 Port 3388 』同时写上来! 这样就可以同时激活两个 sshd 的端口口。但是不要这样做!我们后面有更简单的方法可以处理!
#PermitRootLogin prohibit-password
PermitRootLogin 意思是『是否允许 root 登录』的意思,主要设置值有 yes, no, prohibit-password 这几种。 目前 RHEL 9 默认值是 prohibit-password (禁止输入密码)。你应该会觉得很奇怪~禁止密码 (prohibit-password) 跟不准登录有什么差别? 还是有差别的!虽然不能用输入密码登录,但是,你可以通过密钥系统来登录喔!该情况就不是使用输入密码的方式 (后面会提到处理方式)! 因此,才缺省会用这个 prohibit-password 当成默认值。不过,如果你担心人家会猜测 root 密码的话,那这边可以将设置值改成 no ! 一般非工作站的正常服务器 (web server, dns server...) 建议就改成 no 吧!毕竟该类服务器并没有需要随时使用 ssh 登录的需要。
#PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
所谓的密钥认证文件,放置用户端公钥 (public key) 的缺省文件名!这个文件不要改比较好喔!就保持原有设置值! 从这边我们也知道,公钥文件要上传到哪里去啦!这个文件与 .ssh/ 目录的权限也需要特别注意!权限设置错误时, 密钥数据就不会检查!
#X11Forwarding no
是否激活图形界面转递?一般缺省都是 no,不过,我们可以在用户端强迫放行~所以这里就保留默认值即可!
#UseDNS no
#TCPKeepAlive yes
以前 sshd 会反查用户端是否具有合法的 DNS 主机名称,或者是写入 /etd/hosts 的主机暱称。不过,这样会导致连接阶段有些时间延迟。 目前的默认值都是 no,不进行反查,连接效率会比较好。至于 TCPKeepAlive 的意思是,当达成连接后,服务器会一直发送 TCP 封包给用户端借以判断对方式否一直存在连接。不过,如果连接时中间的路由器暂时停止服务几秒钟,也会让连接中断喔! 在这个情况下,任何一端死掉后,SSH可以立刻知道!而不会有僵尸进程的发生!但如果你的网络或路由器常常不稳定,那么可以设置为 no 的啦!
#MaxStartups 10:30:100
这个设置值相当有趣喔~当你的工作站放行给太多人使用时,很多用户可能会同时连上系统,那么当系统同时有 10 个正在等待输入密码的连接时, 后续 (例如第 11, 12 个连接等) 的连接,将有 30% 的几率被丢弃~一直到最多 100 个登录连接后,后续的登录连接将会被直接丢弃。 也就是在后续第 101 个连接,就无法达成连接。不过这里要注意的是,这指的是『正在登录的连接行为,例如等待输入密码, 或者是正在查找密钥系统的流程,就是尚未连接成功的阶段』情况下 (unauthenticated connection)!并不是指最多只能有 100 条连接喔!
在鸟哥曾经开发过的系统中,有一个很有趣的经验,我有 A 机器会疯狂的对 B 机器进行 ssh 的连接,主要是进行一堆测试! 所以在一个进程里面,会疯狂的重新发起 ssh 登录~而且是不需要密码的那种连接。但是...当有多个连接同时发起时, 竟然有好多个 ssh 连接会被报错误!后来才查到这个设置值~解决方法是,将设置值放大个 10 倍,就没问题了!例如『 100:30:500 』这样!
Subsystem sftp /usr/libexec/openssh/sftp-server
这就是 sftp 服务器啰!保持存在比较好!基本上, RHEL 9 的这个设置值已经很 OK 了,我们暂时不需要更动它~ 不过...你就是有需要进行不同端口口的设置啊!那怎办?没关系,我们来使用防火墙玩一玩~
无论在哪个系统,sshd 的服务就不要对所有的来源放行!除非你知道你在干麻~否则千万不要啊!所以,针对 works 工作站来说, 我们应该要限制可登录的来源,毕竟工作站很可能让外部的人员连接使用的。假设目前我们仅针对数个区网以及一部份外网做放行, 使用 firewalld 的缺省防火墙机制下,应该这样做比较妥当:
# 1. 确认缺省的防火墙是 firewalld,并查找活动中的 zone [root@works ~]# systemctl is-active firewalld.service active [root@works ~]# firewall-cmd --get-active-zones public interfaces: enp1s0 [root@works ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: enp1s0 sources: services: cockpit dhcpv6-client ftp http https ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: # 2. 取消上面看到的 ftp, http, https, ssh 等服务的连接,加入限制区网的来源 [root@works ~]# firewall-cmd --permanent --remove-service={ftp,http,https,ssh} [root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" \ > service name="ssh" accept' [root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.20.0/24" \ > service name="ssh" accept' [root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.30.0/24" \ > service name="ssh" accept' [root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.31.0.0/16" \ > service name="ssh" accept' [root@works ~]# firewall-cmd --reload [root@works ~]# firewall-cmd --list-services ; firewall-cmd --list-rich-rules cockpit dhcpv6-client rule family="ipv4" source address="192.168.20.0/24" service name="ssh" accept rule family="ipv4" source address="192.168.30.0/24" service name="ssh" accept rule family="ipv4" source address="172.31.0.0/16" service name="ssh" accept rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept
这样就做好了我们所需要的 ssh 登录环境啦!如果还有需要其他的来源,就使用上述的 rich rule 的方法增加即可。 那如果需要动态的方式来变更防火墙规则呢?那就需要 knock-server 的服务~等等我们再来聊一下这个东西~这边先用静态、固定 IP 地址的方法来处理喔!
现在,假设外部系统不允许使用我们 works 的 port 22 进行连接,又或者我们需要将 works 的端口口放行在其他号码上,这样怎么做? 很简单啊~就防火墙章节谈到的 REDIRECTION 功能即可!但是,不建议使用 --add-forward-port 功能,建议还是使用 rich rule 来规范 firewalld 比较好!我们使用底下的方式来处理喔:
[root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" \ > forward-port port="3388" protocol="tcp" to-port="22"' [root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.20.0/24" \ > forward-port port="3388" protocol="tcp" to-port="22"' [root@works ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.30.0/24" \ > forward-port port="3388" protocol="tcp" to-port="22"' [root@works ~]# firewall-cmd --reload [root@works ~]# firewall-cmd --list-rich-rules rule family="ipv4" source address="192.168.30.0/24" service name="ssh" accept rule family="ipv4" source address="192.168.20.0/24" service name="ssh" accept rule family="ipv4" source address="192.168.10.0/24" forward-port port="3388" protocol="tcp" to-port="22" rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept rule family="ipv4" source address="192.168.20.0/24" forward-port port="3388" protocol="tcp" to-port="22" rule family="ipv4" source address="192.168.30.0/24" forward-port port="3388" protocol="tcp" to-port="22" rule family="ipv4" source address="172.31.0.0/16" service name="ssh" accept [root@works ~]# netstat -tlunp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 21897/sshd: /usr/sb tcp6 0 0 :::22 :::* LISTEN 21897/sshd: /usr/sb udp 0 0 127.0.0.1:323 0.0.0.0:* 630/chronyd udp6 0 0 ::1:323 :::* 630/chronyd # 系统还是仅开 port 22 的端口口,没有多余的 sshd 端口口,因此也不需要改到 SELinux 规则
如此一来,我们就可以通过 3388 这个端口口来连接到 works 的 ssh 服务了!现在,你可以在 master 这样做测试:
[vbird@master ~]# ssh -p 3388 works
如果一切顺利,你会发现可以登录 works 工作站,且通过的是 port 3388 喔!如果确认以后都要使用 port 3388 的话, 将这个设置写入 ~/.ssh/config 当中吧!
如果这部 works 工作站是需要提供给企业外部的用户使用的话,你不会希望用户登录你的 master 骨干之后,再转进来 works 工作站吧? 所以,你当然就会想要让用户直接从外部通过某个端口口直接转到 works 工作站才对啊~再假设你会将所有连接到 master 为 3388 端口口的封包, 全部转向到 works 去,让 works 自己管理自己的 sshd 使用时,并且又假设你使用的是鸟哥在前面章节提供的 /root/nftables.sh 文件内容, 此时,你只需要修改该文件内 part 2.4 的部份,在 mynat 的链里面增加这条规则:
# 注意!是在 master 骨干系统上面设置的 nftables 喔! [root@master ~]# vim /root/nftables.sh # part 2.4: 创建 DNAT 功能 .... nft add rule inet mynat mydnat iifname ${wanif} tcp dport 80 dnat ip to 192.168.30.1 nft add rule inet mynat mydnat iifname ${wanif} tcp dport 3388 dnat ip to 192.168.30.214 .... [root@master ~]# sh /root/nftables.sh [root@master ~]# nft list chain inet mynat mydnat table inet mynat { chain mydnat { type nat hook prerouting priority dstnat; policy accept; .... iifname "enp1s0" tcp dport 80 dnat ip to 192.168.30.1 iifname "enp1s0" tcp dport 3388 dnat ip to 192.168.30.214 } }
怎么测试呢?只要在企业外部,使用 port 3388 连接到 master 的对外 IP 地址 (我们的范例为 192.168.201.245),应该就能直接跳转到 works 工作站了!实际来测试一下:
# 在企业外部的连接测试方式: [vbird@outside ~]# ssh -p 3388 vbird@192.168.201.245 ssh: connect to host 192.168.201.245 port 3388: No route to host
见鬼了!怎么会无法连接呢?这是因为 works 工作站系统并没有放行你外部主机的连接啊!那怎么确定 master 骨干设置是否正确? 没关系,我们在 works 系统先暂时将 port 3388 的来源导向 port 22,等等记得要拿掉这条设置!
# 1.1 在 works 工作站将 port 3388 完整导向 port 22 [root@works ~]$ firewall-cmd --add-forward-port=port=3388:proto=tcp:toport=22 # 这个动作会导致可以连到 works:3388 的连接通通被放行!所以要注意别乱做! # 2.1 在企业外部的连接测试方式: [vbird@outside ~]# ssh -p 3388 vbird@192.168.201.245 The authenticity of host '[192.168.201.245]:3388 ([192.168.201.245]:3388)' can't be established. ECDSA key fingerprint is SHA256:Rk7dT54Gh2NBx5wBoaYQ5Qr1BSR4ArtPCSxHqG2uyEk. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '[192.168.201.245]:3388' (ECDSA) to the list of known hosts. vbird@192.168.201.245's password: Last login: Wed Apr 10 10:52:33 2024 from 192.168.30.254 [vbird@works ~]$ # 注意看!结果登录的不是 master 而是 works 喔!这就是外部跳转的功能! # 1.2 在 works 工作站,复原 firewalld 设置 [root@works ~]$ firewall-cmd --reload
这样就可以确认 master 的转递是没问题的啰!只是能不能放行最后的连接,就得要由 works 工作站自己决定!
如上个小节谈到的,我们的 works 工作站预计可能会对外提供服务,那重点来了,我们目前在 master 的转递已经是固定的没问题, 但是 works 的防火墙支持,则需要有固定的 IP 地址才能加以设置耶~那如果没有固定来源的 IP 地址可用时,该如何连接呢? 例如一些商务人士,需要拿着笔电或平板电脑到处跑的,这些人没办法使用固定的 IP 地址啊~那该如何是好?没关系, 我们可以使用 knock-server 来协助。
一般网络上面的扫描软件 (port scanner) 通常是一串连续的端口口号码做扫描,随便找到有问题的服务器,就尝试测试端口口内容, 找到有问题的软件,就予以攻击测试!攻击成功就抓到僵尸电脑了~那换个角度来说,如果我是有『特定的非连续端口口扫描』, 只要同一个 IP 地址来源在短时间 (数秒内) 进行的三个非连续端口口的扫描,那就假装这个 IP 来源其实就是我的客户, 那这个 IP 地址来源就动态的加入防火墙放行列表中~那不就可以用来放行我家客户的使用权!这就是 knock server 的功能! 基本流程是这样的:
就很好懂啊~只是,我们得要设置三个非连续的端口口来放行才好!现在,就让我们在 works 上头架设好需要的 knock 服务器吧!
这个 knock 服务器在 EPEL 里面有提供喔!所以,直接安装即可!
# 1. 在 works 工作占上面安装好 knock server 软件 [root@works ~]# yum install epel-release [root@works ~]# yum install knock-server # 2. 修改 /etc/knockd.conf 内容,放行三个端口口,且搭配 firewalld 的防火墙 [root@works ~]# vim /etc/knockd.conf [options] LogFile = /var/log/knockd.log Interface = enp1s0 [opencloseSSH] sequence = 7788:tcp,8877:tcp,8787:tcp seq_timeout = 15 tcpflags = syn start_command = /usr/bin/firewall-cmd --add-rich-rule="rule family='ipv4' source address='%IP%' forward-port port='3388' protocol='tcp' to-port='22'" cmd_timeout = 60 stop_command = /usr/bin/firewall-cmd --remove-rich-rule="rule family='ipv4' source address='%IP%' forward-port port='3388' protocol='tcp' to-port='22'" [root@works ~]# systemctl enable --now knockd
上面的意思是,要在 15 秒钟之内『依序且连续的敲击三个固定端口口』,若顺利敲击这三个端口口,那么防火墙规则就会自动创建好! 而创建防火墙之后,在 60 秒钟之后,就会将防火墙的放行规则删除!所以你得要在 60 秒之内使用 ssh 创建好连接!否则就得要重新敲击! 如果你觉得时间太短,可以拉长到 120 !不过,等待时间不要太长!怕被其他人攻击...
我们上面规范了 port 7788, 8877, 8787 这三端口口,这三个端口口就得从 master 骨干上面转传到 works 才行! 所以,请到 master 上面去编辑 nftables 脚本文件,同样在 part 2.4 的部份这样做:
# 1. 在 /root/nftables.sh 增加这几条规则的放行 # part 2.4: 创建 DNAT 功能 .... nft add rule inet mynat mydnat iifname ${wanif} tcp dport 3388 dnat ip to 192.168.30.214 nft add rule inet mynat mydnat iifname ${wanif} tcp dport 7788 dnat ip to 192.168.30.214 nft add rule inet mynat mydnat iifname ${wanif} tcp dport 8877 dnat ip to 192.168.30.214 nft add rule inet mynat mydnat iifname ${wanif} tcp dport 8787 dnat ip to 192.168.30.214 [root@master ~]# sh nftables.sh
此时,仅有四个端口口会导向 works 工作站~接下来,请前往外部主机,我们准备来测试看看设置值对不对!
你可以在外部系统安装使用 knock 用户端软件,不过,其实我们可以单纯的使用 nmap 来进行敲击喔!方式很简单!
# 1. 先在外部系统连续敲击三个端口口,一定要在 15 秒内完成! [vbird@outside ~]# nmap -Pn -p 7788 192.168.201.245 [vbird@outside ~]# nmap -Pn -p 8877 192.168.201.245 [vbird@outside ~]# nmap -Pn -p 8787 192.168.201.245 # 2. 再接下来的 60 秒之内,一定要连上 works 工作站,否则放行规则会被取消! [vbird@outside ~]# ssh -p 3388 192.168.201.245
一切顺利的话,你就已经连上工作站了!如果这时你回去工作站上面看一下 /var/log/knockd.log 的话,就会看到类似如下的画面:
[root@works ~]# tail /var/log/knockd.log
[2024-04-10 14:44] 192.168.201.254: opencloseSSH: Stage 1
[2024-04-10 14:44] 192.168.201.254: opencloseSSH: Stage 2
[2024-04-10 14:44] 192.168.201.254: opencloseSSH: Stage 3
[2024-04-10 14:44] 192.168.201.254: opencloseSSH: OPEN SESAME
[2024-04-10 14:44] opencloseSSH: running command: /usr/bin/firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.201.249' forward-port port='3388' protocol='tcp' to-port='22'"
[2024-04-10 14:45] 192.168.201.254: opencloseSSH: command timeout
[2024-04-10 14:45] opencloseSSH: running command: /usr/bin/firewall-cmd --remove-rich-rule="rule family='ipv4' source address='192.168.201.249' forward-port port='3388' protocol='tcp' to-port='22'"
你可能会问,鸟哥啊~你用的是 Linux client 端耶~我用的是 windows client 端耶~那怎办?没关系,你可以到 nmap 官网去下载预编软件:
里面有 Linux/Windows/MAC 版本的软件可供下载~下载完毕启动 cmd 或相关的终端机之后,使用与上面相同的方式,就可以敲击到正确的工作站系统, 立刻快乐的使用你的资源!不过要注意的是,windows 版本的安装,可能会被自动重新开机!所以,最好将重要的工作全部结束掉之后再安装! 不然挺麻烦~要多多注意!
想想看,我们在进行 rsync 备份时,还得要输入密码才能动作~那就不能做成『自动备份』的工具啦!我想要达成自动备份, 该如何处理?很简单!就让用户把密钥系统的公钥 (public key) 传输到服务器端即可!所以,首先就得要创建成对的密钥才行! 而且,一经创建成对密钥之后,就不要随便更改密钥~否则会影响到以后很多运作的环境。
先不要管 rsync 好了,我们先做个简单的范例。假如未来我们在 master 连接到 works 工作站,使用 vbird 这个一般帐号时, 希望不要输入密码就可以直接登录~那该如何处理?
在上面的案例中,我们想要从 master 系统的 vbird 用户,连接到 works 系统的 vbird 用户!刚刚好帐号是相同的! 这时,得要从连接发起端 (这个案例当中就是在 master 系统上) 创建密钥!所以,先在 master 系统以 vbird 的帐号进行如下的动作:
# 1. 在 master 骨干系统上面,以 vbird 帐号创建密钥! [vbird@master ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/vbird/.ssh/id_rsa): ↵ Enter passphrase (empty for no passphrase): ↵ Enter same passphrase again: ↵ Your identification has been saved in /home/vbird/.ssh/id_rsa Your public key has been saved in /home/vbird/.ssh/id_rsa.pub The key fingerprint is: SHA256:/jo+cKgRD/VWsrS3QKH7imgvDEvp/jB06c/JnPc9E54 vbird@master.vbird The key's randomart image is: +---[RSA 3072]----+ | .. | | ..+ . | | ..+ = | | + .* . | | ..o +.oSo . | |ooo . +o. .. | |o* . o oo . o | |..*.*.ooo..E | |.oo+oBo.+=..o | +----[SHA256]-----+ [vbird@master ~]# ll ~/.ssh -rw-r--r--. 1 vbird vbird 475 Apr 5 22:19 config -rw-------. 1 vbird vbird 2602 Apr 10 22:14 id_rsa -rw-r--r--. 1 vbird vbird 572 Apr 10 22:14 id_rsa.pub -rw-------. 1 vbird vbird 3023 Apr 9 17:08 known_hosts
上面的 id_rsa 就是私钥,这把钥匙不可以外流~而 id_rsa.pub 就是公钥~要传给 sshd 服务器端的密钥文件! 那要如何上传呢?很简单,使用 ssh-copy-id 即可!
使用底下的方式,将公钥上传到 works 工作站上面去!
# 2. 在 master 上面,将公钥发送到 works 上! [vbird@master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub vbird@works /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/vbird/.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 vbird@192.168.30.214's password: <==这里还是需要密码的! Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'vbird@works'" and check to make sure that only the key(s) you wanted were added. # 3. 登录 works 工作站,此时应该无须密码!然后查看家目录下的 .ssh 目录! [vbird@master ~]# ssh vbird@works [vbird@works ~]# ll .ssh -rw-------. 1 vbird vbird 572 Apr 10 22:19 authorized_keys [vbird@works ~]# exit
在 sshd 服务器端的用户家目录 .ssh 内,就会看到 authorized_keys 这个文件!内容就是公钥的信息啰! 就这么简单!未来从 master 连接到 works,就无须密码啰!
现在,让我们来处理一个比较麻烦的东西~既然 master 需要以 root 身份做备份,而且希望备份到 backup 服务器时, 也能用 root 的身份做纪录,这样文件的权限才会保持的比较正常~但是,如上所示,使用 ssh-copy-id 时, 第一次还是需要输入密码的!那该怎办?
要注意喔~现在我们需要的是,在 master 上,使用 root 登录 backup 系统时,可以登录 vbird 或 root, 两者都无须密码!那我们也知道其实上传的密钥系统在 ~/.ssh/authorized_keys 内啊~所以简单的处理方案来说, 我们能这样做:
# 1. 先在 master 系统上,以 root 的身份,创建密钥 [root@master ~]# ssh-keygen [root@master ~]# ll ~/.ssh -rw-------. 1 root root 2602 Apr 10 22:26 id_rsa -rw-r--r--. 1 root root 571 Apr 10 22:26 id_rsa.pub -rw-------. 1 root root 1107 Apr 10 11:28 known_hosts # 稍微确认一下文件确实是存在的比较妥当 # 2. 将密钥上传到 backup 系统的 vbird 用户上! [root@master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub vbird@backup [root@master ~]# ssh vbird@backup [vbird@backup ~]$ # 上传密钥之后,立刻测试一下连到 backup 系统是否能顺利登录! # 3. 在 backup 系统中,把 vbird 的密钥文件转一份到 root 下,且改成正确的权限 [vbird@backup ~]$ sudo su - [root@backup ~]# cd .ssh [root@backup .ssh]# cat ~vbird/.ssh/authorized_keys > authorized_keys [root@backup .ssh]# chmod 600 authorized_keys [root@backup .ssh]# restorecon -Rv . [root@backup .ssh]# ll -rw-------. 1 root root 571 Apr 10 22:30 authorized_keys [root@backup .ssh]# exit [vbird@backup ~]$ exit [root@master ~]# # 4. 回到 master 环境下,用 root 登录 backup 的 root 看看! [root@master ~]# ssh root@backup [root@backup ~]# exit
简单到爆炸喔!这样未来就可以进行 rsync 的自动备份了!
现在,我们可以将 master 的重要信息,拷贝一份到 backup 上了!就直接使用 crontab 吧!
[root@master ~]# vim backup.sh #!/bin/bash rsync -avz -e ssh --del /etc /root /home root@backup:/data/master rsync -avz -e ssh --del --mkpath /var/log /var/lib /var/spool root@backup:/data/master/var/ [root@master ~]# chmod 755 backup.sh [root@master ~]# /root/backup.sh [root@master ~]# crontab -e 0 3 * * * /root/backup.sh
这样就可以自动备份,而且也没有放行 backup 的 root 密码登录权!喔耶!
鸟哥在大学端也有教网页制作耶~虽然是非常生硬的课程~不过,有兴趣也可以瞧一瞧~
既然要网页设计,自然就得要提供学生们一个可以上传网页的免费空间啊~而且,让每个学生都有自己的帐号, 然后通过 ftps (注意,鸟哥不想提供 sftp,所以仅提供 ftps 喔!) 来传输他们的网页~甚至可以通过类似 notepad++ 或 vs code 等软件来连接登录系统~不过,总是有可能会防火墙设计出问题~也很担心有同学太厉害,随意登录网页服务器来恶搞~ 所以,鸟哥会让学生们的帐号,只能使用 ftps 而无法使用 ssh 喔!这时,就得要 sshd_config 的支持了!
其实主要的想法是,创建一个名为 dropssh 的群组,然后将用户加入这个群组,加到这群组的用户不能使用 ssh, 但是没有加入这个群组的,就可以使用!我们假设 works 工作站上面就有这些学生帐号~那该如何设计呢?
在 works 系统上,修改设置档,在最后的位置上面增加这个设置值:
# 1. 在 works 系统上面修改 sshd 的设置 [root@works ~]# vim /etc/ssh/sshd_config.d/vbird.conf DenyGroups dropssh [root@works ~]# systemctl restart sshd # 2. 创建名为 dropssh 的群组 [root@works ~]# groupadd -r dropssh [root@works ~]# getent group dropssh dropssh:x:985: # 3. 创建名为 student01 ~ student03 的帐号,且加入 dropssh [root@works ~]# useradd -G dropssh student01 [root@works ~]# useradd -G dropssh student02 [root@works ~]# useradd -G dropssh student03 [root@works ~]# id student01 student02 student03 uid=1001(student01) gid=1001(student01) groups=1001(student01),985(dropssh) uid=1002(student02) gid=1002(student02) groups=1002(student02),985(dropssh) uid=1003(student03) gid=1003(student03) groups=1003(student03),985(dropssh) [root@works ~]# echo 'myPossW0rd' | passwd --stdin student01 [root@works ~]# echo 'myPossW0rd' | passwd --stdin student02 [root@works ~]# echo 'myPossW0rd' | passwd --stdin student03 # 4. 在 master 系统上面尝试登录看看! [vbird@master ~]$ ssh student01@works student01@192.168.30.214's password: Permission denied, please try again. # 输入正确的密码也不能登录! # 5. 回到 works 系统上,使用 root 的身份观察看看 [root@works ~]# journalctl -xeu sshd ..... Apr 10 23:17:26 works sshd[31635]: User student01 from 192.168.30.254 not allowed because a group is listed in DenyGroups Apr 10 23:17:45 works sshd[31635]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.30.254 user=student01 Apr 10 23:17:47 works sshd[31635]: Failed password for invalid user student01 from 192.168.30.254 port 54822 ssh2
通过这个简单的方式,我们轻松的就完成学生帐号的创建!
我们的云端系统主要是使用 VNC 的图形化界面,为了让我们可以登录到虚拟机,很多时候我们都得要利用 remove-viewer 或相关软件, 来连接到 cloud 系统,并取得虚拟机的终端画面。而过去为了让我们可以从外面的环境连接到 cloud 系统 (192.168.201.249), 因此我们需要将虚拟机的终端机放置到 0.0.0.0 上面!而不是缺省的 127.0.0.1!要知道,让虚拟机放置到 0.0.0.0 上面, 如果没有管理好防火墙,等于是让你的实体机器暴露到互联网上耶!想想就觉得可怕!那怎办?
目前的想法是,我们还是希望虚拟机终端机可以开放到 cloud 系统的 127.0.0.1 上面,然后通过 ssh 的转址服务,将连接通过 ssh 信道, 转到 cloud 系统上!讲到这边,鸟哥相信你是看不懂的...没关系,画张图来看看!
如上图所示,在右边的云端系统 (本案例中,就是我们的 cloud 系统) 里面打开一个监听于 lo 界面 (127.0.0.1) 的 port 5934 之虚拟机, 就像我们的 works 工作站这样,然后在云端系统启动 sshd 这个服务 (其实原本就有启动了!)。接下来,在用户端 (等等我们会以 windows 为例), 我们通过 ssh 指令,在 client 与 server 中间搭建一条隧道 (ssh tunnel),并且在用户端本机激活一个监听的端口口,同时在服务器端则间听到 127.0.0.1 的 port 5934 端口口!两个端口口号码是可变的!如此一来,当我们在用户端连接到本机的 port 5934 时,其实就是连接到云端系统它本机的 127.0.0.1 了! 想当然尔,你无法直接连到 cloud 系统的 127.0.0.1 啊!但通过这条隧道,我们就可以顺利连上了!
现在,请先关闭 works 工作站系统,我们这里直接在 cloud 母系统上面进行正常关机流程~之后就开始重新编辑工作站 XML 配置档, 然后重新启动 works 在不给任何人接触的 lo (127.0.0.1) 环境中!整体流程大概是这样:
# 1. 在 cloud 母系统上面,先关闭 works 工作站! [root@cloud ~]# virsh list Id Name State ------------------------------------ 18 server_workstation running .... [root@cloud ~]# virsh shutdown server_workstation # 2. 修改配置后再次启动 works 系统 [root@cloud ~]# cd /kvm/xml/ [root@cloud ~]# vim server_workstation.xml <graphics type="vnc" port="5934" listen="127.0.0.1" passwd="rocky9"> [root@cloud ~]# virsh create server_workstation.xml [root@cloud ~]# netstat -tlunp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:5934 0.0.0.0:* LISTEN 2542960/qemu-kvm
这样就确定这个 port 5934 仅开放在云端系统的本机了!谁也接触不到喔!除非是 cloud 云端系统自己!
现在,在你的 windows 系统上面使用如下的指令来进行隧道的创建:
# C:\Users\vbird> ssh -L 本地端口口:127.0.0.1:远程端口口 [-N] 远程主机 选项与参数: -N :仅启动连接信道,不登录远程 sshd 服务器 本地端口口:就是打开 127.0.0.1 上面一个监听的端口口 远程端口口:指定连接到后面远程主机的 sshd 后,sshd 该连到哪个端口口进行传输 C:\Users\vbird> ssh -L 5934:127.0.0.1:5934 vbird@192.168.201.249 vbird@192.168.201.249's password: [vbird@cloud ~]#
这样就启动好你的隧道了!要注意的是,Windows 的 cmd 窗口不能关掉!就是上头已经出现 [vbird@cloud ~] 的画面不能关掉喔! 因为那就是隧道本身!接下来,使用 vnc viewer 或 remote-viewer 等软件,鸟哥在这边使用 tigervnc viewer,下载网址如下所示:
请下载安装 tigervnc64-1.13.1.exe 或 Win x64 MSI 文件,安装妥当之后,启动 tigervnc viewer 或 remote-viewer 软件,就会得到如下的画面, 然后输入正确的 IP 与端口口,其实就是本机的 5934 端口口啦!此时,ssh 隧道就会发挥效用,直接连接到 cloud 系统啰!
如果你觉得这样的终端机老是没有鼠标很讨厌~包括鸟哥用来教学时,总是没有鼠标可以使用~这样学生会看不到焦点.... 能不能在 tty 纯文本模式底下还能使用鼠标呢?可以的~这就得要使用古早古早以前的鼠标服务器啦!其实也没有什么了不起~ 就直接安装一个 gpm 软件,然后启动这个服务即可!鸟哥认为,这个服务不用常驻 (enable),需要的时候在激活就好!
# 在 works 系统的终端机上面,激活 gpm 服务,并测试鼠标 [root@works ~]# yum install gpm [root@works ~]# systemctl start gpm
接下来,你的纯文本终端机 (刚刚用 tigervnc / remote-viewer 抓到的画面) 就可以使用鼠标啰!!
基本上, ssh tunnel 的用途非常广~也可以拿来作为两部主机之间的加密信道~非常有趣!大家可以自行测试看看其他功能喔!
其实不知道应该把 nc 放在哪里,所以只好在这个小节拿出来讨论讨论。是这样的,鸟哥的一个朋友,有一次被叫去救援一部出问题的 Linux 系统, 该系统可以用很阳春的方法启动网络,但是...很麻烦的是,该系统的某些函数库失败,因此怎么也不能启动 sshd 这只服务!同时, 连 ssh 用户端指令也失败...当时急着要将这部 Linux 系统的重要数据拷贝出来,不过只有网络 IP 地址还活着,其他的网络指令通通失效了... 那怎么办呢?能不能用快速的 tar 来进行备份呢?要注意喔,此时我们无法使用 ftp, sftp, scp 等指令喔~
要使用 nc 这个指令,我们得要先安装 nmap-ncat 这个软件才行!而且 server/client 都要安装!所以,请先在 master 与预计测试的 works 两部系统上面安装好上述软件喔!
[root@master ~]# yum install nmap-ncat tar [root@works ~]# yum install nmap-ncat
既然要使用,就得要有个范本~我们假设要将 master 系统的 /root 目录拷贝到 works 系统的 /dev/shm 上面~ 那么该如何处理呢?很简单喔~我们先在接收端,也就是 works 系统上面,使用 nc 去监听 8888 这个端口口,然后将该端口口传来的消息, 全部丢给 tar 进行解压缩~方式如下:
# 1. 在 works 系统上面,先放行防火墙,然后进行 nc 的监听行为 [root@works ~]# firewall-cmd --add-port=8888/tcp [root@works ~]# cd /dev/shm [root@works shm]# nc -l 8888 | tar -zxvf -
此时光标就会卡住~因为 tar 监听的目标是 standard input 数据~但是我们尚未发送数据过来!现在,跑到 master 系统上面, 我们将 /root 的数据完整的丢给 nc 发送出去!
# 2. 在 master 系统上面,将 /root 数据发送给 works 喔! [root@master ~]# tar -zcvf - /root | nc works 8888
接下来,你会发现到两端同时会有文件数据丢出来!喔耶!这样就达到快速拷贝的目的了!当初鸟哥的朋友用这方式解决出问题的系统时, 真心觉得好厉害~而且,这种发送方式完全没有压缩或加密的问题,发送速度超级快!虽然中间数据是明码....所以不要在 internet 上面使用!
你可能有听说过,你的系统被开个后门~网络怪客可以通过这个后门登录到你的系统恶搞!那你可能会觉得奇怪~怎么开这个后门? 现在就让我们来开个后门测试看看。你可以在 works 工作站上面启动一个 port 8888 (刚刚的防火墙还没有复原!所以还能用这个端口口), 然后在这个端口口上面丢一只名为 /bin/bash 的程序。
# 1. 假设你在 works 系统上面,使用 root 权限,开了一个后门,提供 bash [root@works ~]# nc --exec '/bin/bash' -l 8888
这个时候,你的 works 就开了一个 port 8888 的后门了!那,如果你在 master 连接到这个 works 的后门,会发生什么事?
# 2. 在 master 骨干系统,你用一般帐号随意连接到 works 的 port 8888 看看: [vbird@master ~]$ nc works 8888 ls -l /root -rw-------. 1 root root 1204 Aug 4 2023 anaconda-ks.cfg getent shadow sshd sshd:!!:19573:::::: whoami root exit Ncat: Broken pipe. [vbird@master ~]$
虽然用户端发起连接后,没有提示字符 ($或#),但是输入指令让系统的 bash 去运行其他交互软件,还是可行的! 所以,这就是后门程序的雏型...你或许会说,鸟哥啊!你是用 root 的身份去运行的啊!没这么容易让怪客们取得我 root 的权限吧? 不过,这也是盲点~是『你』自己转成 root 的,也可能是『你』自己去下载一些软件并且是『你』自己运行的! 那如果这些软件不是官网提供的,而是乱下载的,那么『你自己这个 root』有没有可能就启动了某些后门程序呢? 大家自己想想看啰!
在基础篇我们讲到过 X window system 这个 X 窗口系统,也被称为 X11。X11 达成的软件目前主要有两个, 一个是 Xorg 一个则是近来比较热门的 XWayland。无论是哪个啦,我们还是得要知道一下,X 到底是什么?
基本上,X 架构分为两部份,一个是可以让我们画图的 X server (相当于画布),一个是可以绘画的组件 X client (就是实际的图标数据)。 也就是说,其实 X 系统也是可以跨平台喔~基本任务是这样:
由于每一支 X client 都是独立存在的进程,因此在图形显示会发生一些叠图的问题 (想像一下每一个 X client 都是一个很自我的画家, 每个画家都不承认对方的存在,都自顾自的在画布上面作画,最后的结果会是如何?)。因此,后来就有一组特殊的 X client 在进行管理所有的其他 X client 程序,这个总管的咚咚就是 Window Manager!
既然 X Window System 是 Linux 上面的一组程序,那么它如何启动的呢?早期的用户在登录系统后,必须要自己先启动 X server 程序,然后再启动个别的 Window manager ,若有其他需求,再启动其他额外的 X client 就是了。这么麻烦! 所以为了简化启动个人图形接口的步骤,后来还有所谓的 Display Manager (DM) 这玩意喔!
以目前的 RHEL 9 衍生作品当中,如果缺省激活图形界面的话,那么 tty1 通常就是 gdm 这个 display manager 启动一个 X server 之后, 让用户进行帐号密码登录的位置。若用户输入帐密为正确,那么缺省 tty2 就会是这个用户所需要的 X server 并搭配适当的 windows manager, 让用户可以运行多个 X 软件的终端界面啰。
我们来玩一下实际的 X 应用好了!请使用 10.2.5 章节提到的 remote-viewer 所提供的软件,然后通过 ssh tunnel 的功能, 取得 works 的终端界面!在这个界面中,我们使用的是最小安装,因此目前没有 X server!而且是纯文本界面喔! 现在,让我们来测试一下,试图让大家了解一下 X server, X client, Window manager 分别是什么吧!
首先,我们来安装 X server,请通过如下的方式来安装好并启动它:
# 1. 在 works 系统中,安装好需要的 X [root@works ~]# yum install xorg-x11-server-Xorg mesa-dri-drivers xterm [root@works ~]# which Xorg /usr/bin/Xorg # 2. 假设你目前的终端界面为 tty1,则底下输入动作后,你的 tty2~tty3 可能成为图形界面的画面 [root@works ~]# Xorg :1 & # 此时,你会被丢到某个终端画面,而且画面黑压压!不要害怕!请转回 tty1! # 3. 加上第一个 X application,使用 xterm 处理看看! [root@works ~]# xterm -display :1 &
请自行使用组合按键回到 tty2 或 tty3,应该就可以看到如下的画面啰!
接下来,我们先来安装一个 Xorg 的工具软件~不过,这个软件目前仅有 RHEL 8 的版本,所以我们可能得要去下载 RHEL 8 的版本来安装! 台湾可以在底下的网址来下载安装:
下载的软件名称为 xorg-x11-apps !请下载到 works 系统,然后这样安装!
[root@works ~]# yum install ./xorg-x11-apps-7.7-21.el8.x86_64.rpm [root@works ~]# xeyes -display :1 & [root@works ~]# xclock -display :1 &
再次转到 X 所在的终端机,你会发现类似下面的图标!
这下伤脑筋了!因为上面讲到,各个 X applications 都不知道对方的存在,所以上面就可以发现,最后运行的 xclock 将大家都盖住了...那怎办?接下来,我们安装一套比较轻量的 window manager,这个挺有趣的 window manager 称为 motif, 安装之后的软件会是 mwm 这个名称喔!来跑跑看!
# [root@works ~]# yum install motif xorg-x11-xinit [root@works ~]# mwm -display :1 &
再次回到 X 画面,就可以看到底下的图标了!相当有趣啊!
等到你都测试完成之后,请回到 tty1 ,使用 kill 将所有刚刚启动的图形软件,通通关掉吧!
[root@works ~]# kill %1
其实,关掉 Xorg 这个 X server 之后,其他的 X application 就会通通消失了!这就是最简单阳春的 X 系统测试介绍!
我们在之前谈到 ssh 的加密隧道时,说在本机可以创建一个连接信道,连到 server 去取得某个服务对吧~那,这个架构, 能不能用在 X 系统上呢?喔!你猜到了~当然是可以的!你唯一需要处理的,就只是用户端 (不管是 Linux/Windows/MAC) 的系统上面加装 X server 即可!Linux 是当中最不用担心的!因为 Linux 的 X 系统,本身就得要激活 X server~那 Windows 跟 MAC 系统呢? 呵呵!很简单啊~就用前面讲到的 windterm 软件即可!将 windterm 软件的 X server 打开~我们在前面 10.1.5 最后有提到喔! 自己回去查一查~之后,你的用户端只要 ssh 用户软件激活 X11 forward 功能,然后在 sshd 服务器端,安装 xauth 软件即可!
# 1. 在 works 工作站系统,安装好需要的图形界面验证软件 [root@works ~]# yum install xorg-x11-xauth # 1.2 接下来,请再开一个 putty 的窗口,并且使用 X11 forward 连接到 works [vbird@outsied ~]$ ssh -X -p 3388 192.168.201.245 [vbird@works ~]$ netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN - tcp6 0 0 ::1:6010 :::* LISTEN - tcp6 0 0 :::22 :::* LISTEN -
接下来就有趣啰~我们想要让 works 工作站去绘制风花图,通过风花图制图之后,将风花图显示到图标中!一般来说,除非直接在工作站前用 X 窗口工作, 或者是通过类似 VNC 的图形界面处理,否则很难达成这个目标。我们的目标却又是:在 works 工作站上面不要激活图形界面, 只用纯文本界面,但是却可以在某些地方显示正确的图形环境!这就是我们的目标!
我们这次想要测试的,是将 aermod 气象场数据转化成为风花图~鸟哥这边使用的风花图为通过 python 去绘图~因此需要一些额外的软件! 请先设置好安装的环境!
# 2. 在 works 工作站系统,安装 pip 软件,然后用 vbird 身份安装绘图环境 [root@works ~]# yum install python3-pip eog # 3. 用刚刚登录且具有 X 的用一般身份,创建好自己的环境 [vbird@works ~]$ pip install matplotlib windrose ... (会花费一些时间从网络上下载需要的软件并编译安装) # 4. 创建可供绘图的脚本档 [vbird@works ~]$ mkdir bin [vbird@works ~]$ vim ~/bin/mywindrose.py #!/bin/python import os.path import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.cm as cm from windrose import WindroseAxes sfc_file = input("input aermod met filename: ") def load_aermet_sfc_file(ff): myfile = open(ff,"r",newline="\n") lines = myfile.readlines() # Header record (latitude,longitude,ua_identifier, sf_identifier, os_identifier, version_date) = [lines[0].split()[i] for i in (0,1,3,5,7,8)] wind = [] for line in lines[1:]: (year,month,day,j_day,hour,h_sens,u_star,w_star,vptg,zic,zim,lmo,z_zero,bowen,albedo,ws,wd,zref,temp,ztemp,ipcode,pamt,rh,pres,ccvr,wsadj) = line.split() if (float(wd) >= 0 and float(ws) >=0): wind.append([float(wd),float(ws)]) myfile.close() d = {} d['wind'] = wind d['latitude'] = latitude d['longitude'] = longitude return d d = load_aermet_sfc_file(sfc_file) wd = [] ws = [] for pair in d['wind']: wd.append(pair[0]) ws.append(pair[1]) ax = WindroseAxes.from_ax() ax.bar(wd, ws, normed=True, opening=0.8, edgecolor='white',cmap=cm.hot) ax.set_legend() plt.suptitle(sfc_file+"\n LAT:"+d['latitude']+ " / LON: "+d['longitude']) plt.savefig(sfc_file+".png") print("Windrose plot saved as "+sfc_file+".png") [vbird@works ~]$ chmod a+x ~/bin/mywindrose.py # 4. 开始绘制图标! [vbird@works ~]$ cd ~/aermod_example [vbird@works aermod_example]$ ll -rw-r--r--. 1 vbird vbird 1780 Apr 9 15:54 aermod.inp -rw-r--r--. 1 vbird vbird 86897 Apr 9 15:57 aermod.out -rw-r--r--. 1 vbird vbird 588528 Jun 8 2022 aermod.pfl -rw-r--r--. 1 vbird vbird 1563673 Jun 8 2022 aermod.sfc -rw-r--r--. 1 vbird vbird 24255 Sep 1 2022 grid.dat -rw-r--r--. 1 vbird vbird 48452 Apr 9 15:57 plot.plt [vbird@works aermod_example]$ mywindrose.py input aermod met filename: aermod.sfc Windrose plot saved as aermod.sfc.png [vbird@works aermod_example]$ ll *.png -rw-r--r--. 1 vbird vbird 86664 Apr 15 15:03 aermod.sfc.png [vbird@works aermod_example]$ eog aermod.sfc.png
如果一切顺利的话,在你的 Windows 系统上面,就会出现如下的图标:
很愉快的是!你只要在 windows / MAC 等系统上面启动 windterm 并且在 windterm 里面激活 X server,之后再通过命令提示字符, 或者是 putty (建议用这个),有激活 X11 forward 的功能喔!然后在 works 工作站 (或其他任何支持 sshd 的地方), 直接运行图形界面,连 firefox 也可以喔!就能从 windows 里面抓到你的图标了!相当方便!
基本上,使用 X11 forward 的功能,你想要什么通通都可以了!不过,某些时刻,你可能还是想要直接连接到 Linux 的图形界面! 虽然机会不大,但总是可能...这时怎办?那就用 VNC 好了!简单!愉快!又方便使用~但是,VNC 的画面就真的是在工作站端 (服务器端), 所以,所有的图形界面全部要从远程系统去运作喔~你就不能保持简单干爽的工作站环境了...所以,各有利弊!请自己选择!
目前比较知名的大型图形界面软件,大概有 GNOME, KDE 与 XFCE 等,其中大概又以 XFCE 最轻量~安装与使用上面, 会比较不会占用太多系统硬件资源~而 RHEL 衍生产品中,XFCE 的图形界面环境,是放置于 EPEL 的软件仓储下! 所以,我们得要从 epel 里面下载这软件才行!如果你是从前面就跟到现在,那么你的 works 里面应该有 epel 仓储了! 只要安装 XFCE 即可!
# 1. 在 works 工作站上面,确认有支持 epel 之后,看看有没有 xfce 关键字的软件群组 [root@works ~]# yum repolist repo id repo name appstream Rocky Linux 9 - AppStream baseos Rocky Linux 9 - BaseOS epel Extra Packages for Enterprise Linux 9 - x86_64 epel-cisco-openh264 Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64 extras Rocky Linux 9 - Extras [root@works ~]# yum grouplist | grep -i xfce Xfce [root@works ~]# yum groupinstall Xfce # 因为软件挺多~会安装比较久~ # 2. 安装 VNC 服务器软件 [root@works ~]# yum install tigervnc-server
这样就安装好了 XFCE 了!现在,我们想要测试一下 VNC server 的创建,最简单的方式,可以通过 vncserver 来达成!
# 在 works 工作站系统,请务必使用一般帐号身份来操作!不要用 root 喔! [vbird@works ~]$ vncserver [:号码] [-geometry 分辨率] [options] [vbird@works ~]$ vncserver [-kill :号码] 选项与参数: :号码 :就是将 VNC server 开在哪个端口口,如果是 :1 则代表 VNC 5901 端口口 -geometry :就是分辨率,例如 1024x768 或 800x600 之类的 options :其他 X 相关的选项,例如 -query localhost 之类的 -kill :将已经启动的 VNC 端口口删除!依据身份控制喔。 [vbird@works ~]$ vncserver :1 You will require a password to access your desktops. Password: <==这里输入你要的 VNC 连接密码 Verify: <==再一次 Would you like to enter a view-only password (y/n)? y Password: <==这里输入能看到同步画面但不能操作的密码 Verify: <==再一次 New 'works.server.vbird:1 (vbird)' desktop is works.server.vbird:1 Creating default startup script /home/vbird/.vnc/xstartup Creating default config /home/vbird/.vnc/config Starting applications specified in /home/vbird/.vnc/xstartup Log file is /home/vbird/.vnc/works.server.vbird:1.log [vbird@works ~]$ netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 9056/Xvnc tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN - tcp6 0 0 ::1:6010 :::* LISTEN - tcp6 0 0 :::5901 :::* LISTEN 9056/Xvnc tcp6 0 0 :::22 :::* LISTEN -
第一次使用 VNC 时,系统会要求你输入 VNC 连接的密码,这个密码是连接密码,跟妳自己的帐号无关~ 至于第二个密码则很有趣!有时候,你或许会需要提供『画面同步』的教学之类的功能,但是又不想让你的同伴取得 VNC 的键盘、鼠标操控权, 那你就可以告知你同伴第二组密码,当他输入第二组密码后,就能看到画面,但就是没有操控权!有点类似广播屏幕的感觉。 最后,那个 :1 代表的是 VNC 的第一个画面,使用的端口口其实是 5901 喔!所以,如果是 :10 的话,那就代表 port 5910 啰! 既然放行端口口了,请处理一下防火墙啰!
# 在 works 工作站系统,用 root 调整一下防火墙~ [root@works ~]# firewall-cmd --permanent --add-port=5900-5910/tcp [root@works ~]# firewall-cmd --reload
这个是开放对外的连接,但如果我们想要使用 ssh 隧道呢?在你外部的电脑这样做也可以的!
C:\Users\vbird> ssh -p 3388 -L 5901:127.0.0.1:5901 vbird@192.168.201.245
然后启动 windows 的 tigervnc viewer,并在画面中输入 127.0.0.1:5901 之后,并输入你刚刚启动 VNC server 的密码, 就可以看到如下的画面了!快快乐乐玩图形!
等等~不对吧!我们应该是要使用 XFCE 的吧!为啥画面会是 GNOME 呢?这是因为缺省的 VNC 就是找系统缺省图形画面, 所以缺省会找 GNOME 啦!那怎办?没关系,关闭 VNC 之后,修改一下 ~/.vnc/xstartup 内容即可!
# 关闭 port 5901,并且设计使用 startxfce4 作为图形界面的启动! [vbird@works ~]$ vncserver -kill :1 [vbird@works ~]$ vim ~/.vnc/xstartup #!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS startxfce4 & [vbird@works ~]$ vncserver :1
再次以 vncviewer 连接,就会看到如下的画面!真的很有趣喔!
如果还想要修改 VNC 密码的话,就使用 vncpasswd 吧!其他跟个人有关的 VNC 数据,请自行参考 ~/.vnc/ 啰!
操作 VNC 的情境下,你会发现,当断开 vncviewer 之后,再次连接,只要不关闭 :1 的情境,那么在画面上的数据都会持续存在! 这个在你需要将某些长时间运行的软件放置到工作站,让工作站自己跑的时候,就很有帮助!因为,你无论何时回来,都能看到上次的工作情况! 你也不用担心因为网络问题,让你的某些长时间运作的连接因此而需要重跑...这其实对鸟哥来说很重要!我跑的数值模式, 通常按下 enter 之后,等到结果生出来,大概都得要 12 小时以上...如果一直通过 ssh 连接,那当连接中断时,我的这只程序可能就挂了! 得要重跑耶!时间成本很可怕!此时,VNC 连接的功能,对我来说就很重要了!
但是,使用图形界面就是有个问题,即使稳定如 Linux,图形界面耗用的资源还是太大!而且,架构太庞大!如果一个小细节没有搞定, 还是可能会让我的模式平白无故的受到影响~所以,有没有可以丢在工作站自己跑的终端机?如果数值模式可以自己在系统跑, 而且是纯文本界面,当我回来时,查看一下进度就好了!不用搞一个大大的 VNC 连接啊!有没有这玩意儿?有啦!有两个! 一个是老牌的 screen 软件,另一个则是 tmux !screen 只存在 epel 仓储,RHEL 缺省有提供的则是 tmux !所以, 底下我们就单纯介绍 tmux 啰!
什么是 tmux 呢?你可以简单的这样想,tmux 就是丢在服务器端的一个云里面的终端机,你随时可以取得该终端界面, 也可以卸载该终端界面,让该终端界面可以自己在系统内部跑~跟你登录的 ssh 或什么其他的连接无关~而我们的终端机, 最重要的当然就是 shell 啰!所以你也可以简单的想,就是将 bash 丢到背景去,让 bash 自己运作~有需要的时候再拿到前景来看看! 没事就丢到背景去~有点类似那样的感觉啰~
所以 tmux 全名应该是 terminal multiplexer,当中 multiplexer 简写为 MUX ,中文简称为多路复用器或多任务器等,所以 Tmux 名称就这样来的! 可以同时操作多个终端机的意思~应用上相当方便喔!
多说无益,先装好之后,操作看看你就知道是什么东西了!
# 1. 在 works 工作站,安装好 tmux [root@works ~]# yum install tmux # 2. 直接激活一个 tmux 的会议 (session) [vbird@works ~]$ tmux
输入了 tmux 之后,你的原本画面应该会变成这样喔!
如果你想要关闭 tmux 了,那就直接输入 exit !画面就会回到原本的 putty 的 bash 界面了!那,如果你想要启动一个有名字的会议, 可以这样做:
# 3. 离开刚刚的 tmux 环境后,启动一个名为 myenv 的会议名称 [vbird@works ~]$ exit <==这是在刚刚的 tmux 环境下注销! [vbird@works ~]$ tmux new -s myenv <==这则是在原生的 ssh 环境下使用
你就会发现到左下角的名字变成 myenv 了!这就是一个有名称的 session 啰!你可以在这个 session 当中操作你需要的指令, 要运行多久也没关系~就让系统自己跑~那如何离开这个 tmux 的 session 呢?这就得要讲到 session 的功能键了! 在 tmux 环境下,功能键为 [ctrl]+b,之后放开这两个按键,再加其他的按键,就可以达成需要的功能!先来测试一下怎么离开目前的 session! 请使用 [ctrl]+b,然后按下 d,你会发现变这样:
[vbird@works ~]$ tmux new -s myenv [detached (from session myenv)] # 4. 查看有多少个 tmux 之后,将 myenv 会议取回! [vbird@works ~]$ tmux ls myenv: 1 windows (created Mon Apr 15 22:57:29 2024) [vbird@works ~]$ tmux attach [-t myenv]
因为目前我们仅有一个会议 (session),所以没有加上 -t myenv 也没关系~好了!那么在 tmux 的环境下,如果你想要滚回之前的画面, 就是在 putty 里面用滚轮往前滚,就会看到之前的画面啦!但是...在 tmux 的环境下,你鼠标往前滚...没效果啊~出现的是原生的 ssh 取得的 bash 画面,并不是 tmux 内的 bash 命令!哈哈!这时你就得要使用 tmux 内的缓冲内存了!可以按下『 [ctrl]+b, [ 』, 或者是按下『 [ctrl]+b, [pageup]/[pagedown] 』也可以进入缓冲内存的拷贝模式! 例如输入 ll /etc 之后,使用上述按键,就可以出现这样:
离开 buffer 的环境,只要按下 q 按钮即可!这就是最简单的 tmux 应用!如果你只需要使用单一一个会议, 那了解到这边也就差不多了!已经可以帮助你做好多好多事情啰!
正常情况下,在 putty 与 tmux 的使用情境中,鼠标滚轮可以推回之前的画面 (tmux 环境下,推回的画面也会是之前 putty 的内容, 而不是 tmux 会议中的画面),鼠标左键可以圈选数据并且达成直接拷贝的功能,鼠标右键则是直接粘贴的功能!如果你想在在 tmux 的会议中, 启动鼠标滚轮往回推画面的功能,同时鼠标右键变成『打开菜单』的功能时,可以使用『 [ctrl]+b, : 』然后输入『 set -g mouse on 』, 即可开始使用鼠标!相当有趣喔!
鸟哥觉得这个鼠标滚轮往回推是相当有帮助的功能哩!而菜单则是见仁见智!看你有没有需要就是了!至于离开菜单的方式,同样按下『 q 』即可。 如果需要关闭这个功能,让鼠标回归原本的拷贝粘贴,同样的『 [ctrl]+b, :』然后输入『 set -g mouse off 』即可关闭鼠标功能!简单好用!要纪录一下!
等等我们会介绍一下 tmux 在一个会议内置立多个窗口 (window) 与多个面板 (panel) 的功能~那么如此一来,状态栏单纯一个颜色, 就显的有点不好判断~假设,我们要让状态栏在目前会议画面中的项目显示变化为红底白字,我们可以输入命令『 [ctrl]+b, :』, 命令内容『:set -g window-status-current-style bg=red,fg=white』,输入项目正确之后,你的 tmux 画面会变成这样喔:
如果你想要这个效果持续的话,那就将这个数据写入家目录下的 .tmux.conf 文件即可!
[vbird@works ~]$ vim ~/.tmux.conf set -g window-status-current-style bg=red,fg=white
这样,未来新的 session 都会有状态栏变色的效果了!好!现在来总和一下 tmux 的 session 功能!
组合按键/指令 | 达成功能与离开按键 |
---|---|
tmux new -s s_name | 创建名为 _name 的新会议 |
tmux ls | 列出目前系统上面的所有 tmux 会议名称 |
tmux attach [-t s_name] | 取回上一个,或名为 s_name 的会议 |
[ctrl]+b +d | 离开目前的 tmux 回到原本的 bash 画面 (detache) |
[ctrl]+b +[ | 进入 copy 模式,可以按下方向键, [pageup] 等显示出上方的画面内容 |
[ctrl]+b +[pageup]/[pagedown] | 同样也能进入 copy 模式喔! |
[ctrl]+b +s | 显示出所有的 session 名称,可以用方向键进入某个 session |
[ctrl]+b +$ | 可以修改目前这个 session 的会议名称 |
[ctrl]+b +: | 可进行环境设置或查阅,如『 :set -g mouse on 』等设置值 |
有时候,你可能不想要打开多个 session,而是在一个 session 里面打开多个 window 的状态!这时候, 不需要使用 tmux 指令,而是在 tmux 的环境下,使用『 [ctrl]+b, c 』来激活另一个新窗口,现在, 鸟哥按下两次上面的组合按键,我的 myenv 会议内容会变这样:
那怎么切换窗口呢?最简单的方法,就是 [ctrl]+b, +号码,例如要回到 0 号,那就直接『 [ctrl]+b, +0 』就可以回到 0 号了! 那如果想要使用可视化挑选,可以使用 [ctrl]+b, +w 的方式取得条列式预览画面喔~挺有趣的!按下『 [ctrl]+b, +w 』画面会变这样:
如果要离开窗口,建议使用『 exit 』关闭最好!如果因为某些原因让你无法输入 exit 时,可以使用『 [ctrl]+b, +& 』去删除掉目前的窗口, 这样也是 OK 的!那么同样的,就来总结一下 tmux 在 session 内的 window 指令汇整:
组合按键 | 达成功能与离开按键 |
---|---|
[ctrl]+b, +c | 打开新的窗口 (window) |
[ctrl]+b, +数字 | 切换取得第『数字』号的窗口 |
[ctrl]+b, +w | 可供预览的窗口条列式选择画面 |
[ctrl]+b, +& | 尝试离开关闭窗口 (会有提示是否真要注销) |
无论是多个会议还是多个窗口,我们都得要在不同的窗口中切换。那么有没有办法让好多个动作中在某个窗口呢? 有的,那就是将窗口分割出多个面板的功能!这功能挺有趣的喔!如果你刚刚有加入鼠标的功能,那么按下右键的菜单后, 就可以看到 (v) 及 (h) 的分割行为~如果没有鼠标支持,可以按下『 [ctrl]+b, +[%|"] 』% 可以做垂直左右两个分割, " 则可以做水平上下两个分割~如果你有激活鼠标功能,则在每个面板的边框按下鼠标左键后,就可以调整面板的大小! 底下的图标则是鸟哥做了三个切割之后的结果~在不同的 panel 之间切换,可以使用『 [ctrl]+b, +方向键 』来处理! 相当简易~
快速总结一下 tmux 的面板功能:
组合按键 | 达成功能与离开按键 |
---|---|
[ctrl]+b, +% | 分开左右两边,产生两个左右面板 |
[ctrl]+b, +" | 分开上下两边,产生两上下右面板 |
[ctrl]+b, +空白 | 可以切换布局,以上面案例共 3 个面板,会将这三个面板方位!很有趣! |
[ctrl]+b, +方向键 | 在不同的面板之间切换 |
[ctrl]+b, +x | 关闭此面板。建议使用 exit 停掉 bash 即可! |
想要关闭面板,同样建议使用 exit 会比用功能键好喔!以上就是简易的 tmux 介绍!如果你经常连接到远程系统去工作, 且工作通常是长期的运作,确实建议使用 tmux 来操作你的 bash 行为!未来个画面接管会比较容易喔!底下列出参考数据, 大家有空也可以到其他网站瞧瞧不同的使用方法!