实战自动化修改主机名
一、主程序
#!/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
这个脚本的功能是允许用户通过终端输入一个新的主机名来更改系统的主机名。下面逐步解析这个脚本:
-
脚本开头的
#!/bin/bash告诉系统此文件是一个Bash脚本,并指定了解释器的位置,即/bin/bash。 -
脚本定义了一个名为
set_hostname的函数。这个函数接受一个参数,即新的主机名。- 函数开始时,使用
echo打印一条消息,告诉用户正在设置主机名。 - 接着,使用
hostnamectl set-hostname $new_hostname命令实际设置主机名。 - 随后,脚本使用条件判断 [
if [ "$(hostname)" == "$new_hostname" ]; then] 来检查主机名是否被成功设置。这里使用hostname命令获取当前主机名,并与新主机名进行比较。 - 如果主机名设置成功,将打印成功消息。否则,打印失败消息,并且通过
exit 1退出脚本,返回状态码 1,表示出错。
- 函数开始时,使用
-
脚本主体部分首先提示用户输入新的主机名,并使用
read命令来获取用户输入的内容,保存到变量NEW_HOSTNAME。 -
之后是一个条件判断 [
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 命令终止执行。
这里是您脚本的完整流程分析:
- 脚本开始执行。
set_hostname函数定义了如何设置系统的主机名。- 脚本提示用户输入新的主机名并等待用户响应。
- 如果用户直接按回车(不输入任何内容),
read命令将会结束,并且变量NEW_HOSTNAME将为空。 - 脚本检查变量
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 0:exit命令用于结束脚本的执行。后面跟着的数字0通常表示脚本是成功或正常地退出。(按照 UNIX 约定,0代表 "成功",非0代表有错误发生) -
fi: 这是if语句的结束标志。
整个 if 块的作用,就是在用户没有提供新的主机名(即 $NEW_HOSTNAME 为空)时,打印退出消息,并且通过 exit 0 命令正常退出脚本。这样用户就知道脚本没有进行任何更改,并成功退出了。
相关文章:
实战自动化修改主机名
一、主程序 #!/bin/bash# 设置主机名为node01 set_hostname() {local new_hostname$1echo "正在设置主机名为 $new_hostname ..."# 使用hostnamectl设置主机名hostnamectl set-hostname $new_hostname# 检查主机名是否更改成功if [ "$(hostname)" "…...
无人机GB42590接收端 +接收端,同时支持2.4G与5.8G双频WIFI模组
严格按照GB42590的协议开发的发射端,通过串口和模块通讯,默认波特率 921600。 http://www.doit.am/首页-深圳四博智联科技有限公司-淘宝网https://shop144145132.taobao.com/?spma230r.7195193.1997079397.2.71f6771dJHT2r0 二、接口文档 单片机和模…...
PVE系统的安装
一.PVE系统的安装 前置准备环境:windows电脑已安装Oracle VM VirtualBox,电脑支持虚拟化,且已经开启,按住ctrl+shift+ESC打开任务管理器查看是否开启,如果被禁用,可进入BIOS开启虚拟化,重启电脑后再进行后续操作。本步骤选用windows10安装VirtualBox,版本为7.0.8。 …...
一辆汽车的节拍时间是怎样的?
节拍时间,又称 takt time,是德语中“节奏”的意思。在汽车制造业中,它指的是按照客户需求和生产计划,生产一辆汽车所需的时间。这个时间是固定的,它决定了生产线上每个工序的操作速度和节奏,是生产线上所有…...
数据结构-合并两个有效数组
题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,…...
华为2024年校招实习硬件-结构工程师机试题(四套)
华为2024年校招&实习硬件-结构工程师机试题(四套) (共四套)获取(WX: didadidadidida313,加我备注:CSDN 华为硬件结构题目,谢绝白嫖哈) 结构设计工程师,结…...
使用Pandas解决问题:对比两列数据取最大值的五种方法
目录 一、使用max方法 二、使用apply方法结合lambda函数 三、使用np.maximum函数 四、使用clip方法 五、使用where方法结合条件赋值 总结: 在数据处理和分析中,经常需要比较两个或多个列的值,并取其中的最大值。Pandas库作为Python…...
rk3588 安卓13 应用安装黑名单的接口
文章目录 概述一、app应用安装黑名单核心代码二、app应用安装黑名单核心功能分析三、代码实战1.先导入所需要的包2.添加获取黑名单方法3.添加限制黑名单方法4.上层使用PS:查看当前黑名单 总结 概述 在13.0系统rom定制化开发中,客户需求要实现应用安装黑名单功能&am…...
Grafana数据库为MySQL
一、Grafana是一款流行的开源监控和数据可视化平台,它默认使用SQLite作为数据库引擎。然而,对于大型项目或者需要更高性能的场景,我们通常会选择使用MySQL作为Grafana的数据库。在本文中,我将向你介绍如何将Grafana的数据库从SQLi…...
【计算机考研】数据结构都不会,没有思路,怎么办?
基础阶段,并不需要过于专门地练习算法。重点应该放在对各种数据结构原理的深入理解上,也可以说先学会做选择题、应用题。 因为在考试中,大部分的算法题目,尤其是大题,往往可以通过简单的暴力解决方案得到较高的分数。…...
word文档显示异常,mac安装word字体:仿宋gb2312
因为mac没有gb2312字体,windows上word里显示的gb2312字体与排版,在mac上显示为黑体、排版也错乱了,得不到想要打印格式。 需要安装gb2312字体 下载:仿宋GB2312.zip 解压后双击安装得到:仿宋GB2312.ttf 放入word&…...
【运维】Ubuntu 配置DNS服务器
背景 异常表现 部分域名无法解析,表现为 ping ***.com 提示 ping: ***.com: No address associated with hostname尝试解决方案 采用 sudo vim /etc/resolv.conf编辑的形式,指定DNS解析服务器 原始内容如下: nameserver 127.0.0.53 opti…...
头歌-机器学习实验 第8次实验 决策树
第1关:什么是决策树 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务,你需要掌握决策树的相关基础知识。 引例 在炎热的夏天,没有什么比冰镇后的西瓜更能令人感到心旷神怡的了。现…...
Spring和Spring MVC和MyBatis面试题
面试题1:请简述Spring、Spring MVC和MyBatis在整合开发中的作用? 答案: Spring:是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。它提供了强大的依赖注入功能,…...
用vue3写一个AI聊天室
效果图如下: 1、页面布局: <template><div class"body" style"background-color: rgb(244, 245, 248); height: 730px"><div class"container"><div class"right"><div class"…...
photomaker:customizing realistic human photos via stacked id embedding
PhotoMaker: 高效个性化定制人像照片文生图 - 知乎今天分享我们团队最新的工作PhotoMaker的技术细节。该工作开源5天Githubstar数已过6千次,已列入Github官方Trending榜第一位,PaperswithCode热度榜第一位,HuggingFace Spaces趋势榜第一位。项…...
FFmpeg - 如何在Linux上安装支持CUDA的FFmpeg
FFmpeg - 如何在Linux(Ubuntu)上安装支持CUDA的FFmpeg 笔者认为现在的很多“xx教程”只讲干什么不讲为什么,这样即使报错了看官也不知道如何解决。 在安装过程的探索部分会记录我的整个安装过程以及报错和报错的解决办法。 在省流之一步到位的方法部分会省去安装过…...
新火种AI|商汤发布下棋机器人元萝卜,率先深入家庭场景。
作者:小岩 编辑:彩云 如今提及生成式AI(AIGC),已经不算什么新鲜产物了。自2014年GAN神经网络出现,2017年Transformer架构演进,再加上2023年ChatGPT的大火,无不说明生成式AI正在有条…...
CSS实现三栏自适应布局(两边固定,中间自适应)
绝对定位的元素会脱离文档流,它们是相对于包含块(通常是最近的具有相对定位、绝对定位或固定定位属性的父元素)进行定位的。当你把一个绝对定位的元素的高度设置为100%时,它会相对于其包含块的高度来确定自己的高度。如果包含块是…...
MoCo 算法阅读记录
论文地址:🐰 何凯明大神之作,通过无监督对比学习预训练Image Encoder的表征能力。后也被许多VLP算法作为ITC的底层算法来使用。 一方面由于源代码本身并不复杂,但是要求多GPU分布式训练,以及需要下载ImageNet这个大规模…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
