SSH协议与OpenSSH配置详解(配置密钥对验证实验)

devtools/2024/9/20 7:11:44/ 标签: ssh, linux, 网络, 运维, 服务器, 云计算

文章目录

  • SSH 协议与 OpenSSH 配置详解
    • 1. SSH 协议概述
    • 2. OpenSSH 概述
    • 3. 配置SSH(sshd_config文件)
      • 3.1 配置服务监听选项
      • 3.2 配置用户登录控制(黑白名单)
      • 3.3 配置登录验证方式(密钥对验证)
      • 3.4 常用的配置项及说明
    • 4. 使用 SSH 客户端程序
      • 4.1 SSH 远程登录
      • 4.2 SCP 远程复制
      • 4.3 SFTP (安全 FTP)
    • 5. 配置密钥对验证
      • 5.1 在客户端创建密钥对
      • 5.2 将公钥文件上传至服务器
      • 5.3 在服务器中导入公钥文本
      • 5.4 在客户端使用密钥对验证
      • 5.5 设置SSH代理,实现免交互登录(不常用)
      • 5.6 更安全的密钥文件使用方式


SSH 协议与 OpenSSH 配置详解

1. SSH 协议概述

SSH (Secure Shell) 协议是一种用于远程管理的安全通道协议。它通过加密通信数据,确保在不安全的网络环境中,数据传输的机密性和完整性。

  • SSH在正确使用时可弥补网络中的漏洞。
  • 客户端包含SSH程序以及像scp(远程拷贝)、slogin(远程登陆)、sftp(安全文件传输)等其他的应用程序。
   22           网络层 传输层 TCP	       22
SSH客户端<-------------------------->SSH服务端数据传输是加密的,可以防止信息泄露
数据传输是压缩的,可以提高传输速度

SSH 的组成

  • 传输层协议 [SSH-TRANS]

    提供服务器认证、保密性及完整性,并且有时还提供压缩功能。SSH-TRANS 通常运行在 TCP/IP 连接上,但也可以用于其他可靠的数据流。该协议提供强力的加密技术、密码主机认证及完整性保护。认证基于主机,但不执行用户认证。更高层的用户认证协议可在此基础上设计。

  • 用户认证协议 [SSH-USERAUTH]

    用于向服务器提供客户端用户的鉴别功能,运行在传输层协议 SSH-TRANS 之上。当 SSH-USERAUTH 开始后,它从低层协议接收会话标识符(从第一次密钥交换中的交换哈希 H)。会话标识符唯一标识此会话,并适用于标记以证明私钥的所有权。SSH-USERAUTH 还需了解低层协议是否提供保密性保护。

  • 连接协议 [SSH-CONNECT]

    将多个加密隧道分成逻辑通道,运行在用户认证协议之上。它提供交互式登录会话、远程命令执行、转发 TCP/IP 连接和转发 X11 连接。

监听

  • 监听是指在特定的网络地址和端口上等待并接受来自其他主机的数据流的过程,通常用于实现网络服务,如 Web 服务器、FTP 服务器等。例如:“listen-on port 53 { 192.168.10.10; };” 。通俗讲,就是由进程等待在网卡中的端口。
  • 服务器进程启动时,需要监听一个或多个端口,以等待客户端的请求。客户端向服务器发送请求时,服务器进程接收到请求后,会创建一个新的套接字来处理该请求,从而与客户端进行交互。因此,监听是建立服务与客户端之间连接的关键步骤之一。

2. OpenSSH 概述

OpenSSH 是基于 SSH 协议的开源实现,用于在 UNIX/Linux 系统中提供安全的远程登录和其他安全网络服务。

CentOS 7系统默认已安装OpenSSH相关软件包,并已将 sshd服务添加为开机自启动。

  • 服务名称sshd(SSH 服务守护进程)
  • 服务端主程序/usr/sbin/sshd
  • 客户端配置文件/etc/ssh/ssh_config
  • 服务端配置文件/etc/ssh/sshd_config
  • 密钥对文件
ssh_host_ecdsa_key        # 私钥
ssh_host_ecdsa_key.pub    # 公钥 .pub结尾
ssh_host_ed25519_key  
ssh_host_ed25519_key.pub
ssh_host_rsa_key
ssh_host_rsa_key.pub

sshd_config_64">3. 配置SSH(sshd_config文件)

3.1 配置服务监听选项

