实战自动化修改主机名

2024-04-13 20:12

本文主要是介绍实战自动化修改主机名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

 

一、主程序

二、 exit 1详解

三、程序优化分析

四、优化后程序


一、主程序

#!/bin/bash# 设置主机名为node01
set_hostname() {local new_hostname=$1echo "正在设置主机名为 $new_hostname ..."# 使用hostnamectl设置主机名hostnamectl set-hostname $new_hostname# 检查主机名是否更改成功if [ "$(hostname)" == "$new_hostname" ]; thenecho "主机名更改为 $new_hostname 成功."elseecho "主机名更改失败."exit 1fi
}echo "请输入新的主机名:"
read NEW_HOSTNAMEif [ -z "$NEW_HOSTNAME" ]; thenecho "未输入主机名,脚本退出。"exit 1
else# 调用函数来设置主机名set_hostname "$NEW_HOSTNAME"
fi

这个脚本的功能是允许用户通过终端输入一个新的主机名来更改系统的主机名。下面逐步解析这个脚本:

  1. 脚本开头的 #!/bin/bash 告诉系统此文件是一个Bash脚本,并指定了解释器的位置,即 /bin/bash

  2. 脚本定义了一个名为 set_hostname 的函数。这个函数接受一个参数,即新的主机名。

    • 函数开始时,使用 echo 打印一条消息,告诉用户正在设置主机名。
    • 接着,使用 hostnamectl set-hostname $new_hostname 命令实际设置主机名。
    • 随后,脚本使用条件判断 [if [ "$(hostname)" == "$new_hostname" ]; then] 来检查主机名是否被成功设置。这里使用 hostname 命令获取当前主机名,并与新主机名进行比较。
    • 如果主机名设置成功,将打印成功消息。否则,打印失败消息,并且通过 exit 1 退出脚本,返回状态码 1,表示出错。
  3. 脚本主体部分首先提示用户输入新的主机名,并使用 read 命令来获取用户输入的内容,保存到变量 NEW_HOSTNAME

  4. 之后是一个条件判断 [if [ -z "$NEW_HOSTNAME" ]; then],检查用户是否输入了主机名。-z 判断字符串长度是否为零,如果是,说明用户没有输入任何内容。

    • 如果用户没有输入主机名,将打印错误消息,并通过 exit 1 退出脚本,返回状态码 1。
    • 如果用户输入了主机名,脚本将调用 set_hostname 函数,并将用户输入的新主机名作为参数传递。

用户需要以 root 用户或使用 sudo 权限来执行此脚本,因为更改主机名是需要管理员权限的操作。

为了运行这个脚本,你可以将其保存在文件中,例如 change_hostname.sh,并给予执行权限:

chmod +x change_hostname.sh

然后运行脚本:

sudo ./change_hostname.sh

脚本将提示用户输入新的主机名,并按照脚本设定的流程更改系统主机名。如果在更改过程中遇到任何错误,如无法设置新的主机名或用户未输入主机名,脚本将返回错误码 1 并退出。

二、 exit 1详解

命令exit 1在Shell脚本中表示退出当前的Shell,并返回一个状态码。在Linux和UNIX系统中,状态码(也称为退出状态或退出码)是一个小的整数值,它用于返回给脚本的父进程,通常用于表示程序或脚本的执行结果。

在Shell脚本中,exit语句后面可以跟一个数字,该数字就是退出状态码。状态码遵循某些惯例:

  • 0:表示成功完成。
  • 非零值:表示发生了错误或异常。

1是一种常见的非零退出状态码,通常表示通用错误。它可以被看作是一个标准的错误代码,告诉调用该脚本的程序或用户,某些地方出了问题。

在您的脚本的上下文中,exit 1被用在执行重要的任务失败时—例如在设置主机名失败时。如果脚本不能成功地设置主机名,使用exit 1表示失败,并且这个状态码可以被其他程序或脚本使用来判断该脚本是否成功执行了其功能。

例如,如果这个脚本是从另一个脚本中调用的,父脚本可以检查退出状态来决定是否继续执行其他任务或是进行错误处理:

./set_hostname.sh
if [ $? -ne 0 ]; thenecho "设置主机名失败,执行错误处理..."# 这里可以添加错误处理的代码
fi

在上面的例子中,$?是Shell中的一个特殊变量,用来存储上一个执行命令的退出状态码。如果set_hostname.sh返回1,表示出错,父脚本将执行错误处理的代码部分。

三、程序优化分析

在您提供的脚本中,使用 read 命令来要求用户输入新的主机名,并将其存储在变量 NEW_HOSTNAME 中。如果用户没有输入任何内容就按回车(即 NEW_HOSTNAME 变量为空),脚本将打印一条消息 "未输入主机名,脚本退出。" 并通过 exit 1 命令终止执行。

