Linux中ssh远程登录系统和远程拷贝
本章主要介绍ssh远程登录系统和远程拷贝的方法
- ssh的基本用法
- 打开远程图形化界面
- ssh无密码登录和安全操作
- Windows远程登录
- 远程拷贝
很多时候服务器并没有显示器,我们也不可能每次都通过控制台去管理服务器,这时就需 要远程登录。远程登录到服务器可以通过Telnet或ssh的方式。但是用Telnet登录,整个过 程都是以明文的方式传输的,不安全。所以,建议使用ssh的方式来登录,因为ssh在整个连 接过程中,数据都是加密的
实验拓扑两台Linux操作系统
redhat8和node1
redhat中有aaa用户和jin用户,node1中只有jin用户
1.1 ssh的基本用法
ssh的基本用法1:
ssh 主机名 /IP
这里如果没有指定用什么用户连接,则以当前用户连接
当第一次远程连接到服务器时,要记录服务器的公钥指纹信息
[root@redhat8 ~]# ssh 192.168.161.12

上面如果输入的是no,则连接终止。输入yes,则保存在了当前用户家目录下 的.ssh/known_hosts文件中
如果使用aaa用户进行登录,连续输入3次密码不正确就会退出了,因为192.168.161.12上没有aaa用户,但是有jin用户

ssh的基本用法2:
1. ssh 0l 用户名 主机名 /IP
2. 用户名@主机名 /IP
建议用第2个。现在以jin的身份连接
[root@redhat8 ~]# ssh jin@192.168.161.12
jin@192.168.161.12's password:
[jin@node1 ~]$
可以看到,此时已经正常连接过去了,要退出来时只要输入“exit”即可
[jin@node1 ~]$ exit
登出
Connection to 192.168.161.12 closed.
[root@redhat8 ~]#
1.2 打开远程图形化界面
当远程连接到远端机器时,例如,从 redhat8上通过jin用户连接到node1
[root@redhat8 ~]# ssh jin@192.168.161.12
jin@192.168.161.12's password:
Last login: Fri Dec 1 11:08:34 2023 from 192.168.161.16
[jin@node1 ~]$ firefox
Failed to open connection to "session" message bus: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Running without a11y support!
Error: no DISPLAY environment variable specified
[jin@node1 ~]$
然后执行firefox命令,出现了“Error: no DISPLAY environment variable specified”的错误提示。这是为什么呢?首先我们了解一下 Xserver和 Xclient
每个打开的图形化界面的工具,例如,终端、 Firefox浏览器、gedit记事本等,这些都叫作 Xclient,这些Xclient必须在 Xserver上运行。 Xserver是一个平台环境,安装系统时如果选择 了图形化界面,那么Xserver就已经安装上去 了,如图