在配置 SSH 服务时,可以设置监听端口、协议版本、以及监听的 IP 地址,同时禁用反向 DNS 解析。

配置示例

使用文本编辑器编辑 SSH 服务端配置文件:

vim /etc/ssh/sshd_config# 设置 SSH 监听的端口号,默认端口为 22
Port 22# 设置 SSH 监听的 IP 地址(可多地址监听)
ListenAddress 172.16.16.22
# 再如:监听地址为任意网段,允许所有网络接口接入。
# ListenAddress 0.0.0.0# 使用 SSH 协议版本 2(推荐使用)
Protocol 2# 禁用反向 DNS 解析以提高连接速度
UseDNS no

3.2 配置用户登录控制(黑白名单)

SSH 提供了丰富的用户登录控制选项,可以通过配置文件进行设置,包括禁用 root 用户登录、限制空密码用户登录、设置登录验证时间、控制重试次数等。

配置示例

# 编辑 SSH 服务配置文件
vi /etc/ssh/sshd_config# 设置登录验证的等待时间(默认2分钟)
LoginGraceTime 2m# 禁止 root 用户通过 SSH 登录
PermitRootLogin no# 设置最大认证尝试次数
MaxAuthTries 6# 禁止空密码用户登录
PermitEmptyPasswords no# 允许用户列表(可以指定特定用户和IP)
AllowUsers jerry admin@61.23.24.25

注意事项

  • AllowUsers 和 DenyUsers:这两个指令不能同时使用。AllowUsers 用于指定允许访问的用户,而 DenyUsers 用于指定禁止访问的用户。

3.3 配置登录验证方式(密钥对验证)

SSH 支持多种登录验证方式,主要包括密码验证和密钥对验证。(具体定义和密钥对创建在下一节讲解)

启用密钥对验证

  • 密钥对:由私钥和公钥组成。客户端持有私钥,服务端保存公钥。通过密钥对的匹配来验证用户身份。

配置示例

# 编辑 SSH 服务配置文件
vi /etc/ssh/sshd_config# 启用密码验证
PasswordAuthentication yes# 启用公钥验证
PubkeyAuthentication yes# 指定存放公钥的文件路径
AuthorizedKeysFile .ssh/authorized_keys

开启后需要创建密钥对,在下一节讲解。

3.4 常用的配置项及说明

配置示例

# 设置 OpenSSH 服务器监听的端口号,默认是 22
Port 22# 设置监听的 IP 地址,0.0.0.0 表示监听所有可用的网络接口
ListenAddress 0.0.0.0# 登录验证的超时时间为 2 分钟
LoginGraceTime 2m# 禁止 root 用户通过 SSH 登录,yes 允许
PermitRootLogin no# 设置最大认证重试次数为 6 次
MaxAuthTries 6# 禁止使用空密码的用户登录
PermitEmptyPasswords no# 禁用 DNS 反向解析,以提高服务器的响应速度
UseDNS no# 仅允许指定用户通过 SSH 登录,
# wangwu 仅允许从 IP 地址 61.23.24.25 登录
AllowUsers zhangsan lisi wangwu@61.23.24.25# 禁止指定用户通过 SSH 登录(不可对一用户同时使用允许和禁止)
DenyUsers zhangsan

作用

  • Port: 默认 SSH 端口是 22。可以更改此端口以增加安全性,避免被自动化攻击脚本扫描到。
  • ListenAddress: 0.0.0.0 表示监听所有网络接口。如果服务器有多个 IP 地址,可以指定监听的 IP,以限制访问来源。
  • LoginGraceTime: 这是 SSH 登录验证的超时时间。如果在指定时间内未成功登录,连接会被断开。
  • PermitRootLogin: 出于安全考虑,通常禁止 root 用户通过 SSH 直接登录,建议通过普通用户登录后使用 sudo 获取管理员权限。
  • MaxAuthTries: 设置最大重试次数后,如果超过此次数,连接会被断开。这有助于防止暴力破解攻击。
  • PermitEmptyPasswords: 禁止空密码登录是非常重要的安全措施,确保所有用户都有设置密码。
  • UseDNS: 禁用 DNS 反向解析可以加快服务器的响应速度,特别是在 DNS 配置不佳或解析速度较慢的情况下。节省优化资源,也进一步确保安全。
  • AllowUsers: 此项用于限制只有特定用户可以登录 SSH,可以进一步通过 IP 限制来增加安全性。
  • DenyUsers: 此项用于明确禁止某些用户登录 SSH,但注意不要与 AllowUsers 同时使用,以避免配置冲突。

