【Linux】彻底理解---环境变量(什么是环境变量,环境变量有什么作用?)
目录
一、前言
二、什么是环境变量?
三、如何添加环境变量?
四、如何获取环境变量?
💧环境变量相关的命令💧
💧测试HOME与USER💧
🔥环境变量的获取方式🔥
① envp表的介绍
② 通过命令行获取环境变量
③ 通过函数获取环境变量
五、详谈环境变量
🔥深入理解环境变量表🔥
🔥命令行参数的意义 🔥
五、总结与提炼
六、共勉
一、前言
环境变量是一种非常重要的概念,它对于系统的行为和应用程序的运行起着关键的作用。
- 那么环境变量究竟在扮演着什么样的角色呢?
- 为什么我们在编写C/C++代码的时候,不需要显式的告诉编译器我们所需要的动静态库在那,但链接照样可以成功的生成可执行程序,其实这里就有环境变量的辅助,所以接下来,就让我们一起来学习 ----- 环境变量
二、什么是环境变量?
首先我们在聊【环境变量】之前知道它是什么👇
环境变量(environment variables):一般是指在操作系统在开机的时候帮我们维护系统运行时的一些动态参数
- 读者可以回忆一下我们在学习
Java / Python
的时候,你们的老师是否有让你们配置过一个东西叫做【环境变量】呢?本文我们要讲的其实就是这个
- 打开【高级系统设置】中的【环境变量】,我们就可以看到熟悉的一幕了,如果有配置过Java中JDK的话一定会对这个有所印象
接下去我们要谈的是有关 --- 运行一个程序的方式
- 在 Windows 中,我们去运行一个程序是通过
双击
的形式 - 在 Linux 中,我们去运行一个程序是通过
./
的形式
- 那你是否想过在Linux中为什么我们不能直接通过敲入这个可执行程序的名字来运行这个程序呢?看到下面这二者的区别
- 可以看到,当我们去直接执行这个程序的时候,系统就报出了
command not found
。还记得我们在讲 Linux 基本指令 的时候提到过【相对路径】和【绝对路径】,那对于./
来说呢,指的就是【相对路径】 - 那换句话说呢,既然我们可以使用【相对路径】来执行程序,也可以使用绝对路径去访问到这个程序 ,即执行
/home/XAS/110/环境变量/mytest
这句指令即可。我们看到照样是可以正常运行的
💬 那有同学就诧异了,为什么一定要带上路径呢?为什么我直接运行就不行呢?
- 因为在我们的 Linux系统中是存在一个东西叫做【环境变量】的,这个环境变量可以帮助我们在系统特定的路径下找到那些指定的程序,例如我们在使用指令 [ls] 的时候,也是有这个【环境变量】的缘故才得以使我们能够正常地去运行这个指令,因为对于[ls]来说,你也可以将其看做是一个程序,它的存放路径是 /usr/bin/
那么一直在说这个环境变量,那它到底长什么样呢?我们来看看
常见的环境变量:
- PATH: 这个【环境变量】定义了系统在执行命令时查找可执行文件的路径。当你输入一个命令时,系统会在 PATH 中指定的路径下查找是否存在该命令的可执行文件,如果存在,则执行该命令。如果 PATH 中没有包含命令的可执行文件路径,则系统会提示“command not found”。(完美符合上面的情景)
- HOME: 这个【环境变量】指定了当前用户的主工作目录,也就是用户登录系统后所处的默认目录。当用户执行 cd 命令时,如果没有指定目标目录,则系统会切换到 HOME 目录。
- SHELL: 这个【环境变量】定义了当前用户所使用的 Shell。Shell 是用户与操作系统之间进行交互的界面,它解释并执行用户输入的命令。通常情况下,SHELL 的值为 /bin/bash,表示用户正在使用 Bash Shell。其他常见的 Shell 包括 /bin/sh、/bin/zsh 等。
查看环境变量:
- 如果要去查看这个【环境变量】的话,就需要使用到我们之前所学习过的一个指令叫做echo,其主要是用来【用于打印字符或者回显】,在其后面更上一个$PATH,我们就可以去查询到当前系统中所有的环境变量
- 这个$呢可以看作是我们在C语言中学习过的指针,那时我们通过*去对指针所指向的内容进行解引用的操作,在这里也可以这样去理解
echo $PATH
- 那我们运行来看一下,因为系统中的环境变量有很多,所以我们这里是以
[:]
来进行分割,刚才我们所执行的【ls】
指令就是在这个/usr/bin
这个路径下的
💬 所以我们就可以回答上面的那个问题了:为什么 mytest 不可以,ls 却可以直接运行呢?
- 我们默认的程序,在系统中会存在一个环境变量,这个环境变量能够帮我们在系统中特定的路径下搜索这个特定的命令。因为当前的这个
mytest
程序并不在系统的环境变量目录下,所以我们想要运行这个程序的,就需要手动地将这个程序添加到环境变量的目录下
三、如何添加环境变量?
那要怎么去将一个系统路径添加到【环境变量】中呢👈
- 这里要使用到一个关键字叫做
export
,然后将我们所要添加的路径放到其中即可
export PATH=/路径
- 在将这个路径添加到环境变量之后,我们再去直接执行这个程序,就可以发现它可以像正常的程序一样运行了。但是呢,当我在运行其它指令的时候,却发现它们都无法执行了,这时就有同学疑惑了,这是为什么?
- 那此时我们再去查看一下环境变量就可以发现,之前这里的很多系统路径都不见了,而是换成了我们之前所添加进去的这个路径。所以谜底就可以揭晓了,我们在往环境变量里添加路径的时候,对里面的内容造成了覆盖的情况,就像我们之前在讲 输入重定向 的时候,
>>
是追加操作,但>
却会造成覆盖的情况
- 此时,肯定有老铁已经慌了,那之前的指令不能用怎么办呀!,莫慌,大家只需要关掉 Xshell 或 虚拟机 重新启动,即可恢复正常哦!!
所以我们在往环境变量里面添加路径的时候,不应该形成覆盖,这里我再介绍一种方法
export PATH=$PATH:/路径
- 那我们按照这个方法来运行的话再去查看环境变量就可以发现,这个路径被添加进去了,而且并没有覆盖掉其他的内容
- 接下去我们再去执行这个程序的时候可以正常运行了,同时其它指令也可以运行
但是呢,当我们再去将服务器重启之后,再度运行这个可执行程序的时候,便可以发现我们之前添加的路径不见了。那这就又造成了很多同学的困扰,这该怎么办呢?
- 那此时我灵机一动💡,又想到了一个好的办法,那就是直接将这个路径拷贝到环境变量中
- 不过这个算是系统级别的操作,我们需要在【root】的权限下进行操作,普通用户的话带上
sudo
即可。然后我们看到在usr/bin
目录下就多出个mytest
,此时再去执行一下这个程序的话就可以发现可以正常运行
- 此时我们可以尝试再去一台服务器,发现这个可执行程序依旧是在的,说明这个方法是奏效的
- 既然可以拷贝过去的话也可以删除,但若是程序不在这个目录下的话就又无法运行咯~
四、如何获取环境变量?
💧环境变量相关的命令💧
首先我们来讲一讲和环境变量相关的命令有哪些
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
- 第一个
echo
、export
我们在上面讲到 添加环境变量 的时候就谈到了,接下去我们来讲讲这个env
。可以看到在敲出这个命令之后我们发现系统中所有的环境变量都显示出来了
- 这里可以带读者来简单地看两个,对于【HOSTNAME】而言指的就是 主机名,对于【SHELL】而言就是当我们在执行Linux指令的时候所需要交互的shell外壳,在这里是
bash
,最后的【USER】呢指的就是我们当前所登录的用户
💧测试HOME与USER💧
在这里我们可以来测试一下在不同用户之下所看到的环境变量有何不同,可以看到在普通用户下去查看
HOME
的时候出现的就是当前用户的家目录,如果是【root】的话出现的便是超级用户的目录;对于USER
来说也是同理
💬 所以环境变量呢是针对特定的人在特定的场景下被使用的,其会随着登录用户的不同而变化
🔥环境变量的获取方式🔥
相信有大部分的读者都学习过C语言,那么对于
main函数
和指针
一定有所了解
① envp表的介绍
💬 首先的话我想问一个问题:main函数的参数可以有几个呢?
- 那可能很多同学都不知道怎么回答,函数大家都有接触过,可以带的参数并没有多大的限制,但是对于
main
函数 的话可能大家都是不带参数或者直接写个void
代表空参 - 那这里就要给读者普及一下了,对于 main函数 而言我们是可以携带【0】、【2】或【3】个参数的。即下面的三种形式
int main(void)
int main(int argc, char *argv[])
int main(int argc, char *argv[], char *envp[])
- 头两种形式大家或多或少见到过,不过本文我们重点要讲解的则是第三种形式,也就是这个带三个参数的,我们重点关注的是
envp[] ---
这个指针数组,如果对这一块知识点还不是很熟悉的同学可以去看看 指针数组详解
- 对于这个envp,它里面所存放的都是一个个指针,这些指针都指向了一个个的字符串,即它的众多有效内容指向一个字符串,但是第一个无效内容必须去指向NULL,所以我们也可以称之为【表结构】
② 通过命令行获取环境变量
- 经过上面这一番的学习我们可以利用 main函数 中的这第三个参数去获取到系统中的所有环境变量并且打印出来
#include <stdio.h>// char* argc[] 和 envp[] 都是指针数组int main(int argc, char *argv[], char *envp[]){int i = 0;while(envp[i]!=NULL){printf("envp[%d]:%s\n",i,argv[i]); i++;}return 0;}
- 去打印一下看看就可以发现,得到了我们想要的结果
③ 通过函数获取环境变量
- 接下去第二种方法,乃是通过一个函数来获取,不过我们在这里就只是获取指定的那个环境变量,而不是全部的环境变量。我们依旧使用【man】手册来查看一下,这里也要注意包一下此头文件
stdlib.h
- 同样,我们来看看代码该如何去进行书写,这里的
USER
我们在上面看到过了,就是当前所登录的用户,所以若是其不为NULL
的话,我们就可以将其给打印出来
#include <stdio.h>
#include <stdlib.h>int main(void)
{char* user = getenv("USER");if(user == NULL) perror("getenv fail");elseprintf("USER: %s\n", user); return 0;
}
- 那除了
USER
之外呢,我们还知道有一种环境变量叫做PWD
,就是获取当前所在路径
int main(void)
{char* pwd = getenv("PWD");if(pwd == NULL) perror("getenv fail");elseprintf("%s\n", pwd); return 0;
}
- 然后,我们再将这个可执行程序加入到【环境变量】中,然后再去任何的路径下执行,就发现其和
pwd
指令的效果是同样的了
好,接下去我们再来做一个提升,既然有【环境变量】这个东西,那我们就要利用好它,来做一个只允许指定用户来运行当前的程序
- 废话不多说,我们直接通过代码来看看,在这里我们涉及到名称的比较,所以我们需要使用到C语言中的
strcmp
,这里记得要包含头文件哦
#include <stdio.h>
#include <string.h>
#include <stdlib.h> #define NAME "XAS"
int main(void)
{ char* own = getenv("USER"); if(own == NULL) perror("getenv fail"); else if(strcmp(own, NAME) == 0) printf("程序正常执行\n"); else printf("抱歉,当前用户 %s 没有权限执行此程序\n", own); return 0;
}
- 那因为这里我们需要指定用户来运行,所以在这里我将切换为 root,但是呢有一点很奇怪的是即使我们已经切换到了 root 的这个账户之下,但是为什么我在限定了只有 XAS 这个用户才可以访问之外,
root
也可以来进行访问呢? - 右侧的话我其实已经给到提示了,问题出在这个
su
上,读者有必要知道一下它们的区别
su命令
:
- 仅切换用户身份,不改变环境变量。
- 环境变量继承原用户的环境,如HOME、SHELL等。
- 效果相当于以其他用户身份登录系统。
su - 命令:
- 不仅切换用户身份,还改变环境变量。
- 环境变量从新登录该用户时的环境变量重新获取。
- 效果相当于重新登录系统。
- 我们可以通过查看
PATH
环境变量的方式来观察一下,于是就可以看到此还是XAS用户所在的环境变量
因此经过上面的学习我们知道了要真正地去改变当前系统的环境变量时,尤其是我们在切换到 root 用户的时候,我们要使用到
su -
才可以起到真正的切换
- 我们来看看最后的执行结果可以发现,使用
su -
切换到 root 用户下的时候在执行这个可执行程序时,出现了不一样的结果,就是因为当前用户已经完完全全转为了 root,所以我们在进行比较的时候就进入了第三个分支
- 一样我们可以通过查看环境变量
PATH
和USER
来检测一下,发现确实发生了变化
最后再来补充一点,也就是我们上面谈到过的有关环境变量的命令
unset
- 首先可以看到,当我们设置了一个环境变量
myval
后,通过[echo]
的方式去进行打印,此时我们就看到了这个变量所对应的属性,接下去呢我通过unset
清除掉了这个环境变量,此时再去通过[echo]
的方式打印时,就看不到内容了
- 再来看一点,我又使用
export
将其放入环境变量表中,此时我们通过[env]
配合[grep]
指令去显示所有环境变量的时候,就看到这个变量通过键值对的形式进行展现
四、详谈环境变量
🔥深入理解环境变量表🔥
在上面我们有谈到过,对于每个用户而言都有属于自己的环境的环境变量表
在环境变量表中的每一个,都有各自的用途
- 有进行路径查找的
- 有进行身份验证的
- 有进行动态库查找的
- 有用来确认当前路径的
环境变量在启动的时候就已经在内存中,所以它是一张内存级的表
那么环境变量所对应的数据是从哪里来的呢?
- 答:是从系统的相关配置文件中读取进来的,首先我们可以来看看当前家目录下的
.bashrc
这个文件,其主要是用来设置Bash shell
的一些环境变量和别名
- 还有一个的话是
.bash_profile
,其和.bashrc
类似,也是存放一些系统自带的环境变量
- 还有的话则是在根目录下的
etc
配置文件下的bashrc
这个文件,这里面所存放的便是当我们在启动系统的时候会自动加载的一些配置项
- 例如说像这里就是我们在前面所说到的【环境变量表】中的路径
- 像这个的话就是我们在 Linux 权限 一文中所提到的
umash
掩码,对于普通用户而言默认为002
,这些都是当系统在一加载的时候就会自动进行配置的
- 包括的话像我们在切换使用【超级用户】和【普通用户】的时候看到它们的命令提示符并不相同,仔细观察可以发现【超级用户】为
#
,而【普通用户】的话则为$
。对于这些内容的话也是通过系统启动的时候会自动去进行配置的
🔥命令行参数的意义 🔥
好,最后的话我们再来拓展一个东西叫做【命令行参数】
这个的话我们上面在讲 环境变量的获取方式 时有所提及,即这个argc
和argv
,首先我来说一下它们分别是什么意思
argc
是一个整数,表示命令行参数的数量(包括程序名本身)(就是说,argc也是argv这个数组里元素个数)。char *argv[]
是一个字符数组;argv
是一个指向字符指针数组的指针,每个指针指向一个以 null 结尾的字符串,表示一个命令行参数。
int main(int argc, char* argv[])
- 在知道它们分别是什么意思后呢,我们就可以通过代码的形式展现出它们的作用
- 那此时我们便可以通过这两个参数,去获取到所执行命令行中的相关内容
想必在通过以上的展示后你就可以初步地感受到命令行参数的魅力所在了
- 但是呢光就这么去看的话还不是很人性化,我们可以考虑再做一个 菜单选项,让用户去进行对应的选择,或者呢让用户一定要输入至少2个命令选项,否则的话就直接终止程序
以下是本次测试的示例代码:
void Usage(const char* name)
{printf("\nUsage: %s -[a|b|c]\n", name);exit(0);
}
int main(int argc, char* argv[])
{if(argc != 2) Usage(argv[0]);if(strcmp(argv[1], "-a") == 0) printf("打印当前目录下的文件名\n");else if(strcmp(argv[1], "-b") == 0)printf("打印当前目录下文件的详细信息\n");else if(strcmp(argv[1], "-c") == 0)printf("打印当前目录下的文件名(包含隐藏文件)\n"); elseprintf("其他功能, 待开发\n");
}
- 运行之后可以看到,当我们直接去运行这个程序的时候,因为没有添加参数,所以程序直接终止了,而且打印出了可供选择的菜单项,接下去在我添加上这个命令选项参数的时候,在选择了对应的参数之后就打印出了对应的内容
那有同学问,说了这么久,还不是只能在Linux下运行吗,Windows下可不行哦!
- 这一块的话读者可以去Windows下的【命令提示符】,简称:
cmd
看看,键入下面这句话看看
shutdown /?
- 于是呢我们就可以看到,也是会出现许多的命令行选项供我们选择,每一个选项都对应着不同的含义(具体地读者可以自己去试试看)
💬 以上呢就是我们所要讲的【命令行参数】
五、总结与提炼
最后来总结一下本文所学习的内容📖
- 首先在开篇,我们提到了环境变量的基本概念,知道了如果我们要去运行一个程序的话就需要将其路径添加到环境变量中,当系统的环境变量中有了这个路径之后当我们在执行此程序时它就可以去识别到路径下有这个内容
- 那如何添加呢?通过export PATH=$PATH:/路径的方式即可.
- 再者我们就要考虑到如何去通过代码如何 获取到这些环境变量,首先对于环境变量相关的命令大家要知晓,其中echo、export、env这些是会频繁使用。并且呢很重要的一点是对于不同用户来说环境变量是会不同的,会随着用户的登入而自动为其配置环境变量
- 在了解了基本的概念之后我们就可以通过代码去获取到相关的环境变量,分别是有:
命令行第三个参数
、通过函数获取
,其中大家重点要掌握的是第三个方式,学会使用getenv()
这个方法去获取到相关的环境变量 - 但是呢光就这么去获取的话我们还无法深入地理解到【环境变量】的含义,于是我们开始去了解一些配置文件,看到了很多在我们启动系统时就会进行配置的内容,于是更加进一步地了解到了确实有【环境变量】这个东西的存在。不仅如此,我们还通过shell所执行的命令去观察,因为这些命令都是shell的子进程,所以当它执行命令的时候 ,就相当于是父进程在执行子进程。那通过执行的结果我们可以看出shell将自己的环境变量表交给了执行的子进程,继而它可以去获取到表中对应的内容
六、共勉
以下就是我对【Linux系统编程】环境变量 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新【Linux系统编程】,请持续关注我哦!!!
相关文章:

