Ubuntu 申请 SSL证书并搭建邮件服务器


文章目录

    • Log
  • 一、域名连接到泰坦(Titan)电子邮件
  • 二、NameSilo Hosting 避坑
  • 三、Ubuntu 搭建邮件服务器
    • 1. 环境准备
    • 2. 域名配置
    • 3. 配置 Postfix 和 Dovecot
      • ① 安装 Nginx
      • ② 安装 Tomcat
      • ③ 申请 SSL 证书(Let's Encrypt)
      • ④ 配置 postfix
      • ⑤ 配置 Dovecot
    • 4. 配置 SpamAssassin 和 OpenDKIM
      • ① 配置 SpamAssassin
      • ② 配置 OpenDKIM
  • 参考教程:
  • 总结


Log

2024.01.13啊,2024年了啊,稍微记录下吧。查了一圈似乎没有相关的教程,那咱就自己摸索着写一篇吧
2024.01.15有事鸽了一天,今天继续;乐了,不支持SSH,退款了
2024.01.16来了
2024.01.17继续搞;教程有点老了,各种版本更新、服务停止支持,跟扒皮一样一层层去找下一步的解决方案,过程倒是挺有趣,但人也有点麻;Let’s Encrypt的证书申请完了发现网站进不去了,查解决方案的时候发现之前网站配置CDN的时候用的Cloudflare提供自签证书。。。
2024.01.18接着搞;配置完了客户端连接测试 SSL连接错误,还得再测测,从头查查吧
2024.01.25终于有眉目了,服务器厂家没开放465端口,联系下然后加个 TXT 记录防止邮件滥用。问题解决了就发布叭;并没有,被认为是垃圾邮件发出去了收不到;搞定了。


  • 前置条件:注册Namesilo账号,并购买一个域名和一个服务器
    • 如果要买 NameSilo 的服务器,请先看 章节二

一、域名连接到泰坦(Titan)电子邮件

  • 参考教程: Setup Titan MX and TXT records for NameSilo
  • 登录 N a m e S i l o \rm NameSilo NameSilo 账户,进入域名管理页面,随后点击管理此域的 DNS 选项。
    在这里插入图片描述
  • 如果是刚入手的域名,需要删除原有的记录,然后根据自己的服务器的IP添加以下两条记录:
HostnameTypeTTL
A3600
wwwA3600
  • 随后设置 MX 记录和 TXT 记录(用于验证域名所有权并激活电子邮件服务),添加以下两条记录:
HostnameTypeTarget HostnameTTLDistance
@MXmx2.titan.email360020
HostnameTypeTextTTL
@TXT/SPFv=spf1 include:spf.titan.email ~all3600
  • MX记录:邮件交换记录 (Mail Exchange Record),域名系统(DNS)中的一种资源记录类型,用于指定负责处理发往收件人域名的邮件服务器。
  • SPF记录:发信者策略架构(Sender Policy Framework),为了防范垃圾邮件而提出来的一种DNS记录类型,用于登记某个域名拥有的用来外发邮件的所有IP地址。
  • 最终结果如下:
    在这里插入图片描述
  • 进入添加管理邮件页面(需要购买 NameSilo 的 Hosting 服务,第一次进入需要设置备用邮箱,并连接到 T i t a n    E m a i l \rm Titan\ \ Email Titan  Email):
    在这里插入图片描述
  • 等待域名解析生效后(24小时以内)再次验证:
    在这里插入图片描述在这里插入图片描述
  • 连接成功后就可以添加邮箱了

二、NameSilo Hosting 避坑

  • 搞了一下午,最后问客服发现在 NameSilo 上买的服务器不支持 SSH,只能在 cPanel 里点点点,不能用 terminal 敲命令行还玩什么呢。

  • 单纯写博客用来记录的话倒是可以试下,直接用网站模板拖拽修改排版倒是挺不错的(如果涉及到比较复杂的后台逻辑,想要直接部署一个项目运行的话就不推荐了):
    在这里插入图片描述

  • 取消 Hosting 服务退款以后和 Titan 相关的邮箱都会失效(退款到账时间有点小长,还扣了点手续费)。

三、Ubuntu 搭建邮件服务器

  • 绕回来还是要自己搞,那就找点教程实操一遍,记录下过程和遇到的问题,留以不时之需:

1. 环境准备

  • 版本: Ubuntu 22.04 LTS
  • 安装 MySQL:sudo apt install mysql-server
    • 命令执行完后 apt 已经默认开启服务,因此不需要开启服务以及设置开机自启动
  • 相关命令:
    • 系统视图:
      • 查看状态: service mysql status
      • 启动/停止/重启服务: sudo service mysql start/stop/restart
      • 查看密码: sudo cat /etc/mysql/debian.cnf
      • 进入 MySQL: sudo mysql
    • MySQL 视图:
      • 重置 root 密码:
        • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new-password';
        • FLUSH PRIVILEGES;
      • 远程登录:
        • 新建 root 用户: create user 'root'@'%' identified by 'complex-reomteLogin-password';
        • 用户授权: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
        • 刷新: FLUSH PRIVILEGES;
      • 报错:
        • 停止服务: sudo systemctl stop mysql
        • 编辑文件: sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
          • 注释该配置项: bind-address = 127.0.0.1
        • 开启服务: sudo service mysql start

2. 域名配置

  • 在已有的两条 A 类型解析记录(如下)的基础上进行配置:
HostnameTypeTTL
A3600
wwwA3600
  • 添加三个子域名 A 记录:
HostnameTypeTTL
mxA3600
smtpA3600
pop3A3600
  • 添加一个 MX 记录:
HostnameTypeTarget HostnameTTLDistance
@MXmx.XXX.xxx360020
  • 添加一个 SPF 记录:
HostnameTypeTextTTL
@TXTv=spf1 mx ~all3600
  • 添加一个 DMARC 记录:
HostnameTypeTextTTL
_dmarcTXTv=DMARC1; p=reject; fo=1; rua=mailto:a***@XXX.xxx3600

3. 配置 Postfix 和 Dovecot

  • 安装:
    • apt update
    • apt install postfix postfix-mysql dovecot-core dovecot-pop3d dovecot-imapd dovecot-lmtpd dovecot-mysql
  • 数据库配置:
    • 创建三个数据库表 virtual_domainsvirtual_usersvirtual_aliases
CREATE TABLE `virtual_domains` (
    `id`  INT NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
CREATE TABLE `virtual_users` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `domain_id` INT NOT NULL,
    `password` VARCHAR(106) NOT NULL,
    `email` VARCHAR(120) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `email` (`email`),
    FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
CREATE TABLE `virtual_aliases` (
    `id` int(11) NOT NULL auto_increment,
    `domain_id` int(11) NOT NULL,
    `source` varchar(100) NOT NULL,
    `destination` varchar(100) NOT NULL,
    PRIMARY KEY (`id`),
    FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 插入数据:
    • 域名: insert into virtual_domains values(1,'XXX.xxx')
    • 用户: insert into virtual_users values(1,域名序号,md5('密码'),'user@XXX.xxx');
    • 别名: insert into virtual_aliases values(1,1,'aliase@XXX.xxx','user@XXX.xxx')
      • aliase@XXX.xxx 需要先存在于 virtual_users 中,virtual_aliases 中的转发记录才能生效)

① 安装 Nginx

  • 安装Nginx 弹出 “Daemons using outdated libraries”,参考解决方案。
  • 报错 “./configure: error: the HTTP gzip module requires the zlib library.”,解决:sudo apt-get install zlib1g-dev
  • 访问网址显示下图界面为安装成功:
  • 备份配置文件: cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak

② 安装 Tomcat

  • 安装Java环境: sudo apt install openjdk-17-jre-headless
  • 安装Tomcat:sudo wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.18/bin/apache-tomcat-10.1.18.tar.gz
  • 解压Tomcat:sudo tar -xzvf apache-tomcat-10.1.18.tar.gz -C /usr/local/
    • -C:指定解压⽬录,解决当前⽬录下找不到 /usr/local 报错
  • 启动Tomcat:
    • cd /usr/local/apache-tomcat-10.1.18/bin
    • ./startup.sh
  • 域名:8080访问进入下图界面为安装成功:
    在这里插入图片描述

③ 申请 SSL 证书(Let’s Encrypt)

  • 安装 snap:

    • sudo apt update
    • sudo apt install snapd
    • snap version
  • 通过 snap 安装 certbot: sudo snap install --classic certbot

  • 创建的软链接,便于 certbot 命令的使用:ln -s /snap/bin/certbot /usr/bin/certbot

  • 获取证书(Nginx 方式): certbot certonly --nginx --email 1***@qq.com -d ***.top -d www.***.top

    • 报错:Error while running nginx -c /etc/nginx/nginx.conf -t
    • 解决:
      • 查看 Nginx 配置路径: sudo nginx -t
      • 自定义路径:certbot --nginx --nginx-server-root=/usr/local/nginx/conf
      • 设定完路径就可以根据提示一步步注册了:
        在这里插入图片描述
    • 报错:Could not automatically find a matching server block for XXX.xxx. Set the 'server_name' directive to use the Nginx installer.
    • 解决:修改 Nginx 配置文件,将 server_name 改为自己的两个域名
    • 重新安装还是报上面的路径错误,用同样的命令解决,随后按照提示一步步就安装成功了:
      在这里插入图片描述
  • 更新证书: certbot renew

  • 续订并重启 Nginx:certbot renew --renew-hook "service nginx restart"

    • 如果未到期会提示证书尚未到期更新,也不会重启 Nginx
  • 自动续订证书: 30 4 * * 1 certbot renew --renew-hook "service nginx restart" --quiet > /dev/null 2>&1 &

    • 翻译:每周一的凌晨4点30分,使用Certbot来续订证书,并在完成后重启Nginx服务。所有的输出和错误信息都会被重定向到/dev/null,并且命令会在后台运行。
    • 设置系统为北京时间: sudo timedatectl set-timezone Asia/Shanghai
  • 安装完证书访问网站报错,重定向次数过多,解决方法很简单,只需要将 Cloudflare 中的加密模式由灵活(默认模式)修改为完全即可。详细原因可以参考这篇文章的 三:Cloudflare
    在这里插入图片描述

④ 配置 postfix

  • 官网文档:Postfix文档

  • 备份 postfix 的默认配置文件: cp /etc/postfix/main.cf /etc/postfix/main.cf.bak

  • 编辑 main.cf

    • vim /etc/postfix/main.cf
    • 注释掉下面这部分代码:

    在这里插入图片描述

    • 添加自己的配置(路径里的域名换成自己的):
      • smtpd_tls_auth_only = yes 注释掉表示允许 tls 的 587 端口以及不需要 ssl 验证的 25 端口,用来解决使用 Foxmail 的时候每次登陆都会弹出一个 “安全证书”的问题。
# 使用自己的ssl证书
smtpd_tls_cert_file=/etc/letsencrypt/live/000.top/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/000.top/privkey.pem
smtpd_use_tls=yes
#smtpd_tls_auth_only = yes

smtp_tls_cert_file=/etc/letsencrypt/live/000.top/fullchain.pem
smtp_tls_key_file=/etc/letsencrypt/live/000.top/privkey.pem
smtp_use_tls=yes

smtpd_tls_CApath=/etc/letsencrypt/live/000.top
smtpd_tls_security_level=may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

smtp_tls_CApath=/etc/letsencrypt/live/000.top
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# 使用dovecot来做身份认证
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated permit_mynetworks reject_unauth_destination
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
  • 域名相关的基本配置,其他的一般用默认的就行:
myhostname = 000.top
myorigin = $myhostname
mydomain = $myhostname
  • 其他配置:
# 确保将邮件投递给 mysql 表中列出的虚拟域
virtual_transport = lmtp:unix:private/dovecot-lmtp
# Postfix 配置虚拟域、用户和别名
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  • 创建上面配置里的三个配置文件并进行配置:
    • mysql-virtual-mailbox-domains.cf
      • vim /etc/postfix/mysql-virtual-mailbox-domains.cf
        user = root
        password = 123456
        hosts = 127.0.0.1:3306
        dbname = mailserver
        query = SELECT 1 FROM virtual_domains WHERE name='%s'
        
    • mysql-virtual-mailbox-maps.cf
      • vim /etc/postfix/mysql-virtual-mailbox-maps.cf
        user = root
        password = 123456
        hosts = 127.0.0.1:3306
        dbname = mailserver
        query = SELECT 1 FROM virtual_users WHERE email='%s'
        
    • mysql-virtual-alias-maps.cf
      • vim /etc/postfix/mysql-virtual-alias-maps.cf
        user = root
        password = 123456
        hosts = 127.0.0.1:3306
        dbname = mailserver
        query = SELECT destination FROM virtual_aliases WHERE source='%s'
        
    • 重启服务: systemctl restart postfix
    • 测试是否配置成功:
      • postmap -q 000.top mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf 成功则输出 1
      • postmap -q user@000.top mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf 成功则输出 1
      • postmap -q aliase@000.top mysql:/etc/postfix/mysql-virtual-alias-maps.cf 成功则输出 user@000.top
  • 配置 master.cf
    • vim /etc/postfix/master.cf
    • 取消下图所示的注释,以开启 587 端口和 465 端口的服务
      在这里插入图片描述

⑤ 配置 Dovecot

  • 配置 dovecot.conf

    • vim /etc/dovecot/dovecot.conf
    • 确保启用: !include conf.d/*.conf
    • 加入配置,启用协议: protocols = imap lmtp pop3
  • 配置 10-mail.conf

    • vim /etc/dovecot/conf.d/10-mail.conf
    • 确保存在配置(该配置确保将邮件存放目录设置在 /var/mail 中):
      • mail_location = maildir:/var/mail/vhosts/%d/%n
      • mail_privileged_group = mail
  • 创建用户来作为 /var/mail 路径的所属人:

    • groupadd -g 5000 vmail
    • useradd -g vmail -u 5000 vmail -d /var/mail
    • chown -R vmail:vmail /var/mail
  • 配置 10-auth.conf

    • vim /etc/dovecot/conf.d/10-auth.conf
    • 确保配置为:
      • disable_plaintext_auth = yes (表示拒绝明文密码登录,如果客户端登不上可以尝试把这里改成 no
      • auth_mechanisms = plain login
    • 禁用系统用户登陆,并开启 mysql 支持(第一个注释掉,开启第二个):
      在这里插入图片描述
  • 配置 auth-sql.conf.ext

    • vim /etc/dovecot/conf.d/auth-sql.conf.ext
    • 修改为以下内容:
      passdb {
        driver = sql
        args = /etc/dovecot/dovecot-sql.conf.ext
      }
      userdb {
        driver = static
        args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
      }
      
  • 配置 dovecot-sql.conf.ext

    • vim /etc/dovecot/dovecot-sql.conf.ext
    • 确保添加如下配置:
      • driver = mysql
      • connect = host=127.0.0.1 port=3306 dbname=mailserver user=root password=123456
      • default_pass_scheme = MD5
      • password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
  • /etc/dovecot 的拥有者改为 vmail:dovecot

    • chown -R vmail:dovecot /etc/dovecot
    • chmod -R o-rwx /etc/dovecot
  • 配置 10-master.conf

    • vim /etc/dovecot/conf.d/10-master.conf
    • imap-loginpop3-login 下第一个的 port 设置为 0,以禁用非 ssl 加密的 imap 和 pop3 协议
    • lmtpauthauth-worker 中的内容修改为以下对应内容:
      service lmtp {
          unix_listener /var/spool/postfix/private/dovecot-lmtp {
          mode = 0600
          user = postfix
          group = postfix
          }
      
          # Create inet listener only if you can't use the above UNIX socket
          #inet_listener lmtp {
          # Avoid making LMTP visible for the entire internet
          #address =
          #port =
          #}
      }
      
      service auth {
          unix_listener /var/spool/postfix/private/auth {
          mode = 0666
          user = postfix
          group = postfix
          }
      
          unix_listener auth-userdb {
          mode = 0600
          user = vmail
          #group =
          }
      
          user = dovecot
      }
      
      service auth-worker {
          # Auth worker process is run as root by default, so that it can access
          # /etc/shadow. If this isn't necessary, the user should be changed to
          # $default_internal_user.
          user = vmail
      }
      
  • 配置 10-ssl.conf 以开启 ssl 认证:

    • vim /etc/dovecot/conf.d/10-ssl.conf
    • 找到并修改为:ssl = required
      • required :必须要有 ssl
      • yes :开启 ssl 也允许非 ssl
    • 设置 ssl 证书路径:
      • ssl_cert = </etc/letsencrypt/live/000.top/fullchain.pem
      • ssl_key = </etc/letsencrypt/live/000.top/privkey.pem
  • 查看当前 Dovecot 配置: dovecot -n

  • 配置完成,重启后可以使用 Foxmail 连接了:

    • service postfix restart
    • service dovecot restart
  • 登录失败,到 /var/log 查看日志

  • 终于找到问题了,记得看看自己的主机厂商有没有开启 465 等端口。

4. 配置 SpamAssassin 和 OpenDKIM

  • 登录上以后发送邮件收不到,试了下这个网站(每天免费测试三次):Newsletters spam test by mail-tester.com
    在这里插入图片描述
  • 难绷,还得再搞搞,按照这里面的一条条改吧:
    在这里插入图片描述

① 配置 SpamAssassin

  • 安装: sudo apt-get install spamassassin spamc
  • 添加用户: sudo adduser spamd --disabled-login
    • 查看用户(详细信息): cat /etc/passwd
    • 查看用户(仅用户名): cat /etc/passwd | cut -d: -f1
  • 配置 spamassassin
    • vim /etc/default/spamassassin
    • 确保配置:
      ENABLED=1
      SAHOME="/var/log/spamassassin/"
      OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir /home/spamd/ -s /home/spamd/spamd.log"
      PIDFILE="/var/run/spamd.pid"
      CRON=1
      
  • 配置 local.cf(用于添加规则):
    • vim /etc/spamassassin/local.cf
    • 确保开启配置:
      rewrite_header Subject ***** SPAM _SCORE_  *****
      required_score          5.0
      use_bayes               1
      bayes_auto_learn        1
      
  • 配置 master.cf
    • vim /etc/postfix/master.cf
    • 添加如下配置至如图所示:
          -o content_filter=spamassassin
      spamassassin unix -     n       n       -       -       pipe
      user=spamd argv=/usr/bin/spamc -f -e
      /usr/sbin/sendmail -oi -f ${sender} ${recipient}
      
      在这里插入图片描述
    • 确保 smtp / smtps / submission 下均添加如下参数:
      • -o content_filter=spamassassin
  • 重新启动 Postfix 和 SpamAssassin:
    • sudo service postfix restart
    • sudo service spamassassin restart

② 配置 OpenDKIM

  • 安装: sudo apt install opendkim opendkim-tools
  • 配置 opendkim.conf
    • vim /etc/opendkim.conf
    • 添加以下配置(域名改成自己的):
      Domain                  000.top                                 
      KeyFile         /etc/dkimkeys/dkim.key                                      
      Selector                dkim                                                
      SOCKET                  inet:8891@localhost
      
  • 配置 opendkim
    • vim /etc/default/opendkim
    • 添加配置:
      • SOCKET="inet:8891@localhost"
  • 生成 DKIM 密钥对(DKIM :域名密钥识别邮件标准(DomainKeys Identified Mail),电子邮件验证标准
    • 执行命令(域名换成自己的,生成的 dkim.privatedkim.txt 在根目录下):
      • sudo opendkim-genkey -t -s dkim -d 000.top
    • 移动 dkim.private
      • sudo mv dkim.private /etc/dkimkeys/
    • 切换路径并更改所有者
      • cd /etc/dkimkeys/
      • sudo chown opendkim:opendkim dkim.private
    • 修改文件名(不然重启时会报错):
      • mv dkim.private dkim.key
  • 配置 main.cf (Postfix):
    • vim /etc/postfix/main.cf
    • 添加如下配置:
      #DKIM                                                                                  
      smtpd_milters = inet:localhost:8891                                                      
      non_smtpd_milters = inet:localhost:8891                                                  
      milter_protocol = 2                                                                      
      milter_default_action = accept
      
  • 重启服务:
    • sudo service opendkim restart
    • sudo service postfix restart
  • 将根目录之前生成的 dkim.txt 中括号中的内容去除双引号和换行,作为 TXT 记录添加到域名中
HostnameTypeText
dkim._domainkeyTXTv=DKIM1; h=sha256; k=rsa; t=y;p=…
  • 都弄完以后又测了一遍,看起来效果还不是很好 (T——T),不过往QQ发的邮件已经可以被收到了:
    在这里插入图片描述

参考教程:

  • ubuntu20 安装和配置mysql8.0.23
  • Ubuntu用Postfix+Dovecot搭建优秀的邮件服务器
  • 申请免费ssl证书
  • Ubuntu免费ssl证书(Let’s Encrypt)配置
  • Ubuntu Nginx 安装与基本配置
  • 在ubuntu上使用git克隆github上的项目
  • 如何处理ubuntu22.04LTS安装过程中出现“Daemons using outdated libraries”提示
  • 【Tomcat】ubuntu系统安装Tomcat
  • 全民https时代,Let’s Encrypt免费SSL证书的申请及使用(Tomcat版)
  • certbot-auto不再支持所有的操作系统,新的ssl证书方法
  • Let’s Encrypt:Your system is not supported by certbot-auto anymore解决方法(证书更新)
  • Ubuntu中snap包的安装,删除,更新使用入门教程
  • https免费证书(certbot)
  • 访问后台出现重定向次数过多该怎么办?-建站需知
  • 关于iredmail邮箱系统不使用ssl校验的配置
  • Ubuntu下为postfix配置DKIM
  • How to Setup SpamAssassin With Postfix On Ubuntu 16.04

官网以及官方文档:

  • Postfix主页(德语)
  • Postfix文档
  • Postfix TLS 支持
  • Postfix基本配置

总结

       本文记录了如何在一台 Ubuntu 服务器上搭建邮件服务器,主要是安装和配置 Postfix 和 Dovecot,以及 SpamAssassin 和 OpenDKIM 的安装和配置。同时也介绍了如何申请 SSL 证书以及其他服务的相关配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/347843.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连

用了网上的办法&#xff1a; 1、修改listener.ora的参数,把动态的参数设置为静态的参数,红色标注部分 位置D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME PLSExtProc) (ORACLE_HOME D:\oracle\produ…

C++练习题1-9

文章目录 NO1、选出妃子、宫女和嬷嬷No2、根据数字判断月份No3、循环计数No4、循环选数No5、玩转字符No6、计算字符串长度No7、显示字符串中的字符No8、字符串反转No9、二维数组的应用 NO1、选出妃子、宫女和嬷嬷 其他要求&#xff1a; 超女用结构体表示不要嵌套if输入所有数据…

博物馆环境监控系统的需求是怎么来的???

一、博物馆环境基本调研和识别需求 在环境监测软件的需求中&#xff0c;首要任务是进行深入的基本调研。这包括把握已有的环境监测技术、标准与法规&#xff0c;以及用户的实际操作过程和困惑。积极与环保局、科研院所、公司等沟通&#xff0c;可搜集很多原始记录&#xff0c;…

MySQL的SQL分类与数据类型

MySQL是一款广泛使用的关系型数据库管理系统&#xff0c;开源、免费且跨平台&#xff0c;常用于存储、管理和检索结构化数据&#xff0c;并通过SQL语言支持高效的数据操作与管理。 文章目录 何为SQLSQL分类DDLDMLDCLTCLDQL MySQL的数据类型数值型日期型字符串型二进制型其他类型…

网安培训第一期——sql注入+文件

文章目录 sql inject报错注入time盲注联合查询万能密码拦截和过滤ascii注入流程base64查询的列名为mysql保留关键字key 文件上传ffuf脚本要做的三件事网络端口进程用户权限文件文件包含文件下载XSS跨站请求攻击csrf跨站请求伪造 sql inject 判断输入字段是字符串还是数字 方法…

【GitHub项目推荐--开源小游戏】【转载】

01 回合制生存游戏 Cataclysm-DDA 是一款回合制生存游戏&#xff0c;背景设置在后世界末日的世界中。虽然有些人将其描述为“僵尸游戏”&#xff0c;但《大灾变》远不止这些。努力在一个严酷、持久、程序生成的世界中生存。 为食物、设备寻找一个死去的文明的残余物。或者&am…

arcgis 面要素shp数据处理

面要素是工作中用到最多的&#xff0c;那么面要素是如何形成的呢&#xff0c;主要还是由闭合的线要素转换而成。在面要素数据中常用的有以下几点&#xff1a; 一、 线转面&#xff08;要素转面&#xff09; 通过上一篇得到了点转线的要素&#xff0c;那么根据上节的线要素&am…

大模型学习笔记一:大模型应用开发基础

文章目录 一、大模型一些概念介绍 一、大模型一些概念介绍 1&#xff09;产品和大模型的区别&#xff08;产品通过调用大模型来具备的能力&#xff09; 2&#xff09;AGI定义 概念&#xff1a;一切问题可以用AI解决 3&#xff09;大模型通俗原理 根据上文&#xff0c;猜测下…

1174:长整数排序(指针专题)

题目描述 长整数排序。输入n 然后输入n个位数不超过100位的大整数&#xff0c;输入的整数可能含有前导0。将这n个长整数排序后输出&#xff0c;输出不含前导0。int greater(char *s1, char *s2){若s1指向的整数大于s2指向的整数&#xff0c;返回一个正整数;若s1指向的整数小于s…

重生之C++王者归来DAY1

c的概述 c的编程思想&#xff1a;面向对象、泛型编程。 1.第一个c程序 本文用的是QT&#xff0c;VS之类的也可 2.c面向对象的三大特性&#xff08;重要&#xff09; 封装:将相同属性的数据和方法封装在一起&#xff0c;加权限区分&#xff0c;用户只能借助公共方法操作 私有…

PCL 高斯投影正算:大地坐标转高斯投影坐标(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示四、测试数据PCL 高斯投影正算:大地坐标转高斯投影坐标(C++详细过程版)由CSDN点云侠原创。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 二、代码实现 头文件及读取保存函数见:

SAP同步异常2:SAP删除获利能力特征字段后VF02发货过帐报错。

测试环境VF02过帐报错&#xff0c; 原因是之前删除已经激并使用的获利能力特征字段后&#xff0c;只处理了数据库&#xff0c;没有处理程序。 处理方案&#xff1a; 1、 KEA0 维护经营关注点&#xff1a; 这里WW291已经删除&#xff0c;但没有激活程序。 退出后&#xff…

web安全学习笔记【09】——算法2

基础[1] 入门-算法逆向&散列对称非对称&JS源码逆向&AES&DES&RSA&SHA #知识点&#xff1a; 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OSS&反向&负载…

2.数据结构 顺序表(自留笔记)

文章目录 一.静态顺序表&#xff1a;长度固定二.动态顺序表1.下面证明原地扩容和异地扩容代码如下&#xff1a;2.下面是写一段Print&#xff0c;打印数字看看&#xff1a;3.头插4.尾删5.头删6.越界一定会报错吗7.下标插入8.下标删除9.查找数字10.应用&#xff1a;利用顺序表写一…

跨平台同步 Shell 历史记录,无缝切换会话 | 开源日报 No.154

atuinsh/atuin Stars: 14.3k License: MIT Atuin 是一个用 SQLite 数据库替换现有 shell 历史记录的工具&#xff0c;可以记录命令的额外上下文&#xff0c;并提供可选且完全加密的历史同步功能。其主要功能和核心优势包括&#xff1a; 重新绑定 ctrl-r 和 up (可配置) 到全屏…

安装宝塔面板后k8s所在节点pod无法正常工作解决方法,kubernetes k8s 与宝塔面板冲突解决方法

在实际项目过程中我们使用了k8s 在生产环境中运行管理服务。 但是对服务器的状态管理我们使用了宝塔面板进行 K8s 版本1.2.8 宝塔面板 版本 8.05 操作步骤是这样的。 1.完成1.2.8 k8s的节点安装&#xff0c;并正常运行服务。 过程略 2.安装宝塔面板 ​ yum install -y …

不要在细节上雕花

前段时间在网上看到一张趣图,有人在社交网络分享学习编程的笔记,一行行手抄代码,字迹清晰,排版工整,霎是认真。 这可能只是个梗,但它让我想起我的学生年代。许多年前我还在念书的时候,班上有不少非常认真的同学,热衷于把课堂笔记做得非常漂亮、工整,有些甚至要用尺子对…

vue —— h函数的学习与使用

文章目录 一、h函数是什么&#xff1f;二、h函数格式说明及使用示例1&#xff1a;简单创建一个VNode&#xff08;vue3&#xff09;示例2&#xff1a;vue2中h函数用法示例3&#xff1a;vue3中h函数的用法vue2和vue3中h函数的区别&#xff1f; 三、h函数实现原理四、h函数常用场景…

java每日一记 —— MySQL窗口函数的使用

MySQL窗口函数 1.什么时窗口函数2.窗口函数的基本应用2.1.排序函数2.2.分布函数2.3.前后函数2.4.头尾函数2.5.聚合函数2.6.其他函数 窗口函数时MySQL8.0中的 注意&#xff1a;窗口函数也有人称为“开窗函数” 1.什么时窗口函数 引入问题&#xff1a;让我们从一个实际的问题开始…

redis排序

文章目录 简介SORT命令的实现ALPHA选项的实现ASC和DESCBYLIMITGET命令 类似映射STORE选项的实现多个命令的执行顺序 简介 Redis的SORT命令可以对列表键、集合键或者有序集合键的值进行排序。 SORT命令的实现 服务器执行SORT numbers 命令的详细步骤如下&#xff1a; 1&#…