修改后需重启服务:

sudo systemctl restart sshd

4. 使用 SSH 客户端程序

4.1 SSH 远程登录

SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络上安全地访问远程计算机。使用 ssh 命令可以通过网络登录远程服务器

格式

ssh [选项] zhangsan@192.168.80.10
  • 首次登录: 用户第一次登录SSH服务器时,必须接受服务器发来的ECDSA密钥(根据提示输入“yes”)。接收的密钥信息将保存到 ~/.ssh/known_hosts 文件中。密码验证成功后,即可登录到目标服务器的命令行环境中。

选项说明

  • -p:指定非默认的端口号。如果不使用此选项,则默认使用端口22。

示例

ssh -p 2345 zhangsan@192.168.80.10

注意

  • 此处IP地址也可以是/etc/hosts文件中定义的别名。
  • 别名可以是主机名,可以是域名,且可以有多个,但不能写重,如server2同时对应2个IP地址。
  • 若是域名如(www.cat.com),除非是虚拟主机的域名,否则一个域名只能对应一个IP。

4.2 SCP 远程复制

SCP(Secure Copy Protocol)用于在本地和远程主机之间安全地复制文件。

选项

  • -r:递归复制,同cp命令。
  • -P:(大P)指定端口号。

示例

  • 下行复制: 将远程主机中的文件复制到本地。

    scp root@192.168.80.11:/etc/passwd /root/passwd10.txt  
    # 将远程主机中的 /etc/passwd 文件复制到本机的 /root/passwd10.txt
    
  • 上行复制: 将本地文件或目录复制到远程主机。

    scp -r /etc/ssh/ root@192.168.80.10:/opt  
    # 将本机的 /etc/ssh 目录复制到远程主机的 /opt 目录
    

4.3 SFTP (安全 FTP)

SFTP(Secure File Transfer Protocol)提供了类似FTP的文件传输服务,但由于使用了加密技术,安全性更高,但传输效率比普通的FTP稍低。

示例

sftp zhangsan@192.168.80.10

操作步骤:

  1. 连接: 连接到服务器后,系统提示输入密码。
  2. 列出文件: 使用 ls 列出远程目录的文件。
  3. 下载文件: 使用 get <文件名> 下载文件到本地。
  4. 上传文件: 使用 put <文件名> 上传文件到远程服务器
  5. 退出: 使用 quit 退出SFTP会话。

示例

sftp> get example.txt  
# 下载 example.txt 文件sftp> put localfile.txt  
# 上传 localfile.txt 文件sftp> quit  # 退出

5. 配置密钥对验证

密钥对验证比密码验证更加安全,尤其适用于频繁远程连接或需要提高安全性的场景。密钥对由公钥和私钥组成,公钥放在服务器上,私钥留在客户端。

  • 密码验证

    服务器中本地系统用户的登录名称、密码进行验证。简便,但可能会被暴力破解。

  • 密钥对验证

    要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证。能增强安全性,且可以免交互登录。
    当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。可根据实际情况设置验证方式。

  • 密钥

    密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥。
    ssh密钥就是一种非对称性的密钥(rsa)。
    ssh远程访问控制中不仅仅可以使用用户密码登录,还可以通过密钥进行登录。
    而密钥登录的产生是通过客户端与服务端进行一系列的操作过程产生的。

  • 密钥登录的过程

    1. ssh客户端通过ssh-keygen生成自己的公钥和私钥,将公钥发送给ssh服务端,并且放在指定的位置。
    2. 公钥发送完毕后。ssh客户端再向ssh服务端进行登录请求。
    3. ssh服务端收到ssh客户端的登录请求后,ssh服务端用对应的公钥加密一些随机数返回给ssh客户端。
    4. ssh客户端收到加密的随机数后使用私钥对其进行解密,再将解密的结果发送给ssh服务端进行验证。
    5. ssh服务端接收到ssh客户端发送过来的解密数据,将其与原数据进行比对,保持一致则允许用户进行登录

5.1 在客户端创建密钥对

ssh-keygen是用于生成、管理和转换认证密钥的工具。使用ssh-keygen工具为当前用户创建密钥对文件。可用的加密算法为RSA、 ECDSA或DSA等。

使用 ssh-keygen 工具生成密钥对。