【Linux】彻底理解---环境变量(什么是环境变量,环境变量有什么作用?)
目录 一、前言 二、什么是环境变量? 三、如何添加环境变量? 四、如何获取环境变量? 💧环境变量相关的命令💧 💧测试HOME与USER💧 🔥环境变量的获取方式🔥 ① en…...

VMware完美安装Ubuntu20.04
一、官网下载Ubuntu20.04 下载地址为:https://releases.ubuntu.com/https://releases.ubuntu.com/ 下载完后镜像为ubuntu-20.04.4-desktop-amd64.iso 二、Ubuntu安装 2.1、打开VMware player,并创建新虚拟机。 2.2、点击浏览按钮选择需要安装的镜像 2…...

使用Spring Boot作为CMS系统的后台,Nuxt.js作为前台的分析
在现代Web开发中,前后端分离架构越来越受欢迎。Spring Boot和Nuxt.js的组合为构建内容管理系统(CMS)提供了一个强大的解决方案。本文将分析这种组合的优势、挑战以及应用场景。 1. 技术概述 1.1 Spring Boot Spring Boot是基于Java的框架&…...

Spring Boot整合Druid:轻松实现SQL监控和数据库密码加密
文章目录 1 引言1.1 简介1.2 Druid的功能1.3 竞品对比 2 准备工作2.1 项目环境 3 集成Druid3.1 添加依赖3.2 配置Druid3.3 编写测试类测试3.4 访问控制台3.5 测试SQL监控3.6 数据库密码加密3.6.1 执行命令加密数据库密码3.6.2 配置参数3.6.3 测试 4 总结 1 引言 1.1 简介 Dru…...