要是想在本机打开远端服务器的Xclient,即图形化客户端,需要满足以下3个条件
(1)通过ssh登录到服务器时,要加上-X(大写的X)选项
因为ssh建立的连接默认只允许字符传输,不允许Xclient进行传输,加上-X选项之后就可以 让Xclient通过ssh建立的连接传输
(2)本地要运行Xserver
(3)远端服务器要安装xorg-x11-xauth,默认是已经安装上去了的
现在退出来,重新通过ssh连接过去,加上-X选项,命令如下
[root@redhat8 ~]# ssh jin@192.168.161.12 -X
jin@192.168.161.12's password:
Last login: Fri Dec 1 11:16:30 2023 from 192.168.161.16
/usr/bin/xauth: file /home/jin/.Xauthority does not exist
[jin@node1 ~]$
1.3 ssh无密码登录
ssh远程登录到服务器时有两种认证方式
1.3.1 密码认证
前面在redhat8上通过ssh连接到node1时需要输入密码才能正常登录,这种就是密码认证
1.3.2 密钥认证
如果做了密钥认证,远程登录时不需要密码就可以直接登录
需要生成一个密钥对
[aaa@redhat8 ~]$ ssh-keygen -f ~/.ssh/id_rsa -N ""
Generating public/private rsa key pair.
Your identification has been saved in /home/aaa/.ssh/id_rsa.
Your public key has been saved in /home/aaa/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:D6UKYyQIyqkWhvPj3p+22Q4GppGHL+jYtKo+rt67O/g aaa@redhat8
The key's randomart image is:
+---[RSA 3072]----+
|. |
|=.. |
|==. . . |
|oo.= o |
|..* B S |
|.o O + . o |
|. * . + . |
|o*.= ..= |
|@**E*o=oo |
+----[SHA256]-----+
[aaa@redhat8 ~]$
这条命令会生成一个密钥对(私钥和公钥),这里-f指定了生成私钥的路径和名称,如果 不指定,默认也是这个路径。-N后面的双引号中没有空格,意思是不对生成的私钥加密
这样aaa生成了自己的密钥对,存放在自己家目录的.ssh目录下
[aaa@redhat8 ~]$ ls .ssh/
id_rsa id_rsa.pub known_hosts
[aaa@redhat8 ~]$
其中id_rsa是私钥,id_rsa.pub是公钥
然后通过ssh-copy-id把公钥的内容存储在jin@node1的家目录下的.ssh/authorized_keys文件中,如果没有此文件,拷贝过去之后会自动创建
[root@node1 ~]# ls .ssh
ls: 无法访问.ssh: 没有那个文件或目录
[root@node1 ~]#
下面执行ssh-copy-id命令
[aaa@redhat8 ~]$ ssh-copy-id jin@192.168.161.12
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/aaa/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
jin@192.168.161.12's password: Number of key(s) added: 1Now try logging into the machine, with: "ssh 'jin@192.168.161.12'"
and check to make sure that only the key(s) you wanted were added.[aaa@redhat8 ~]$
这样aaa的公钥就存放在jin@node1家目录下的.ssh/authorized keys文件中了
[jin@node1 ~]$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDI3ngWP/jf8809s1EOyXI9CnLu92iYEfJqxvj09nvHDrEgUb4PT0+RLkys/sqzViYdtQvOKhGgXqCsU29PZZXNQPgisbF2+7w7H3XvOlSPH/3p0/9HgMHDghHOH3G6A/dMcqh+KRWcz/6U8wzNtk6TBcZL8ovT64erHigx/hMlgE0fP/fX6SnFUFgpFVUSGEAszxzl6oPkSXTITH2U8/1n3rZMNKL9GxPmFLMSg5e5VlJSCjOIxlzDePmgeGJkvEx79ZMqNzEJ4AFl7gkpCOmx1STe415lPFS2m+Xgvrvz0og12Ojy+9lTeIA1iFiDUZxP4GeUhMM9wHU6qfZbT2+uTxx/va+4pu6NEmzYb30VvmknMIaVU0fDwlW0WMhaawOVd7bYqF6MfhAnl191aYGy823N4rkvijIdAjlO5MitJNO8+6+9hhTDAV0TlycUL7KASzS13r6Kdq5yFP5aBBJ+TpoczJkjdXnQUGywRrUJ/xck5HJu+tlB9dF88g1NSSk= aaa@redhat8
[jin@node1 ~]$
通过对比,发现这个文件的内容就是 aaa@redhat的公钥的内容
下面远程登录测试
[aaa@redhat8 ~]$ ssh jin@192.168.161.12
Last login: Fri Dec 1 11:48:58 2023 from 192.168.161.1
[jin@node1 ~]$
可以看到,已经无密码登录过去了
1.4 ssh安全设置
前面已经讲了,ssh有两种认证方式:密码认证和密钥认证。aaa@redhat到jin@node1用的是密钥认证,其他用户的登录方式仍然是密码登录,现在想设置只能用 其中一种认证,是否可以?答案是可以的
1.4.1 禁用密钥登录
在node1中,以 root用户编辑/etc/ssh/sshd_config,找到 PubkeyAuthentication, 修改内容如下
将#PubkeyAuthentication yes修改为PubkeyAuthentication no(需要注意的是,这里 前面的注释符#被删除了),这样就禁用了密钥登录,保存退出并重启sshd

[root@node1 ~]# systemctl restart sshd
[root@node1 ~]#
此时已经禁用了密钥登录,只能密码登录,到 redhat上进行测试
[aaa@redhat8 ~]$ ssh jin@192.168.161.12
jin@192.168.161.12's password:
Last login: Fri Dec 1 11:50:06 2023 from 192.168.161.16
[jin@node1 ~]$
这里只能使用密码登录,原来配置的密钥认证不再生效
再次设置允许密钥登录(PubkeyAuthentication yes),修改内容如下

将PubkeyAuthentication no修改为PubkeyAuthentication yes,并重启sshd,命令如下
[root@node1 ~]# systemctl restart sshd
[root@node1 ~]#
1.4.2 禁止密码登录
在node1上,以root用户编辑/etc/ssh/sshd_config,找到PasswordAuthentication, 修改内容如下