# 添加账号并注入密码,切换此账号登录
useradd admin
echo "123123" | passwd --stdin admin
su - adminssh-keygen -t ecdsa  # 生成ECDSA算法的密钥对
# 或
ssh-keygen -t rsa  # 生成RSA算法的密钥对 

选项

  • -t:指定密钥的算法类型,如 rsa、ecdsa(小写)等。

说明解释及流程

  • 命令执行过程中,会交互提示三次(三次默认即回车):

    1. 输入私钥保存的路径。默认保存路径为 /home/用户名/.ssh/id_ecdsa 或 root 为 /root/.ssh/id_rsa,私钥密码可以为空,但建议设置。

      Enter file in which to save the key (/root/.ssh/id_rsa):
      
    2. 输入密钥短语。密钥短语可以为空(无密码),但为了安全,建议设置一个。如果输入密钥短语,系统会要求再次确认。

      Enter passphrase (empty for no passphrase):
      
    3. 再次输入密钥短语。

      Enter same passphrase again:
      
  • 最后私钥和公钥生成成功,并提升密钥指纹和密钥随机艺术图像(便于识别)

    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:
    SHA256:gbcKTDbF9zX+KXGNJTmZ3usqjevmR&/ZsvcT9dUkA/9 rootebindThe key's randomart image is:
    +---[RSA 2048]----+
    

生成文件

  • id_ecdsaid_rsa :私钥文件,权限默认为600。
  • id_ecdsa.pubid_rsa.pub :公钥文件,权限644。用于上传到服务器

5.2 将公钥文件上传至服务器

可以使用 scpssh-copy-id 命令将公钥文件上传到服务器

方法1:使用 ssh-copy-id 上传默认公钥并自动处理

将当前用户的默认公钥(通常是 ~/.ssh/id_rsa.pub~/.ssh/id_ecdsa.pub )上传到远程服务器,并自动将其添加到远程服务器用户的 ~/.ssh/authorized_keys 文件中。即可实现免密登录。

ssh-copy-id root@192.168.80.10
# 将公钥直接上传并导入到服务器的指定用户目录
# 使用此命令后续不需再做

方法2:使用 scp 手动上传再处理

使用 scp(安全复制协议)将本地的公钥文件 id_ecdsa.pub 上传到远程服务器/opt 目录中。

公钥文件只是被上传到远程服务器的指定目录,并没有自动导入到 authorized_keys 文件中。需要手动将公钥添加到~/.ssh/authorized_keys 中,以实现免密登录。

scp ~/.ssh/id_ecdsa.pub root@192.168.80.10:/opt  # 上传公钥到服务器的 /opt 目录

方法3:使用 ssh-copy-id 指定公钥文件再上传

与第一个 ssh-copy-id 命令类似,但这个显式指定了要上传的公钥文件 ~/.ssh/id_ecdsa.pub,而不是使用默认的公钥文件。

会自动处理公钥的添加过程,无需手动干预,实现免密登录。

ssh-copy-id -i ~/.ssh/id_ecdsa.pub zhangsan@192.168.80.10  
# 将公钥直接上传并导入到服务器的指定用户目录
# 同样,使用此命令后续不需再做

双向实现免交互使用ssh工具

在另一端(客户端)同样创建密钥对并上传,可同时实现双向免交互登录。

5.3 在服务器中导入公钥文本

若使用 scp 命令(方法2)上传公钥,需手动导入公钥文件。

将公钥添加到用户的 ~/.ssh/authorized_keys 文件中。

useradd -d /home/zhangsan/ zhangsan
# 指定目录创建用户mkdir /home/zhangsan/.ssh/  
# 创建 .ssh 目录cat /opt/id_ecdsa.pub >> /home/zhangsan/.ssh/authorized_keys  
# 将公钥文件内容追加到 authorized_keys 文件中

检查

此时执行 ls /root/.ssh/ 会看到多了一个authorized_keys文件(授权密钥,或者说是凭证),即为对端的认证公钥。

此时所有ssh工具(ssh、scp、sftp)都可免密码交互连接登录。

验证: 确保公钥已成功导入。

cat /home/zhangsan/.ssh/authorized_keys

5.4 在客户端使用密钥对验证

ssh zhangsan@192.168.80.10

说明: 如果私钥设置了密码,会提示输入私钥的密码。

5.5 设置SSH代理,实现免交互登录(不常用)

SSH代理功能可以让用户在会话期间缓存私钥密码,实现免交互登录,从而避免每次连接时输入密码。

