清朝云资源网

博客

  • 检测公网 ip 变化后发送邮箱(一)- Python 发送邮箱代码

    家里的带宽申请了公网 ip,通过 pppoe 拨号的方式,运营商会随机分配一个公网,但是两三天就会变动一次。想着能不能定时监测公网 ip ,发邮件通知我。

    当然,这是已经做了 ddns 的情况了,如果知道公网 ip,即使 ddns 不生效依然不会影响正常访问。

    下面是发送邮箱的代码:

    # smtplib 用于邮件的发信动作
    import smtplib
    # email 用于构建邮件内容
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    # 构建邮件头
    from email.header import Header
    
    # 发信方的信息:发信邮箱,QQ 邮箱授权码
    from_addr = 'xxx@qq.com'
    password = 'xxx'
    # 收信方邮箱
    to_addr = 'xxx@qq.com'
    # 发信服务器
    smtp_server = 'smtp.qq.com'
    
    html_msg = """
    <p>Python 邮件发送HTML格式文件测试...</p>
    <p><a href="http://www.runoob.com">这是一个链接</a></p>
    """
    
    # 创建一个带附件的实例msg
    msg = MIMEMultipart()
    msg['From'] = Header('发送者')  # 发送者
    msg['To'] = Header('接收者')  # 接收者
    subject = 'Python SMTP 邮件测试'
    msg['Subject'] = Header(subject, 'utf-8')  # 邮件主题
    # 邮件正文内容
    msg.attach(MIMEText(html_msg, 'html', 'utf-8'))
    
    try:
        smtpobj = smtplib.SMTP_SSL(smtp_server)
        smtpobj.connect(smtp_server, 465)    # 建立连接--qq邮箱服务和端口号
        smtpobj.login(from_addr, password)   # 登录--发送者账号和口令
        smtpobj.sendmail(from_addr, to_addr, msg.as_string())
        print("邮件发送成功")
    except smtplib.SMTPException:
        print("无法发送邮件")
    finally:
        # 关闭服务器
        smtpobj.quit()

    经过测试,上面的代码是可以完美运行的。需要注意的是,需要修改部分自己的配置。

  • Python 实现DDNS 动态解析到阿里

    什么是 DDNS?

    DDNS(Dynamic Domain Name Server,动态域名服务)是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析

    DDNS的使用场景分析

    在中国,面向社会的服务器是需要备案的,而备案的时候是需要使用一个固定的公网ip备案的。因此很多人想要使用DDNS实现网站搭建的小伙伴就要失望了(说的就是我)。

    但是这里面有一个细节,面向社会提供服务的需要备案,那么不提供服务且有意阻止社会人员访问服务器的应用场景,如个人计算服务器、私人云盘(如群辉的家庭云服务),就不需要备案了。

    用python实现DDNS

    
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest
    from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
    import json
    import subprocess
    import re
    
    # 获取当前域名对应的ip地址
    def get_internet_ip():
        child = subprocess.Popen("nslookup nideyuming", shell=True, stdout=subprocess.PIPE)
        out = child.communicate()  # 保存nslookup获取的所有信息
        ipv6_pattern = '(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})'
        m = re.findall(ipv6_pattern, str(out))
        address = m[0][0]  # 拿到ipv6地址
        return address
    
    # 获取本机临时IPv6地址
    def get_local_ip():
        child = subprocess.Popen("ipconfig", shell=True, stdout=subprocess.PIPE)
        out = child.communicate()  # 保存ipconfig中的所有信息
        ipv6_pattern = '(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})'
        m = re.findall(ipv6_pattern, str(out))
        address = m[1][0]
        return address
    
    # 获取recordid
    def get_recordid(client):
        request = DescribeDomainRecordsRequest()
        request.set_accept_format('json')
        request.set_DomainName("discover304.top") #\TODO 传你的域名
        response = client.do_action_with_exception(request)
        response = str(response, encoding='utf-8')
        result = json.loads(response)
        recordid = result["DomainRecords"]["Record"][0]["RecordId"]
        return recordid
    
    # 更新域名解析
    def update_record(client, priority, ttl, record_type, value, rr, record_id):
        request = UpdateDomainRecordRequest()
        request.set_accept_format('json')
        request.set_Priority(priority)
        request.set_TTL(ttl)
        request.set_Value(value)
        request.set_Type(record_type)
        request.set_RR(rr)
        request.set_RecordId(record_id)
        response = client.do_action_with_exception(request)
        response = str(response, encoding='utf-8')
        return response
    
    # 函数调用
    def run_result(client, priority, ttl, record_type, value, rr, record_id):
        if get_local_ip() == get_internet_ip():
            print("解析地址未发生变化,不修改!")
            pass
        else:
            result = update_record(client, priority, ttl, record_type, value, rr, record_id)
            result = json.loads(result)
            print("已更新解析地址,新的RecordId是:%s" % result["RecordId"])
    
    if __name__ == '__main__':
        # \TODO 这儿传你的accessKeyId、accessSecret和区域ID(region_id)
        client = AcsClient('xxxx', 'xxxx', 'cn-beijing')
        record_id = get_recordid(client)
        ip = get_local_ip()
        run_result(client, "5", "600", "AAAA", ip, "@", record_id)
  • Linux下磁盘分区、格式化、挂载以及开机自动挂载

    一、磁盘分区

    类型:MBR分区使用fdisk、GPT分区使用gdisk。区别在于MBR分区是比较老的分区格式,最多能识别2.2T,GPT理论可以识别到PB级别。

    这里使用的是fdisk工具,建立逻辑分区。

    fdisk /dev/sdb  #设备名
    
    # 建立扩展分区
    # 1.输入p打印分区情况,n建立新的分区
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): e
    
    # 2.提示选择普通分区、扩展分区,输入e
    分区号 (2-4,默认 2):4
    
    # 3.回车选择默认
    起始 扇区 (1048577-4194303,默认为 1050624):
    将使用默认值 1050624
    
    # 4.我这里选择全部的1/4,所以在原来的基础上加了1048576
    Last 扇区, +扇区 or +size{K,M,G} (1050624-4194303,默认为 4194303):2099200
    分区 4 已设置为 Extended 类型,大小设为 512 MiB
    
    --------------------------------------------------------
    
    # 在扩展分区下建立普通分区
    # 1.输入n建立新的分区
    Partition type:
       p   primary (1 primary, 1 extended, 2 free)
       l   logical (numbered from 5)
    Select (default p): l
    
    # 2.提示选择普通分区,逻辑分区,输入l
    添加逻辑分区 5
    
    # 3.回车选择默认
    起始 扇区 (1052672-2099200,默认为 1052672):
    将使用默认值 1052672
    
    # 4.选择扩展分区的1/2
    Last 扇区, +扇区 or +size{K,M,G} (1052672-2099200,默认为 2099200):1576960
    分区 5 已设置为 Linux 类型,大小设为 256 MiB
    
    ---------------------------------------------------
    # 建立第二个逻辑分区
    ---------------------------------------------------
    
    # 输入w将刚刚的修改保存
    命令(输入 m 获取帮助):w
    The partition table has been altered!

    一定要输入w保存修改!!!

    二、格式化

    1、在格式化以前,重新读取分区表。

    apt install -y parted
    partprobe -s

    2、格式化

    将两个逻辑分区格式化为ext4,常用的文件系统有ext4,ext3,xfs…..

    mkfs -t ext4 /dev/sdb5
    mkfs -t ext4 /dev/sdb6

    三、挂载

    只要mount命令将分区挂载到指定目录就可以了,使用df -T查看。

    mount /dev/sdb5 /disk1/extended1
    mount /dev/sdb6 /disk1/extended2
    
    df -T
    文件系统                类型        1K-块    已用     可用 已用% 挂载点
    /dev/mapper/centos-root ext4     14939104 2461452 11695728   18% /
    devtmpfs                devtmpfs   485960       0   485960    0% /dev
    tmpfs                   tmpfs      497948       0   497948    0% /dev/shm
    tmpfs                   tmpfs      497948    7832   490116    2% /run
    tmpfs                   tmpfs      497948       0   497948    0% /sys/fs/cgroup
    /dev/sda1               ext4       388462  106594   257292   30% /boot
    /dev/sdb1               ext4       498532    2353   470016    1% /disk1
    /dev/mapper/centos-home ext4      3997376   16504  3754776    1% /home
    tmpfs                   tmpfs       99592       0    99592    0% /run/user/0
    /dev/sdb5               ext4       245671    2062   226406    1% /disk1/extended1
    /dev/sdb6               ext4       246791    2062   227680    1% /disk1/extended2
    

    四、开机自动挂载

    上面的挂载只是暂时的,要自动挂载就需要写入配置文件中,配置文件是 /etc/fstab 。

    cat /etc/fstab
    
    /dev/mapper/centos-root /                       ext4    defaults        1 1
    UUID=0e488f7a-edef-45f7-b2d3-5de6b4b473d1 /boot                   ext4    defaults        1 2
    /dev/mapper/centos-home /home                   ext4    defaults        1 2
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    
    /dev/sdb1   /disk1              ext4    defaults    1 2
    

    仿造上面的配置,添加两条数据:

    /dev/mapper/centos-root /                       ext4    defaults        1 1
    UUID=0e488f7a-edef-45f7-b2d3-5de6b4b473d1 /boot                   ext4    defaults        1 2
    /dev/mapper/centos-home /home                   ext4    defaults        1 2
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    
    /dev/sdb1   /disk1              ext4    defaults    1 2
    /dev/sdb5   /disk1/extended1    ext4    defaults    1 2
    /dev/sdb6   /disk1/extended2    ext4    defaults    1 2
    

    设置好,reboot重启,可以看见自动挂载好了。

  • 本地服务器如何增量备份远程主机文件

    使用服务器备份到另一个目录,万一服务器没了,数据都完蛋。

    于是想着,反正自己本地有一台当服务器用的笔记本,就用这台笔记本用定时任务增量备份服务器上的数据也不错。

    这里使用到了 sshpass 命令,好处是可以不用使用公钥拷贝到远程服务器上,可以命令行输入密码,坏处显而易见就是没那么安全。

    1. 安装sshpass

    有可能机器上没安装命令,需要先进行安装。

    apt install -y sshpass

    2. 编写脚本

    创建目录和脚本文件:

    mkdir -p /usr/local/backup && \
    touch /usr/local/backup/backup.sh && \
    chmod +x /usr/local/backup/backup.sh

    添加脚本文件内容 vim backup.sh

    #!/bin/bash
    shell_dir=$(cd $(dirname $0); pwd)
    # 定义远程主机的用户名、IP地址和要备份的目录
    remote_user="root"
    remote_ip="1.1.1.1"
    remote_dir="/home/xxx"
    
    # 定义本地备份目录和要排除的文件/目录
    local_dir="/usr/local/backup/xxx"
    exclude_file=".git/"
    
    # 定义日志文件
    log_file="${shell_dir}/file.log"
    
    # 定义SSH密码
    ssh_pass="123456"
    
    echo "备份开始执行于:$(date)" >> "$log_file"
    # 使用sshpass命令进行SSH连接和增量备份
    sshpass -p "$ssh_pass" rsync -avz --delete --exclude "$exclude_file" "$remote_user@$remote_ip:$remote_dir/" "$local_dir/" >> "$log_file"  2>&1
    echo "备份执行完成于:$(date)" >> "$log_file"

    3. 创建定时任务

    比如我需要每天凌晨 2 点备份一次,只需要使用 crontab -e 命令,追加以下内容即可。

    0 2 * * * /usr/local/backup/backup.sh
  • 如何查看 Linux 机器是否能通过 Docker 运行 gui 界面

    如何查看 Linux 机器是否能通过 Docker 运行 gui 界面

    用一个非常简单的容器可以达到测试效果,不管是在远程 ssh 界面,或者是本地运行这将会打开一个时钟。

    docker run \
    --rm -it \
    --net=host \
    -e DISPLAY=$DISPLAY \
    -v $HOME/.Xauthority:/root/.Xauthority \
    sshipway/xclock

    这里的 --net=host 非常重要,否则将会提示:

    Error: Can’t open display: localhost:x

    另外,如果是 ssh 远程想要在本地打开 gui 界面的话,需要本地装有 x server,像 mobaxterm 就是默认就安装了并且不需要配置,其他的 ssh 终端可以需要进行配置。

    6468d3125a94a

  • 6月1日,星期四,在这里每天60秒读懂世界!

    6月1日,农历四月十四,星期四!

    在这里,每天60秒读懂世界!

    1、《重庆市邮政条例》修正通过,7月1日起施行:未经收件人同意私自把快件放"快递驿站"最高罚3万元;

    2、北京:6月1日起,为京籍高考生开通办理居民身份证绿色通道;

    3、网传“柳州柳南区工信局长与情人聊天记录被群发”,官方通报:纪委监委正核查了解;

    4、成都一男子驾车在崇州市辰居路上乱撞多车,下车后大骂并"裸奔",所幸无人受伤,目前已被警方控制;

    https://www.zhihu.com/video/1647406519883964416

    5、四川威远:唯一饮用水水源储水量严重不足,如不降雨仅可供60天,已分时限压供水;

    ↑20多天前的长葫水库。图据威远融媒

    6、外媒:中印通过拒绝续签签证互相驱逐对方记者。外交部:印方对中国记者长期无理打压,中方不得不采取适当反制措施;

    7、当地30日,美国财政部以参与跨国销售非法药品生产设备为由,宣布制裁13个中国实体与个人。我使馆:强烈谴责;

    8、俄媒:俄国家杜马批准关于俄通过远东路线向中国输送天然气的协议;

    9、美称中国军机在南海实施"不必要侵略性机动",南部战区回应:美侦察机蓄意闯入我训练区域实施侦察干扰,外交部:美方应立即停止挑衅行动;

    中美军机近距离相遇 实际轨迹图公布

    10、朝鲜:31日上午,因火箭发动机失灵,军事侦察卫星发射失败。韩国:"打捞了部分朝卫星残骸,计划回收后分析其性能";

    当地时间2023年5月31日,韩国Eocheong岛,韩国军方打捞了一个物体,据推测是朝鲜声称的“太空运载火箭”的一部分,该运载火箭于2023年5月31日在韩国岳清岛附近海域发射失败后坠入大海。图源:视觉中国

    11、当地29日,墨西哥一高速公路爆发激烈枪战,造成10名犯罪嫌疑人死亡,4名警察受伤;

    墨西哥当局表示,他们缴获了12件大口径武器、手榴弹、一百枚弹药以及三辆装甲车。

    12、德国:鉴于俄限制措施,将要求俄罗斯年底前关闭4个驻德总领事馆;

    13、贾跃亭宣布首款车型FF91 2.0 Futurist正式上市,售价220万元,每年10万元服务费,CLTC续航800公里;

    14、外媒:局势升级!北约决定向科索沃增派700人部队。武契奇会见中俄大使,通报科索沃问题现状和塞立场;

    15、俄国防部:俄军使用高精度武器摧毁了乌海军最后一艘战舰;乌海军总司令:自俄"入侵"以来,乌军共摧毁18艘俄方舰艇;

    俄卫星通讯社5月31日称,这是“尤里·奥列菲连科” 号战舰的资料图。

    【微语】不行动,梦想就只是好高骛远;不执行,目标就只是海市蜃楼。想做一件事,就请马上开始。

  • Docker 搭建 uptime-kuma 监控网站状态

    Docker 搭建 uptime-kuma 监控网站状态

    由于网站经常遭到 ddos 攻击,想来还是搭建一个网站监控的服务好了,至少博客出问题能及时发现并修改解析。

    646dc233d4408

    Uptime Kuma 是一个开源的监控工具,功能类似于 Uptime Robot。相较于其它同类工具,Uptime Kuma 支持自托管服务,并且限制更少。

    下面是 Docker 搭建命令:

    docker run -d \
    --restart=always \
    -p 3001:3001 \
    -v /home/docker/uptime/:/app/data \
    --name uptime-kuma \
    louislam/uptime-kuma

    安装好以后访问 web 界面,设置账户和密码,然后就可以添加监控。添加监控很简单,这里就不啰嗦了,比较重要的是配置监控的通知,通知的类型可以选择很多,比如邮件、telegram、企业微信机器人等。

    阿蛮君在设置里面配置了一个邮件通知,如下图:

    646dc31cf379c

    配置时可以选择应用于所有监控,但是我的服务一般也不会挂,并且也不是什么很重要的服务。所以,我只选择了博客监控发送通知,这样我能够知道服务器挂了或者是哪里出问题了。

     

  • Navicat15 最新破解版下载和安装教程

    Navicat15 最新破解版下载和安装教程

    一、 安装Navicat

    下载压缩包可以看见两个 exe 文件,navicat150_premium_cs_x64.exe 是正版安装包, Navicat Keygen Patch v5.6.0 DFoX.exe是破解软件。

    6444fd7d34b59

    双击navicat150_premium_cs_x64.exe,按照正常软件安装,选择合适的目录,待会要用到。

    二、破解

    1. 选择安装程序

    右键以管理员方式运行 Navicat Keygen Patch v5.6.0 DFoX.exe,会看见如下界面。

    6444fe890e9ad

    点击 Patch,选择刚刚安装 Navicat 的 exe 文件。

    6444feff77b2a

    2. 生成密钥

    点击 Generate 生成密钥。

    6444ff5628203

    3. 激活

    打开 navicat,选择帮助 -> 注册,填写密钥并点击激活。

    6444ffc012a89

    接下来提示激活服务器不可用,然后点击手动激活。

    6444fff3d656a

    4. 生成激活码

    复制刚刚的激活请求码到破解程序,点击最下面的 Generate 按钮。

    644501259c480

    接下来把激活码填入 navicat 即可激活。

    6445014cc9cfc

  • Docker 搭建云端备忘录 memos

    Docker 搭建云端备忘录 memos

    memos 是一个开源、自托管的备忘录中心,项目基于 Golang 和 TypeScript 开发。之前阿蛮君也看见过关于 memos 相关的教程,当时觉得它比较鸡肋,因为它像博客但是又没有博客功能强。

    直到最近事情比较忙了起来,发现必须要把要做的内容给记录下来,防止后面忘记做。并且记录下来以后,工作日志还可以直接复制粘贴,可以说很方便了。

    搭建命令如下:

    docker run -d \
    --name memos \
    -p 5230:5230 \
    -v /home/docker/memos/:/var/opt/memos \
    neosmemo/memos

    首次登录可以输入账号密码,memos 会自动将其注册为管理员,并可以设置系统语言为中文。

    6470717d8ff48

    如果发现登陆后依然是英文,可以通过设置修改为中文。

    647072c42f11c

    发布想法可以通过 # 设置标签,并且支持 markdown 格式。

    6470733fc1e40

  • WordPress 主题美化 – 给代码块添加 mac 风格样式

    之前写过 WordPresss 主题美化-给代码块添加 mac 风格的背景图片,这方式虽然能实现,但是由于使用了背景图片,操作还是稍微有点麻烦。

    今天这个代码直接插入代码即可实现美化代码块,我现在用的就是这个,css 代码如下:

    .post-content-post pre::before {
        content: "";
        display: block;
        background: #fc625d;
        top: 9px;
        left: 15px;
        border-radius: 50%;
        width: 9px;
        height: 9px;
        box-shadow: 16px 0 #fdbc40, 32px 0 #35cd4b;
        margin: 0px 2px -7px;
        z-index: 1000;
        position: absolute;
    }
    
    .post-content-post pre {
        max-height: unset;
        padding: 0 0.5em 0 0.5em;
        background: #2d3748;
    }
    
    .post-content-post pre code {
        margin-top: 16px;
    }