将PasswordAuthentication yes修改为PasswordAuthentication no,这样就禁用了密 码登录,保存退出并重启sshd
[root@node1 ~]# systemctl restart sshd
[root@node1 ~]#
此时只允许密钥登录,不允许密码登录
为了方便测试,在node1上创建用户bbb,密码设置为123.123
[root@node1 ~]# useradd bbb
[root@node1 ~]# echo 123.123 | passwd --stdin bbb
更改用户 bbb 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@node1 ~]#
在redhat上进行验证,首先以jin身份连接过去
[aaa@redhat8 ~]$ ssh jin@192.168.161.12
Last login: Fri Dec 1 11:55:51 2023 from 192.168.161.16
[jin@node1 ~]$
可以看到,使用tom登录192.168.26.102时是可以无密码登录的
然后以bbb身份连接过去
[aaa@redhat8 ~]$ ssh bbb@192.168.161.12
bbb@192.168.161.12: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
[aaa@redhat8 ~]$
因为我们并没有做bbb用户无密码登录到node1,只能使用密码登录,而密码登录被禁用, 所以bbb登录失败
自行设置允许密码登录,修改/etc/ssh/sshd_config

将PasswordAuthentication no修改为PasswordAuthentication yes,并重启sshd
[root@node1 ~]# systemctl restart sshd
[root@node1 ~]#
再次使用bbb用户登录
[aaa@redhat8 ~]$ ssh bbb@192.168.161.12
bbb@192.168.161.12's password:
Last failed login: Fri Dec 1 12:07:28 CST 2023 from 192.168.161.16 on ssh:notty
There were 3 failed login attempts since the last successful login.
[bbb@node1 ~]$
已经可以正常登录了
1.5 ssh限制用户
对于服务器上的有效用户,基本上都是可以通过 ssh 连按过去的,但是有时为了安全性 要禁用某些用户登录,如禁用root等
1.5.1 禁用root用户登录
默认情况下,是可以用root登录到远端服务器的
[aaa@redhat8 ~]$ ssh root@192.168.161.12
root@192.168.161.12's password:
Last login: Fri Dec 1 11:01:05 2023 from 192.168.161.16
[root@node1 ~]#
如果要禁用root用户登录,在server2一用vim编辑哭打开/eto/ssh/sshd_config,按如下内容修改

将PermitRootLogin yes修改为PermitRootLogin no,保存退出并重启sshd
[root@node1 ~]# systemctl restart sshd
[root@node1 ~]#
此时就禁用root用户登录了,在redhat上进行验证
[aaa@redhat8 ~]$ ssh root@192.168.161.12
root@192.168.161.12's password:
Permission denied, please try again.
root@192.168.161.12's password:
提示被拒绝,是因为不允许root用户登录,按【Ctrl+C】组合键终止
如果允许root用户登录,将PermitRootLogin no修改为PermitRootLogin yes,然后重启sshd 即可
1.5.1 禁用普通用户登录
如果想禁用某普通用户,可以用DenyUsers选项实现,用法是打开/etc/ssh/sshd_config, 在任意一行添加 DenyUsers userX,就可以限制userX ssh登录了。如果需要在server2上禁 用bob用户ssh登录,可以用vim 编辑器打开/etc/ssh/sshd_config,在任意一行添加 DenyUsersbob,命令如下

这里就是禁用bob用户ssh 登录,保存退出并重启sshd,然后到redhat上进行测试
[aaa@redhat8 ~]$ ssh bbb@192.168.161.12
bbb@192.168.161.12's password:
Permission denied, please try again.
bbb@192.168.161.12's password:
提示被拒绝,是因为bbb用户被限制登录了,按【Ctrl+C】组合键终止
这里只是禁用了bbb用户,并不影响其他用户登录
类似的选项还有AllowUsers和 DenyGroups
其中AllowUsers userX的意思是,只允许userX用户登录,不允许其他用户登录
如果写成AllowUsers userX userY,意思是只允许userX和userY登录,不允许其他用户登录
如果以下两个条目同时出现:

则 DenyUsers生效,bob仍然是不能登录的
1.6 Windows远程登录
很多时候服务器上安装的是 Linux系统,但我们平时用的笔记本电脑是Windows系统, 如果要使用Windows远程登录,只要在Windows上安装ssh客户端,就可以登录到远端的 Linux服务器了。Windows中常见的ssh客户端包括PuTTY、Xshell、SecureCRT 等
Windows中的这些客户端,大家根据自己的喜好自行下载使用即可
1.7 远程拷贝
有时我们需要远程拷贝一些文件,例如,把文件或目录从A机器拷贝到B机器上,这种情 况下我们一般用scp或rsync
scp或 rsync利用的是ssh建立的通道,然后把文件传输过去,scp的用法如下
scp /path1/file1 remoteIP:/path2/
这里的意思是把本地的/path1/file1铂贝到remoteIP这台机器的/path2目录中。需要注意的是,远程主机上目录的表示方式是“IP:目录”,冒号两边没有空格。如果拷贝目录需加上选项
先查看node1上/opt目录中的内容
[root@node1 ~]# ls /opt/
[root@node1 ~]#
然后到redhat上拷贝 /etc/hosts到server2上的/opt目录中
[root@redhat8 ~]# scp /etc/hosts 192.168.161.12:/opt
root@192.168.161.12's password:
hosts 100% 158 78.6KB/s 00:00
[root@redhat8 ~]#
这样就把文件拷贝过去了,scp利用的是ssh建立的通道,如果没有指定使用哪个用户接到 192.168.161.12,则使用的是当前用户 root
下面以jin身份登录192.168.161.12并拷贝文件
[root@redhat8 ~]# scp /etc/hosts jin@192.168.161.12:/opt
jin@192.168.161.12's password:
scp: /opt/hosts: Permission denied
[root@redhat8 ~]#
因为192.168.161.12上的jin用户对/opt没有写权限,所有拷贝过去时出现了“Permission denied”这样的报错信息
把目录/boot/grub2拷贝到node1上的/opt目录中
[root@redhat8 ~]# scp /boot/grub2/ 192.168.161.12:/opt
root@192.168.161.12's password:
/boot/grub2: not a regular file
[root@redhat8 ~]#
结果是没有拷贝过去,因为/boot/grub2是一个目录,拷贝目录需要加上r选项