为了在使用受密码保护的私钥时,免去每次使用私钥时输入密码的步骤,而不是免去登录的第一层密码验证。

可以使用 ssh-agent 来启动身份验证代理并加载 SSH 密钥。

启动 SSH 代理

使用以下命令启动一个新的 Bash shell,并在该 shell 中启动 SSH Agent:

ssh-agent bash

SSH Agent 是一个身份验证代理,用于管理和缓存 SSH 密钥。

添加 SSH 密钥到代理

使用 ssh-add 命令将你的私钥添加到 SSH 代理中:

ssh-add /path/to/your/private_key

如果使用的是默认位置(~/.ssh/id_rsa),只需要运行:

ssh-add

提示输入私钥的密码(如果有设置)。

一旦密钥被加载到 SSH Agent 中,代理会在需要时自动提供该密钥进行身份验证。

验证配置

使用以下命令来查看当前加载的密钥:

ssh-add -l

显示所有已经添加到代理中的密钥的指纹。

实现免密码登录

使用 SSH 登录到远程服务器时,SSH 客户端会自动从 SSH Agent 中获取并使用私钥进行身份验证,无需手动输入密码:

ssh user@hostname

保持代理会话

  • 临时会话:通过 ssh-agent bash 启动的代理会话只在当前 shell 会话中有效。关闭 shell 会话后,代理也会随之终止。
  • 持久会话:为了在多个 shell 会话中共享同一个 SSH Agent,通常可以在启动时添加 eval $(ssh-agent)~/.bash_profile~/.bashrc 中。

退出 SSH 代理

若不再需要 SSH Agent,可以终止代理进程:

ssh-agent -k

5.6 更安全的密钥文件使用方式

多在企业级使用,将密钥文件放到本地,而不是直接配置在服务器上。

登录ssh直接使用命令 ssh -p - 指向本地目录下的密钥文件。



http://www.ppmy.cn/devtools/97222.html

相关文章

PHP中如何限制PDF文件大小的简单示例

例如&#xff0c;如果我们希望限制PDF文件的大小不超过5MB&#xff0c;我们可以将这两个配置项都设置为5M。 upload_max_filesize 5M post_max_size 5M接下来&#xff0c;在PHP脚本中&#xff0c;我们可以通过检查$_FILES全局数组来获取上传文件的大小&#xff0c;并作出相应…

【5.0】vue请求函数和路由

【5.0】vue请求函数和路由 此处是与后端交互发送请求拿到数据&#xff0c;和vue自己中的页面跳转路由 【一】axios使用 【1】安装 终端命令 npm install axios -S【2】基本语法 axios.get(后端地址&#xff08;django&#xff09;).then(res > {console.log(res.data.res…

ArrayList详解

简介 【概述】 List的主要实现类&#xff0c;底层使用Object[]存储&#xff0c;适用于频繁的查找工作&#xff0c;线程不安全。 【特点】 增删慢&#xff1a;每次删除元素&#xff0c;都需要更改数组长度、拷贝以及移动元素位置&#xff1b;查询快&#xff1a;由于数组在内…

SSM学生社团管理系统—计算机毕业设计源码20360

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

YouTube最好用的翻译插件

相信很多同学和我一样&#xff0c;想看YouTube视频时发现基本上都说英文&#xff0c;以我的英文水平&#x1f923;去观看真是一言难尽&#xff0c;所以就想着看能不能在谷歌浏览器上找一个插件来进行翻译&#xff0c;结果还真让我找到了一个不错的Youtube翻译插件&#xff0c;它…

AI大模型高效题库生成:业务人效提升的强大助力

一 现状问题 1、培训考核涉及的文件数量较多 当前&#xff0c;京东航空公司维修部门面临着人员规模的快速增长和持续的培训需求。根据民航局的规定&#xff0c;维修培训必须确保所有维修人员都能够完成对飞机维修相关文件的学习&#xff0c;这包括维修方案、维修工程管理手册…

Anaconda环境迁移之conda pack

目录 1. conda pack安装2. 环境打包3. 拷贝环境包到目标电脑4. 激活环境5. 大功告成 1. conda pack安装 源电脑安装conda pack conda install conda-pack2. 环境打包 假如环境名为test&#xff0c;那么打包命令如下&#xff1a; conda pack -n test -o test.tar.gz打包后的…

使用Python+MoviePy给视频添加字幕或水印