推荐一款好用的编辑工具——onlyoffice桌面编辑器8.1
读者大大们好呀!!!☀️☀️☀️ 🔥 欢迎来到我的博客 👀期待大大的关注哦❗️❗️❗️ 🚀欢迎收看我的主页文章➡️寻至善的主页 文章目录 🔥前言🚀版本更新概览🚗文档编辑PDF编辑器…...

C++ | Leetcode C++题解之第188题买卖股票的最佳时机IV
题目: 题解: class Solution { public:int maxProfit(int k, vector<int>& prices) {if (prices.empty()) {return 0;}int n prices.size();k min(k, n / 2);vector<int> buy(k 1);vector<int> sell(k 1);buy[0] -prices[0]…...

操作系统实训复习笔记(2)
目录 Linux操作系统(认识记忆) (1)Linux 文件系统是树形层次结构 (2)Linux 用户介绍 (3)Linux 常用命令介绍 (4)ls命令 (5)Linu…...

北邮《计算机网络》英文选择题课堂小测
课堂小测验及答疑汇总 2020年 5 月 12 日 Q1. Which is the network address after aggregation of following 3 networks: 200.2.50.0/23, 200.2.52.0/22 and 200.2.56.0/22? A. 200.2.48.0/20 B. 200.2.50.0/20 C. 200.2.48.0/21 D. 200.2.50.0/21 Answer: A Q…...

kafka 集群安全认证机制的设计实现
kafka 集群安全认证机制的实现 Kafka 提供了多种安全认证机制来保护数据传输的安全性,包括加密、身份认证和授权。这些机制确保 了 Kafka 集群的通信安全和数据访问控制。以下是 Kafka 安全认证机制的实现和配置指南。 1. 安全认证机制概述 Kafka 支持以下几种主要的安全机…...

pandas保存成CSV格式时数据换行:SQL的REPLACE函数过滤掉数据的回车符
在使用Pandas保存数据到CSV文件时,如果数据中包含换行符(例如\n),这可能会导致数据在CSV文件中被分割成多行,影响数据的完整性和可读性。为了解决这个问题,你可以在保存CSV之前使用Pandas的replace函数来替…...

紧贴国家大战略需求,聚焦当前行业热点-海云安D10入选第四届香蜜湖金融科技创新奖拟奖项目
近日,第四届香蜜湖金融科技创新奖终审总结会在深圳市福田区湾区国际金融科技城成功举办,活动现场,专家评审委员会最终揭晓25个拟奖项目。海云安“开发者安全助手系统”项目,实力入选第四届香蜜湖金融科技创新奖-优秀项目奖。 1、香…...

构建 Linux 内核指南
该指南列出了用于构建 Linux 内核的各种目标及其说明。 清理目标: clean - 删除大多数生成的文件,但保留配置文件和足以构建外部模块的构建支持。 mrproper - 删除所有生成的文件 配置文件 各个备份文件。 distclean - mrproper 删除编辑器备份和补丁…...

Elasticsearch的快照
ES的快照是什么? snapshot是一个ES集群或者某个指定索引的备份,快照一般用在 不停机的状态下对ES集群进行备份当硬件故障时恢复集群数据用于跨集群的数据迁移对冷数据或冻结数据做快照以降低存储成本,依赖于可搜索的快照。-收费功能 一个快…...

C/C++混合编译说明
C调用C的函数: C的头文件中声明,被C调用的函数,是以C的方式编译 C的头文件: #ifdef __cplusplus extern "C" { #endif void func_c(void); #ifdef __cplusplus } #endif C调用C的函数: C的源文件中声明ÿ…...

三种方式实现人车流统计(yolov5+opencv+deepsort+bytetrack+iou)
一、运行环境 1、项目运行环境如下 2、CPU配置 3、GPU配置 如果没有GPU yolov5目标检测时间会比较久 二、编程语言与使用库版本 项目编程语言使用c++,使用的第三方库,onnxruntime-linux-x64-1.12.1,opencv-4.6.0 opencv 官方地址Releases - OpenCV opencv github地址ht…...

(四十四)Vue Router的命名路由和路由组件传参
文章目录 命名路由组件传参query参数方式参数传递参数接收 params参数方式参数传递参数接收 props配置方式布尔值形式对象模式函数模式 上一篇:(四十三)Vue Router之嵌套路由 命名路由 命名路由是为路由配置项提供一个名称,以便…...

EXCEL表格怎么批量删除日期后的时间?
竞价师最近有点忙了,因为百度新出来一个“线索有效性诊断”功能 一、下载电话、表单、咨询表格 二、选中整列 三、选中ctrlf 进行替换,日期输入空格,时间输入*,替换为空即可! 四、整列单元格格式“日期”拉倒底部&…...

乌班图Ubuntu 24.04 SSH Server 修改默认端口重启无效
试用最新的乌班图版本,常规修改ssh端口,修改完毕后重启sshd提示没有找到service,然后尝试去掉d重启ssh后查看状态,端口仍然是默认的22,各种尝试都试了不行,重启服务器后倒是端口修改成功了,心想…...

QT MQTT (二)编译与集成
一、QT MQTT 提供 MQTT 客户端服务的 Qt 专用库基于标准化发布 / 订阅协议,用于在设备和组件之间可靠地共享数据。MQTT 是为保证状态正确性、满足高安全标准和交换最小数据而设计的协议,因此被广泛应用于各种分布式系统和物联网解决方案中。 Qt开发MQT…...

(上位机APP开发)调用华为云属性修改API接口修改设备属性
一、功能说明 通过调用华为云IOT提供的属性修改API接口,给设备下发属性修改消息。 API接口地址:https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html 此接口支持在线调试:https://console.huaweicloud.com/apiexplorer/#/openapi/IoTDA/doc?api=UpdatePrope…...

爆火的儿童绘本如何用AI制作?一文解锁从制作到变现的全流程!
大家好我是安琪! AI绘图发展势头如此猛烈,无论是Stable Diffusion,Midjourney,还是国内百度的文心一格,字节的豆包等,AI绘图技术越来越成熟,风格也越来越多样化。那么问题来了,对于普…...

Go interface{}类型转换
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

利用opencv自带的Haar级联分类器模型
OpenCV自带的Haar级联分类器模型: haarcascade_eye.xml: 这个模型用于检测眼睛。 haarcascade_eye_tree_eyeglasses.xml: 这个模型用于检测眼镜。 haarcascade_frontalcatface.xml: 这个模型用于检测猫脸。 haarcascade_frontalcatface_extended.xml: 这个模型用…...

国产USB音频转换芯片CL7016C 支持国美标线控USB Type-C音频编解码器
CL7016C是一款高保真 USB Type-C 兼容音频编解码芯片。可以录制和回放有 24 比特音乐和声音。内置回放通路信号 动态压缩, 最大42db录音通路增益, PDM 数字麦克风,和立体声无需电容耳机驱动放大器。 5V单电源供电。兼容 USB 2.0 全速工业标…...

【linux网络(六)】IP协议详解
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:Linux从入门到精通⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你学更多操作系统知识 🔝🔝 Linux网络 1. 前言2. IP协议报…...

CesiumJS【Basic】- #012添加点线面(entity方式)
文章目录 添加点线面(entity方式)1 目标2 实现2.1 GeometryManager.ts2.2 main.ts添加点线面(entity方式) 1 目标 使用实体方式添加点线面 2 实现 2.1 GeometryManager.ts // src/GeometryManager.tsimport * as Cesium from cesium;export class GeometryManager {pr…...

【Redis】内存回收和内存淘汰机制
1 概念 Redis 所有的数据都是存储在内存中的, 如果不进行任何的内存回收, 那么很容易出现内存爆满的情况。因此,在某些情况下需要对占用的内存空间进行释放。 Redis 中内存的释放主要分为两类 Redis 中内存的释放主要分为两类: 内存回收: 将过期的 key 清除&#…...

PyTorch实战:借助torchviz可视化计算图与梯度传递
文章目录 Tensor计算的可视化(线性回归为例) 如何使用可视化库torchviz 安装graphviz软件 安装torchviz库使用 torchviz.make_dot() 在学习Tensor时,将张量y用张量x表示,它们背后会有一个函数表达关系,y的 grad_f…...

【软件测试】软件测试入门
软件测试入门 一、什么是软件测试二、软件测试和软件开发的区别三、软件测试在不同类型公司的定位1. 无组织性2. 专职 OR 兼职3. 项目性VS.职能性4.综合型 四、一个优秀的软件测试人员具备的素质1. 技能相关2. 非技能相关 一、什么是软件测试 最常见的理解是:软件测…...

Windows操作防火墙命令
Windows操作防火墙命令 启用防火墙: netsh advfirewall set allprofiles state on禁用防火墙: netsh advfirewall set allprofiles state off添加新的入站规则允许端口80(HTTP): netsh advfirewall firewall add r…...