以下操作不适合生产环境使用,请谨慎评估需求后再进行相关操作

本文目标

  • 实现只能由特定虚拟机登录宿主机
  • 实现虚拟机中任务完成后实现宿主机关机操作
  • 临时解决 PVE web端无法登录问题

问题缘由

由于之前为PVE设置了OTP(动态一次性密码)登录,但由于最近服务器出现故障,可能时硬件问题导致服务器时钟不正确,也可能时软件问题,导致无法使用web端正常登录,因此需要使用命令行进入宿主机进行相关的操作。

过去一般时远程通过web登录查看服务器状态,如果当前服务器已经完成所有任务,为了节能,会对服务器进行关机操作。

恰好遇到上上述的问题,硬件问题未必能很容易解决(因为开发服务器非常老旧的二手服务器,已经不太有维修价值)。所以将尝试完成自动关机的操作。

思路

曾经有接触过,通过远程连接服务器,要先使用跳板机。因此,我们可以参考这样的操作。因为直接远程登录宿主机其实并不太安全。
所以,这里我们的问题将是如何设置只能由指定的虚拟机登录,并执行相关宿主机操作即可。

SSHD IP登录限制

首先,我们需要设置sshd的ip访问限制,我们可以通过 hosts.allowhosts.deny来配置。
添加允许访问ip

vim /ets/hosts.allow

# 添加以下内容
# ip 可设置为指定虚拟机的ip地址
sshd:<ip>:allow

禁止访问ip

vim /etc/hosts.deny

# 添加以下内容
# 禁止其余ip访问
sshd:ALL

完成上述操作后,即可在指定虚拟机的ip地址登录

使用密钥代替密码登录

为了方便在虚拟机中对宿主机进行操作,我们可以使用密钥代替每次输入密码登录,具体操作步骤可以参考Ubuntu 远程免密码登录设置

# 假设我们的宿主机命名为 pve-host
# 可以使用 ssh 免密登录
ssh pve-host
# 如果需要执行宿主机命令 例如关机:
ssh pve-host shutdown -h now

以上既完成了让虚拟机对宿主机进行关机的操作。
但是,以上的方法有很大的安全隐患以及局限性。如果你的服务器仅仅是你自己操作,并且能明确知道其他虚拟机的运行状态,可以有限的使用。但生产环境尤其应该禁止这样操作,因为有可能会造成不必要的损失!

[附]简单python关机脚本

import subprocess

def shutdown_host():
    sd_cmd = 'ssh pve-host shutdown -h now'
    subprocess.Popen(sd_cmd, shell=True, stdout=subprocess.PIPE, 
                                     stderr=subprocess.STDOUT, universal_newlines=True)

if __name__ == "__main__":
    shutdown_host()
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