一、使用CompositeVideoClip将使用TextClip创建文字类与视频叠加在一起&#xff0c;给视频添加字幕或水印 from moviepy.editor import *# 从本地载入视频myHolidays.mp4&#xff0c;并截取00:00:50 - 00:00:60部分 clip VideoFileClip("/home/Download/Mojito.mp4"…

如果忘记了 Apple ID 密码,如何重设

“我忘记了我的 Apple ID 密码&#xff0c;如何恢复我的帐户&#xff1f;”为了方便用户&#xff0c;Apple 允许每个人使用唯一的 Apple ID 和密码激活设备并访问所有 Apple 服务。然而&#xff0c;实际上&#xff0c;手动选择某项并忘记它似乎很容易。例如&#xff0c;许多 Ap…

带你速通C语言——指针(10)

指针是C语言中最强大但也最容易引起困惑的概念之一。它们直接关联内存管理&#xff0c;使得程序员可以高效地操作数据和内存。下面我将尽量以简单明了的方式介绍指针的基本概念。 1.指针基础 指针本质上是存储内存地址的变量&#xff0c;这个地址指向一个值。通过指针&#xf…

Vue中调整组件的高度及其他样式

在Vue组件中&#xff0c;如果想让一个组件如<MapContainer />变长&#xff0c;你可以使用CSS来调整它的高度。以下是一些可能的方法&#xff1a; 设置固定高度&#xff1a;直接给<MapContainer />组件设置一个高度值。 .MapContainer {height: 300px; /* 你可以根据…

论文中绘制神经网络工具汇总

论文中绘制神经网络工具汇总_convnetdraw-CSDN博客 这哥们总结的还是比较全面的&#xff01;

MongoDB如何实现大于小于查询

MongoDB是一个高性能、开源、无模式的文档型数据库&#xff0c;它使用BSON&#xff08;Binary JSON&#xff09;作为存储格式&#xff0c;支持丰富的查询语法&#xff0c;包括大于&#xff08; g t &#xff09;、小于&#xff08; gt&#xff09;、小于&#xff08; gt&#x…

RabbitMQ-消息队列延迟队列二

1、安装rabbitmq 怎么安装rabbitmq请查看之前课程&#xff0c;如果已经安装&#xff0c;请略过此步。 2、创建vendor文件夹或是直接采用PHP框架 mkdir vendor 3、进入文件 cd vendor 4、安装php扩展 composer require php-amqplib/php-amqplib 5、进入上级创建delay文件…

豆瓣评分8.6!Python社区出版的Python故事教程,太强了!

Python 是活力四射的语言&#xff0c;是不断发展中的语言。就连使用 Python 多年的行者也不敢说对 Python 的方方面面都了解并可以自由运用&#xff0c;想必读者可能更加无法快速掌握所有重点技巧了。 今天给小伙伴们分享的这份手册是用互动的开发故事来探讨Pyfhonic开发的故事…

Spring之@Bean注解

1. 使用方式 1.1 Configuration Bean 1.1.1 创建实体类 User Data NoArgsConstructor public class User {private String name;public User(String name) {this.name name;} } 1.1.2 创建配置类 UserConfig Configuration public class UserConfig {Beanpublic User us…

图片加载的区域显示

问题描述: 一个imageview 控件宽高 640*280 ,通过glide加载要显示的图片,,图片始终显示在imageview 的右边和下边,图片的宽高可能小于或者大于imageview 控件的宽高,如何在imageview 显示图片:如果图片的宽高大于imageview 的宽高可以只显示图片对应的右下部分(此时imageview …

C++:list类(迭代器)

目录 前言 数据结构 push_back push_front 默认构造函数 拷贝构造函数 list迭代器 结构 构造函数 *运算符重载 ->运算符重载 前置运算符重载 后置运算符重载 前置--运算符重载 后置--运算符重载 !运算符重载 运算符重载 list迭代器完整代码 begin和end …

【Leetcode 1189 】 “气球” 的最大数量 —— 数组模拟哈希表

给你一个字符串 text&#xff0c;你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"&#xff08;气球&#xff09;。 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。 示例 1&#xff1a; 输入&#…

mysql:表的约束(空属性,默认值,comment,zerofill,主键,唯一键,外键)

目录 表的约束 空属性 默认值(defualut) comment:列描述 zerofill &#xff1a;显示约束 主键 自增长&#xff1a;auto_increment 唯一键 外键 查询数据 表的约束 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&…