这里是您脚本的完整流程分析:

  1. 脚本开始执行。
  2. set_hostname 函数定义了如何设置系统的主机名。
  3. 脚本提示用户输入新的主机名并等待用户响应。
  4. 如果用户直接按回车(不输入任何内容),read 命令将会结束,并且变量 NEW_HOSTNAME 将为空。
  5. 脚本检查变量 NEW_HOSTNAME 是否为空。
    • 如果为空,脚本会输出错误消息并通过 exit 1 命令退出。
    • 如果不为空,即用户输入了新的主机名,则调用 set_hostname 函数,该函数使用 hostnamectl 命令来更新系统主机名,并验证更新是否成功。

这是一个很好的处理用户输入的例子,确保当需要用户输入时,用户是按预期响应的,如果输入不正确或不存在,给予用户适当的反馈。

四、优化后程序

#!/bin/bash# 设置主机名为输入的新主机名
set_hostname() {local new_hostname=$1echo "正在设置主机名为 $new_hostname ..."# 使用hostnamectl设置主机名hostnamectl set-hostname $new_hostname# 检查主机名是否更改成功if [ "$(hostname)" == "$new_hostname" ]; thenecho "主机名更改为 $new_hostname 成功."elseecho "主机名更改失败."exit 1fi
}# 等待用户输入新的主机名
prompt_for_hostname() {read -p "请输入新的主机名:" NEW_HOSTNAME
}prompt_for_hostname# 判断用户是否输入了主机名
while [ -z "$NEW_HOSTNAME" ]; doecho "未输入主机名。"read -p "您可以再次输入或按回车键退出:" NEW_HOSTNAMEif [ -z "$NEW_HOSTNAME" ]; thenecho "脚本退出。"exit 0fi
done# 如果用户输入了主机名,则调用函数设置主机名
set_hostname "$NEW_HOSTNAME"

五、知识点拓展

在 Bash 脚本中,if 语句用于基于某个条件进行判断。这里的 if 语句用于检查变量 $NEW_HOSTNAME 是否为空。

下面是各个组成部分的详细解释:

  • if: 是 Bash 中的条件语句关键字,后面跟一个方括号开始的条件表达式。

  • [ -z "$NEW_HOSTNAME" ]: 这是判断条件。-z 选项是用来检查字符串长度是否为零。如果长度为零(即字符串为空),条件为真。"$NEW_HOSTNAME" 是脚本中定义的变量,它保存了用户的输入。双引号用来确保即使变量内容中包含空格也可以作为一个整体处理。

  • then: 如果前面的条件为真(即 $NEW_HOSTNAME 为空),那么 then 后面的命令就会执行。

  • echo "脚本退出。": 这行命令会在控制台显示消息 "脚本退出。"。

  • exit 0exit 命令用于结束脚本的执行。后面跟着的数字 0 通常表示脚本是成功或正常地退出。(按照 UNIX 约定,0 代表 "成功",非 0 代表有错误发生)

  • fi: 这是 if 语句的结束标志。

整个 if 块的作用,就是在用户没有提供新的主机名(即 $NEW_HOSTNAME 为空)时,打印退出消息,并且通过 exit 0 命令正常退出脚本。这样用户就知道脚本没有进行任何更改,并成功退出了。

这篇关于实战自动化修改主机名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901111

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

如何使用Ansible实现CI/CD流水线的自动化

如何使用Ansible实现CI/CD流水线的自动化 持续集成(CI)和持续交付(CD)是现代软件开发过程中的核心实践,它们帮助团队更快地交付高质量的软件。Ansible,作为一个强大的自动化工具,可以在CI/CD流水线中发挥关键作用。本文将详细介绍如何使用Ansible实现CI/CD流水线的自动化,包括设计流水线的结构、配置管理、自动化测试、部署、以及集成Ansible与CI/CD工具(如Jen

如何在运行时修改serialVersionUID

优质博文:IT-BLOG-CN 问题 我正在使用第三方库连接到外部系统,一切运行正常,但突然出现序列化错误 java.io.InvalidClassException: com.essbase.api.base.EssException; local class incompatible: stream classdesc serialVersionUID = 90314637791991

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

android系统源码12 修改默认桌面壁纸--SRO方式

1、aosp12修改默认桌面壁纸 代码路径 :frameworks\base\core\res\res\drawable-nodpi 替换成自己的图片即可,不过需要覆盖所有目录下的图片。 由于是静态修改,则需要make一下,重新编译。 2、方法二Overlay方式 由于上述方法有很大缺点,修改多了之后容易遗忘自己修改哪些文件,为此我们采用另外一种方法,使用Overlay方式。