实战自动化修改主机名

 一、主程序

#!/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.mzph.cn/news/806247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化 单元测试Test

XCTest测试框架(单元测试XCTests、性能测试XCPPerformanceTests、用户界面测试XCUItests) 单元测试XCTests:测试应用中事件或逻辑是否预期工作。 用户界面测试XCUItests:测试用户与应用的UI交互(如点击按钮、滑动屏幕)。 性能测试XCPPerformanceTests&am…

云手机解决海外社媒运营的诸多挑战

随着海外社交媒体运营的兴起,如何有效管理多个账户成为了一项挑战。云手机作为一种新兴的解决方案,为海外社媒运营带来了前所未有的便利。 云手机的基本原理是基于云计算和虚拟化技术,允许用户在物理手机之外创建和使用多个虚拟手机。这种创新…

校园论坛系统

文章目录 校园论坛系统一、项目演示二、项目介绍三、10000字论文参考四、系统部分功能截图五、部分代码展示六、底部获取项目和10000字论文参考(9.9¥) 校园论坛系统 一、项目演示 校园论坛系统 二、项目介绍 基于springbootvue的前后端分离…

SpringBoot3 + uniapp 对接 阿里云0SS 实现上传图片视频到 0SS 以及 0SS 里删除图片视频的操作(最新)

SpringBoot3 uniapp 对接 阿里云0SS 实现上传图片视频到 0SS 以及 0SS 里删除图片视频的操作 最终效果图uniapp 的源码UpLoadFile.vuedeleteOssFile.jshttp.js SpringBoot3 的源码FileUploadController.javaAliOssUtil.java 最终效果图 uniapp 的源码 UpLoadFile.vue <tem…

tp6 mongodb简单的增删改查

controller/mongo.php <?phpnamespace app\controller; use think\facade\Db; class Mongo {/*** 插入数据* */public function insert(){// 插入数据$data [name > zhangsan,email > zhangsanexample.com,children > [_id > 1,name > "Child 2&qu…

AI大模型引领未来智慧科研暨ChatGPT自然科学高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

starrocks的fe节点启动不起来的解决办法

fe节点启动报错:Do not specify the helper node to FE itself. Please specify it to the existing running Leader or Follower FE at com.starrocks.StarRocksFE.main(StarRocksFE.java:68) [starrocks-fe.jar:?] Caused by: com.sleepycat.je.EnvironmentFailureExcepti…

智能学习新纪元:AI个性化教育平台的革命

在AI个性化教育平台的应用领域&#xff0c;即便是普通人也有多种创业机会。AI技术在教育中的应用正逐步扩展&#xff0c;不仅限于传统的教育内容提供&#xff0c;还包括个性化学习路径的设计、学习效果的评估、互动式学习体验的创造等。以下是几个具体的创业方向&#xff1a; …

FFmpeg 结合cut、ffprobe批量以JSON格式查看音视频信息,附带参数详细说明

背景&#xff1a;查看下面audio_info.txt文件中音频的时长等信息。 /data/htdocs/demo/GPT-SoVITS/GPT-SoVITS/output/ambor/slicer_opt/vocal_原音频.wav.reformatted.wav_10.wav_0000000000_0000280800_0.000-4.680.wav|slicer_opt|ZH|所以我们猜测这背后也是深渊教团在捣鬼…

机器学习实训 Day1

线性回归练习 Day1 手搓线性回归 随机初始数据 import numpy as np x np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]) y np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])from matplotlib import pyplot as plt # 内嵌显示 %matplotlib inlineplt.scatter…

设计模式——责任链模式13

责任链模式 每个流程或事物处理 像一个链表结构处理。场景由 多层部门审批&#xff0c;问题分级处理等。下面体现的是 不同难度的问题由不同人进行解决。 设计模式&#xff0c;一定要敲代码理解 传递问题实体 /*** author ggbond* date 2024年04月10日 07:48*/ public class…

三种排序和对数器

三种排序 选择排序 就是在数组选出最小的数放到第一个索引上&#xff0c;然后选出次最小的数放到第二个索引上&#xff0c;依此类推 :::info [ 5, 1 , 3 , 2 , 4 ]第一次从0~4索引选出最小的放到0索引 [ 1, 5 , 3 , 2 , 4 ]第二次从1~4索引选出最小的放到1索引 [ 1 ,2 , 5 , 3…

数据结构-----链表

目录 1.顺序表经典算法 &#xff08;1&#xff09;移除元素 &#xff08;2&#xff09;合并数组 2.链表的创建 &#xff08;1&#xff09;准备工作 &#xff08;2&#xff09;建结构体 &#xff08;3&#xff09;链表打印 &#xff08;4&#xff09;尾插数据 &#xff…

【unity】【C#】UGUI组件

文章目录 UI是什么对UI初步认识 UI是什么 UI是用户界面&#xff08;User Interface&#xff09;的缩写&#xff0c;它是用户与软件或系统进行交互的界面。UI设计旨在提供用户友好的界面&#xff0c;使用户能够轻松地使用软件或系统。UI设计包括界面的布局、颜色、字体、图标等…

Github Benefits 学生认证/学生包 新版申请指南

本教程适用于2024年之后的Github学生认证申请&#xff0c;因为现在的认证流程改变了很多&#xff0c;所以重新进行了总结这方面的指南。 目录 验证教育邮箱修改个人资料制作认证文件图片转换Base64提交验证 验证教育邮箱 进入Email settings&#xff0c;找到Add email address…

Java集合List

List特有方法 经典多态写法 // 经典的多态写法 List<String> list new ArrayList<>();常用API&#xff1a;增删改查 // 添加元素 list.add("Java"); // 添加元素到指定位置 list.add(0, "Python");// 获取元素 String s list.get(0);// 修改…

Docker容器嵌入式开发:在Ubuntu上配置Postman和flatpak

在 Ubuntu 上配置 Postman 可以通过 Snap 命令完成&#xff0c;以下是所有命令的总结&#xff1a; sudo snap install postmansudo snap install flatpak在 Ubuntu 上配置 Postman 和 Flatpak 非常简单。以下是一些简单的步骤&#xff1a; 配置 Flatpak 安装 Flatpak&#x…

【Linux】环境下OpenSSH升级到 OpenSSH_9.6P1(图文教程)

漏洞描述 OpenSSH&#xff08;OpenBSD Secure Shell&#xff09;是加拿大OpenBSD计划组的一套用于安全访问远程计算机的连接工具。该工具是SSH协议的开源实现&#xff0c;支持对所有的传输进行加密&#xff0c;可有效阻止窃听、连接劫持以及其他网络级的攻击。OpenSSH 9.6之前…

Qt5 编译 Qt Creator 源码中的 linguist 模块

文章目录 下载 Qt Creator 源码手动翻译多语言自动翻译多语言 下载 Qt Creator 源码 Github: https://github.com/qt/qttools 笔记打算用 Qt 5.12.12 来编译 qt creator-linguist 所以笔者下载的是 tag - 5.12.12 &#xff0c;解压后如下&#xff0c;先删除多余的文件&#xf…

vue + element plus:ResizeObserver loop completed with undelivered notifications

ResizeObserver loop completed with undelivered notifications. 解释&#xff1a; 这个错误通常表示ResizeObserver无法在一个浏览器帧中传递所有的通知&#xff0c;因为它们需要的处理时间比帧的剩余时间更长。这通常发生在被观察元素的尺寸变化导致了一连串的回调函数被调…