这样就把该目录拷贝过去了,到node1上查看
[root@node1 ~]# ls /opt/
grub2 hosts
[root@node1 ~]#
清空node1上/opt中的内容
[root@node1 opt]# rm -rf /*
[root@node1 opt]# ls
[root@node1 opt]#相关文章:
Linux中ssh远程登录系统和远程拷贝
本章主要介绍ssh远程登录系统和远程拷贝的方法 ssh的基本用法打开远程图形化界面ssh无密码登录和安全操作Windows远程登录远程拷贝 很多时候服务器并没有显示器,我们也不可能每次都通过控制台去管理服务器,这时就需 要远程登录。远程登录到服务器可以通…...
git常用命令小记
(文章正在持续更新中) git init - 在当前目录下初始化一个新的 Git 仓库。 git clone [url] - 克隆远程仓库到本地。 git add [file] - 将文件添加到暂存区。 git commit -m "commit message" - 将添加到暂存区的文件提交到本地仓库。 git pus…...
深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动
文章目录 前言一、输入系统的基本组成部分二、输入系统相关源码分析1、IMS 构建1.1、SystemServer # startOtherServices()1.2、InputManagerService1.3、NativeInputManager # nativeInit()1.4、NativeInputManager1.5、InputManager1.6、InputDispatcher1.7、InputReader1.8、…...
SoC with CPLD and MCU ?
AG32 MCU 产品支持多种接口外设,具备与业界主流产品的兼容性,并内置额外的2K FPGA 可编程逻辑。 产品支持 LQFP-48,LQFP-64,LQFP-100 ,QFN-32等不同封装。其所有可用 IO 都可以任意地进行映射和互换,以灵活…...
基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(二)——数据清洗、转换
2 数据清洗、转换 此实验使用S3作为数据源 ETL: E extract 输入 T transform 转换 L load 输出 大纲 2 数据清洗、转换2.1 架构图2.2 数据清洗2.3 编辑脚本2.3.1 连接数据源(s3)2.3.2. 数据结构转换2.3.2 数据结构拆分…...
vuepress-----6、时间更新
# 6、时间更新 基于Git提交时间修改文字时间格式 moment # 最后更新时间 # 时间格式修改 下载库文件 yarn add momentconst moment require(moment); moment.locale(zh-cn)module.exports {themeConfig: {lastUpdated: 更新时间,},plugins: [[vuepress/last-updated,{trans…...
C++ ini配置文件的简单读取使用
ini文件就是简单的section 下面有对应的键值对 std::map<std::string, std::map<std::string, std::string>>MyIni::readIniFile() {std::ifstream file(filename);if (!file.is_open()) {std::cerr << "Error: Unable to open file " << …...
【稳定检索|投稿优惠】2024年经济管理与安全科学国际学术会议(EMSSIC 2024)
2024年经济管理与安全科学国际学术会议(EMSSIC 2024) 2024 International Conference on Economic Management and Security Sciences(EMSSIC 2024) 一、【会议简介】 2024年经济管理与安全科学国际学术会议(EMSSIC 2024),将于繁华的上海城召开。这次会议的主题是“…...
什么是网站?
这篇文章是我学习网站开发,阶段性总结出来的。可以帮助你 通俗易懂 地更加深刻理解网站的这个玩意。 一,网站和网页的区别? 网站是由一个个网页组成。我们在浏览器上面看到的每一个页面就是网页,这些 相关的 网页组成一个网站。…...
pg_stat_replication.state 含义
在PostgreSQL中,pg_stat_replication视图提供了有关连接到主服务器的流式复制进程(备用服务器)的信息。该视图中的一个列是state,它指示复制进程的当前状态。 state列可以具有各种值: startup: This WAL sender 刚开始运行 catc…...
JavaWeb(六)
一、Maven的常用命令 maven的常用命令有:compile(编译)、clean(清理)、test(测试)、package(打包)、install(安装)。 1.1、compile(编译) compile(编译)的作用有如下两点: 1、从阿里云下载编译需要的jar包,在本地仓库也能看到下载好的插件(远程仓库配置的是阿里…...
GPIO的使用--时钟使能含义--代码封装
目录 一、时钟使能的含义 1.为什么要时钟使能? 2.什么是时钟使能? 3.GPIO的使能信号? 二、代码封装 1.封装前完整代码 2.封装结构 封装后代码 led.c led.h key.c key.h main.c 一、时钟使能的含义 1.为什么要时钟使能?…...
最小化安装 Neokylin7.0 用于搭建 Hadoop 集群
文章目录 环境搭建背景虚拟机创建和环境配置安装过程注意事项虚拟机设置软件选择KOUMP系统分区网络和主机名打开以太网,并记录信息配置 IPv4修改主机名 创建用户 hadoop完全分布式搭建-CSDN博客 环境搭建背景 为什么不从hadoop100或者hadoop101开始,而是…...
苍穹外卖面试题-中
8. 如何理解分组校验 很多情况下,我们会将校验规则写到实体类中的属性上,而这个实体类有可能作为不同功能方法的参数使用,而不同的功能对象参数对象中属性的要求是不一样的。比如我们在新增和修改一个用户对象时,都会接收User对象…...
Python 重要数据类型
目录 列表 序列操作 列表内置方法 列表推到式 字典 声明字典 字典基本操作 列表内置方法 字典进阶使用 字典生成式 附录 列表 在实际开发中,经常需要将一组(不只一个)数据存储起来,以便后边的代码使用。列表就是这样的…...
03、pytest初体验
官方实例 # content of test_sample.py def func(x):return x 1def test_ansewer():assert func(3) 5步骤解释 [100%]指的是所有测试用例的总体进度,完成后,pytest显示一个失败报告,因为func(3)没有返回5 注意:你可以使用ass…...
智能指针及强相关知识经验总结 --- 移动语义、引用计数、循环引用、move()、自定义删除器等
目录 前言 一、shared_ptr 1. 基本用法和构造方法 2. 引用计数机制 3. weak_ptr 解决循环引用 二、unique_ptr 1. 基本用法和构造方法 2. 独占性 3. 所有权转移 1)unique_ptr :: release() 2)移动语义 和 move() 三、 对比 shared_ptr 和 un…...
Gson 自动生成适配器插件
在json解析方面 我们常见有下面几方面困扰 1. moshi code-gen能自动生成适配器,序列化效率比gson快,但是自定义程度不如gson,能java kotlin共存 且解决了默认值的问题 2.gson api 强大自由,但是 第一次gson的反射缓存比较慢,而且生成对象都是反射,除非主动注册com.google.gson…...
React创建项目
React创建项目 提前安装好nodejs再进行下面的操作,通过node -v验证是否安装 1.设置源地址 npm config set registry https://registry.npmmirror.com/2.确认源地址 npm config get registry返回如下 https://registry.npmmirror.com/3.输入命令 npx create-re…...
Redis5新特性-stream
Stream队列 Redis5.0 最大的新特性就是多出了一个数据结构 Stream,它是一个新的强大的 支持多播的可持久化的消息队列,作者声明 Redis Stream 地借鉴了 Kafka 的设计。 生产者 xadd 追加消息 xdel 删除消息,这里的删除仅仅是设置了标志位&am…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
