MoreRSS

site iconAnZhihe | 安志合修改

国学和传统文化爱好者,IT行业从业者,运维和SRE。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

AnZhihe | 安志合的 RSS 预览

Nginx正向代理

2025-08-01 00:11:33

1753263871737351.png

Nginx可以通过配置stream模块来实现对HTTPS的TCP四层正向代理。核心是使用proxy_pass指令将流量转发到目标服务器,同时配合ssl_preread指令处理TLS握手,实现HTTPS的透明代理。

一个简单的配置示例:

stream {
    resolver 223.5.5.5 114.114.114.114; # 配置DNS解析器
    resolver_timeout 10s;

    server {
        listen 443; # 监听的端口
        ssl_preread on; # 启用ssl_preread模块,用于处理TLS握手

        proxy_connect_timeout 10s;
        proxy_timeout 30s;
        proxy_pass $ssl_preread_server_name:$server_port; # 转发到目标服务器
        proxy_protocol on; #启用PROXY protocol
        # 可以根据需要添加其他proxy_*指令
    }
}
配置说明:
  • stream模块: Nginx的stream模块用于处理TCP和UDP的四层代理,与HTTP模块同级。

  • resolver配置DNS解析器,用于解析目标服务器的域名。

  • listen指定Nginx监听的端口,这里是20017。

  • ssl_preread on启用ssl_preread模块,这个模块允许Nginx在TLS握手阶段读取SNI (Server Name Indication) 扩展,从而获取目标服务器的域名,这对于HTTPS的透明代理至关重要。

  • proxy_pass将流量转发到目标服务器。$ssl_preread_server_namessl_preread模块提取到的SNI信息,表示目标服务器的域名,$server_port是客户端请求的目标端口。

  • proxy_connect_timeoutproxy_timeout设置连接超时和读写超时时间。

  • proxy_protocol on启用PROXY protocol,如果后端服务器支持,可以传递客户端的真实IP和端口信息。

注意事项:
  • 需要确保Nginx编译时已启用ngx_stream_ssl_preread_modulengx_stream_proxy_module模块。

  • 目标服务器需要正确配置SSL证书,以便Nginx能够正常进行TLS握手。

  • 根据实际需求,可以配置其他proxy_*指令,例如proxy_buffer_sizeproxy_next_upstream等。

  • 如果后端服务器是HTTPS的,则需要在proxy_pass中指定HTTPS协议,例如 proxy_pass https://$ssl_preread_server_name:$server_port;

配置HTTPS正向代理的流程:
  1. 客户端发起HTTPS请求,连接到Nginx的监听端口。

  2. Nginx的stream模块接收到连接,并使用ssl_preread模块读取SNI信息,获取目标服务器的域名。

  3. Nginx根据SNI信息,将请求转发到目标服务器。

  4. Nginx与目标服务器建立TLS连接,进行HTTPS握手。

  5. Nginx将目标服务器的响应返回给客户端。

通过stream模块和ssl_preread模块,Nginx可以实现对HTTPS的TCP四层正向代理,将客户端的请求透明地转发到目标服务器,并处理TLS握手。这种方式可以用于实现负载均衡、流量转发等功能,同时保持HTTPS的安全性。

相关参考:


Linux、Mac和Win10查看文件MD5值

2025-07-26 16:41:09

工作中,发送大文件时必不可少的一步操作就是比对MD5值,这个步骤很有必要,有时候折腾半天才发现接收到的文件并不完整,MD5值对不上,又得重新拷贝一遍,MD5值主要用来校验文件完整性(如下载文件、备份验证)。

Linux 系统

方法 1:使用 md5sum 命令(最常用)

md5sum 文件名

示例:

md5sum ubuntu.iso

输出:
d6e8f9265763a0d9a3e633b1c5f1c4b2 ubuntu.iso
d6e8... 即为 MD5 值)

方法 2:结合其他工具(如 find 批量处理)

find /path/to/files -type f -exec md5sum {} \;

图形界面工具(可选):

  • GtkHash:支持多种哈希算法,提供图形化操作。


macOS 系统

方法 1:使用终端命令 md5

macOS 自带 md5 命令,直接运行即可:

md5 文件路径

示例:

md5 ~/Downloads/ubuntu.iso

输出:

MD5 (/Users/anzhihe/Downloads/ubuntu.iso) = d6e8f9265763a0d9a3e633b1c5f1c4b2

d6e8... 即为 MD5 值)

方法 2:使用 openssl 命令

如果习惯 OpenSSL 语法,也可以使用:

openssl md5 文件路径

图形化工具(可选)

  1. HashTab(付费但好用)

  • 安装后右键文件 → 显示简介 → HashTab 标签页。

  • QuickHash(免费开源)

    • 支持文件/文件夹的多种哈希计算(MD5、SHA1 等)。


    Windows 10 系统

    方法 1:使用 PowerShell(推荐,无需安装)

    1. 打开 PowerShell(管理员权限非必需)。

    2. 执行命令:

    Get-FileHash 文件路径 -Algorithm MD5

    示例:

    Get-FileHash "C:\Downloads\ubuntu.iso" -Algorithm MD5

    输出:

    Algorithm       Hash                                                                   Path
    ---------       ----                                                                   ----
    MD5             D6E8F9265763A0D9A3E633B1C5F1C4B2                                       C:\Downloads\ubuntu.iso

    D6E8... 即为 MD5 值)

    ⚠️ 注意

    • 若提示 Get-FileHash 不存在,请升级 PowerShell 至 4.0 以上版本(Win10 默认支持)。

    方法 2:使用命令提示符(CMD) + CertUtil

    1. 打开 CMD(管理员权限非必需)。

    2. 执行:

    certutil -hashfile 文件路径 MD5

    示例:

    certutil -hashfile "C:\Downloads\ubuntu.iso" MD5

    输出:

    MD5 的哈希:
    d6e8f9265763a0d9a3e633b1c5f1c4b2
    CertUtil: -hashfile 命令成功完成。

    图形界面工具(可选):

    1. 7-Zip
      右键文件 → CRC SHA → MD5

    2. HashTab(免费工具):
      安装后右键文件 → 属性 → 文件校验 标签页。


    注意事项:

    1. MD5 的用途:校验文件完整性(如下载文件、备份验证),不适用于安全加密(已被证明不安全)。

    2. 跨平台一致性:同一文件的 MD5 值在 Linux/macOS/Windows 下结果相同。

    3. 大文件处理:计算时间随文件大小增加,耐心等待即可。

    如有其他需求(如 SHA256 校验),可调整命令中的算法参数(如 -Algorithm SHA256),macOS中将命令中的 md5 替换为 shasum -a 256 即可


    绝地大逃杀2.0之开心乐园

    2025-07-20 01:52:43

    距离绝地大逃杀1.0上线已经一个多月了,情况比想象中的要好,五只乌龟都还在,小强、虾王、斗鱼也没有被吃掉。国斗天天在小缸里干架,有只小乌龟还越狱了,被娃发现抓了回来,鱼龟混养算是成功啦。但是由于太小,水体小,虽然铺了火山石,一两周后水看着还是有点浑,石头下边都是粑粑,水培绿植和过滤也不太给力,于是换了个60的缸,重新开缸升级一版——绝地大逃杀2.0之开心乐园

    底部:火山石+细菌屋+过滤板;水培绿植:水竹+春羽+绿萝;和娃周末一起自制了一个过滤器,里边放了过滤棉+滤材+火山石(用来种绿萝)。然后又买了十条观背青鳉,这种小鱼(游速快+体型小+躲避)和乌龟混养存活率会高很多,从旁边鱼缸捞了条草金放缸里,没过三分钟就被巴西蛊王咬到鱼鳍了,赶紧扔回鱼缸,不然就要目睹惨案发生了。中途出差两周没回来,虾王跳缸而亡,不知是新缸不适应还是太兴奋了,缘份已尽。回来发现鱼缸里的三条小黄辣丁崽子只剩下一条了,从公园里捞回来一个多月,长了一公分,大概率是被草金吃掉了,气得赶紧把仅剩的独苗捞到了乌龟缸里。旁边草金也跳了一条,后边斗鱼又跳了一条,被咬死一条,失踪一条,龟缸里只剩两条斗鱼了。观背青鳉失踪一条,还剩九条。周末娃从电玩城捞鱼机又捞了八条草金回来,这玩意根本死不完

    目前是五只龟,小强(长了一公分,是条虾虎),一条黄辣丁,九条青鳉,两条国斗。周末去捞了几条小鱼和虾,又从鱼缸弄了些田螺崽子放了进来。基本上黄辣丁和小强、小鱼虾喜欢待在过滤板下、石头缝和细菌屋管子里,有时上来玩玩。龟和鱼在上边玩,总体来说,相处得都还算和谐,希望它们都能开开心心在开心乐园里幸福地生活下去

    20250720013544_01.jpg20250720013544_02.jpg20250720013544_03.jpg20250720013544_04.jpg

    [video dplayer="true" autoplay="false" src="https://cdn.chegva.com/ueditor/php/upload/video/20250720/1752947083647950.mp4" loop="false" preload="true" theme="#b7daff" mutex="true" iconsColor="#ffffff"]

    [video dplayer="true" autoplay="false" src="https://cdn.chegva.com/ueditor/php/upload/video/20250720/1752947083593583.mp4" loop="false" preload="true" theme="#b7daff" mutex="true" iconsColor="#ffffff"]

    使用脚本、工具批量操作服务器做免密登录及修改密码

    2025-07-18 00:23:34

    • 生产实践:

        使用脚本、工具批量操作服务器做免密及修改密码

    • 学习技巧:

        Shell 脚本、sshpass、parallel-ssh及ansible工具使用

    • 脚本内容:      

         使用脚本、工具批量操作服务器做免密及修改密码,常用于服务器初始化及批量操作。

    一、sshpass使用

    1、确保本地机器已安装sshpass工具

    apt install sshpass  # Ubuntu/Debian
    yum install sshpass  # CentOS/RHEL

    2、准备服务器列表文件(如servers.txt),格式为:用户名@IP地址:端口 密码

    例如:

    [email protected]:22 password1
    [email protected]:2222 password2

    批量配置SSH免密登录

    #!/bin/bash
    
    # 生成SSH密钥对(如果尚未生成)
    if [ ! -f ~/.ssh/id_rsa ]; then
        ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
    fi
    
    # 读取服务器列表
    while read line; do
        # 提取信息
        server=$(echo $line | cut -d' ' -f1)
        password=$(echo $line | cut -d' ' -f2)
        
        # 分离用户名、IP和端口
        user=$(echo $server | cut -d'@' -f1)
        ip_port=$(echo $server | cut -d'@' -f2)
        ip=$(echo $ip_port | cut -d':' -f1)
        port=$(echo $ip_port | cut -d':' -f2)
        port=${port:-22}  # 默认SSH端口22
        
        echo "正在配置 $user@$ip:$port ..."
        
        # 使用sshpass复制公钥到远程服务器
        sshpass -p "$password" ssh-copy-id -o StrictHostKeyChecking=no -p $port $user@$ip
        
        # 测试免密登录
        ssh -p $port $user@$ip "echo 'SSH免密登录配置成功!'"
        
        echo "$user@$ip:$port 配置完成"
        echo "------------------------------------"
    done < servers.txt

    批量修改服务器密码

    #!/bin/bash
    
    # 读取新密码
    read -s -p "请输入新密码: " new_password
    echo
    read -s -p "再次确认新密码: " new_password_confirm
    echo
    
    if [ "$new_password" != "$new_password_confirm" ]; then
        echo "两次输入的密码不一致,请重试!"
        exit 1
    fi
    
    # 读取服务器列表
    while read line; do
        # 提取信息
        server=$(echo $line | cut -d' ' -f1)
        old_password=$(echo $line | cut -d' ' -f2)
        
        # 分离用户名、IP和端口
        user=$(echo $server | cut -d'@' -f1)
        ip_port=$(echo $server | cut -d'@' -f2)
        ip=$(echo $ip_port | cut -d':' -f1)
        port=$(echo $ip_port | cut -d':' -f2)
        port=${port:-22}  # 默认SSH端口22
        
        echo "正在修改 $user@$ip:$port 的密码..."
        
        # 使用sshpass登录并修改密码
        sshpass -p "$old_password" ssh -o StrictHostKeyChecking=no -p $port $user@$ip \
        "echo -e '$old_password\n$new_password\n$new_password' | passwd"
        
        # 测试新密码
        sshpass -p "$new_password" ssh -o StrictHostKeyChecking=no -p $port $user@$ip \
        "echo '密码修改成功!'"
        
        echo "$user@$ip:$port 密码修改完成"
        echo "------------------------------------"
    done < servers.txt


    二、parallel-ssh使用

    1、确保本地机器已安装parallel-ssh工具

    apt install pssh  # Ubuntu/Debian
    yum install pssh  # CentOS/RHEL
    
    # 手动编译安装
    # 下载源码
    wget https://github.com/lilydjwg/pssh/archive/refs/tags/v2.3.1.tar.gz
    tar xvf v2.3.1.tar.gz
    cd pssh-2.3.1
    
    # 安装依赖和编译
    apt install python3-setuptools
    python3 setup.py install

    2、parallel-ssh基本语法及使用

    parallel-ssh [选项] -H "主机1 主机2 ..." -i "要执行的命令"

    核心参数说明

    参数 作用
    -H 指定主机列表(用空格分隔),如 -H "user@host1 user@host2"
    -h 从文件读取主机列表(每行一个主机),如 -h hosts.txt
    -i 实时显示命令输出(交互模式)
    -l 指定远程主机的用户名,如 -l root
    -A 手动输入SSH密码(默认使用密钥认证)
    -p 并发连接数(默认32),如 -p 10
    -t SSH超时时间(秒),如 -t 15
    -o 将输出保存到指定目录(每主机一个文件),如 -o /tmp/output
    -O 指定SSH配置选项(如 -O StrictHostKeyChecking=no 跳过主机密钥检查)
    -x 传递额外的SSH参数,如 -x "-o ConnectTimeout=5","-p 2222"
    -v 显示详细错误信息

    相关工具

    • parallel-scp:批量上传文件到多台主机。

    • parallel-rsync:使用rsync协议批量同步文件。

    • parallel-slurp:从多台主机下载文件。

    • parallel-nuke:批量终止远程进程。

    批量配置SSH免密登录

    步骤1:生成SSH密钥对(控制机)

    若尚未生成密钥,执行:

    ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
    • -N "":设置空密码(根据需求可选是否加密密钥)。

    • 生成的密钥对:~/.ssh/id_rsa(私钥)和 ~/.ssh/id_rsa.pub(公钥)。

    步骤2:创建主机列表文件

    将目标主机 IP 或域名写入文件 hosts.txt,每行一个:

    echo -e "192.168.1.101\n192.168.1.102\n192.168.1.103" > hosts.txt
    或者
    seq -f "192.168.1.%01g" 101 103 > hosts.txt

    步骤3:批量推送公钥

    使用 parallel-ssh 或 parallel-scp 结合命令完成公钥分发:

    方法1:直接追加公钥到目标主机
    # 使用 pssh 执行远程命令(需输入密码)
    parallel-ssh -h hosts.txt -l <用户名> -A -i \
    "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo $(cat ~/.ssh/id_rsa.pub) >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
    • -l <用户名>:替换为目标主机的 SSH 用户名。

    • -A:提示手动输入密码(所有主机密码需相同)。

    • 命令分解:

      • mkdir -p ~/.ssh:创建目录(若不存在)。

      • chmod 700 ~/.ssh:设置目录权限。

      • echo 公钥内容 >> ~/.ssh/authorized_keys:追加公钥。

      • chmod 600 ~/.ssh/authorized_keys:设置文件权限。

    方法2:通过临时文件上传(更安全)
    # 1. 将公钥复制到临时文件
    cat ~/.ssh/id_rsa.pub > /tmp/my_key.pub
    
    # 2. 上传公钥文件到目标主机
    parallel-scp -h hosts.txt -l <用户名> -A /tmp/my_key.pub /tmp/
    
    # 3. 追加公钥到 authorized_keys 并修复权限
    parallel-ssh -h hosts.txt -l <用户名> -A -i \
    "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat /tmp/my_key.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && rm /tmp/my_key.pub"

    步骤4:验证免密登录

    # 随机挑选一台主机测试
    parallel-ssh -h hosts.txt -l <用户名> -i "hostname"
    ln -s /usr/bin/paraller-ssh /usr/local/bin/pssh
    pssh -h hosts.txt -i "ifconfig eth0 | grep netmask | awk '{print \$2;system(\"cat /etc/hostname\")}' | xargs"

    若无需输入密码且返回主机名,则配置成功!

    批量配置SSH免密登录

    将以下脚本保存为 auto_ssh_keys.sh,替换 <用户名> 并赋予执行权限:

    #!/bin/bash
    USER="<用户名>"  # 替换为目标主机的用户名
    HOSTS_FILE="hosts.txt"
    
    # 生成密钥对(若不存在)
    if [ ! -f ~/.ssh/id_rsa.pub ]; then
      ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
    fi
    
    # 分发公钥
    cat ~/.ssh/id_rsa.pub > /tmp/ssh_temp.pub
    parallel-scp -h $HOSTS_FILE -l $USER -A /tmp/ssh_temp.pub /tmp/
    parallel-ssh -h $HOSTS_FILE -l $USER -A -i \
      "mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
       cat /tmp/ssh_temp.pub >> ~/.ssh/authorized_keys && \
       chmod 600 ~/.ssh/authorized_keys && \
       rm /tmp/ssh_temp.pub"
    
    # 清理临时文件
    rm /tmp/ssh_temp.pub
    
    # 验证
    echo "验证免密登录:"
    parallel-ssh -h $HOSTS_FILE -l $USER -i "echo 'SSH免密配置成功!'"

    批量修改服务器密码

    #!/bin/bash
    HOSTS_FILE="hosts.txt"
    GPG_PASSPHRASE="YourGPGPassphrase"  # 替换为你的GPG密码
    
    # 生成随机密码函数
    generate_password() {
      tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | head -c 16
    }
    
    # 修改密码并记录
    while read host; do
      USER=$(whoami)  # 或从hosts.txt解析用户名
      NEW_PASS=$(generate_password)
      echo "修改 $host 的密码..."
      
      # 执行修改(需sudo权限)
      parallel-ssh -H "$host" -i \
        "echo '$USER:$NEW_PASS' | sudo chpasswd" && \
        echo "$host:$USER:$NEW_PASS" >> /tmp/temp_passwords.txt
      
      # 检查是否成功
      if [ $? -eq 0 ]; then
        echo "[SUCCESS] $host 密码已更新"
      else
        echo "[FAILED] $host 密码修改失败"
      fi
    done < "$HOSTS_FILE"
    
    # 加密存储密码文件
    gpg -c --batch --passphrase "$GPG_PASSPHRASE" /tmp/temp_passwords.txt && \
    mv /tmp/temp_passwords.txt.gpg ./server_passwords.gpg && \
    rm /tmp/temp_passwords.txt
    
    echo "所有主机密码已更新,加密文件:server_passwords.gpg"

    gpg加解密使用:

    • -d:解密模式。

    • -o:指定输出文件名。

    • --batch:非交互式(避免提示)。

    • --passphrase:直接提供密码(安全性较低,仅用于测试)。

    # 加解密
    echo "新密码: 111111" | gpg -c --batch --passphrase "123456" > passwords.gpg
    gpg -o decrypted_file.txt --decrypt passwords.gpg
    
    
    # 解密后自动处理内容
    gpg --batch --passphrase "YourGPGPassphrase" -d passwords.gpg | while read -r line; do
      host=$(echo "$line" | cut -d':' -f1)
      user=$(echo "$line" | cut -d':' -f2)
      pass=$(echo "$line" | cut -d':' -f3)
      echo "主机 $host 的用户 $user 密码已提取"
    done

    三、ansible使用

    批量配置SSH免密登录及修改服务器密码

    1. 准备工作

    首先确保:

    • 已安装Ansible

    • 所有目标机器可以通过SSH访问(使用密码或现有密钥)

    • 有一个inventory文件列出所有目标机器

    示例inventory文件 (hosts.ini):

    [servers]
    server1 ansible_host=192.168.1.101
    server2 ansible_host=192.168.1.102
    server3 ansible_host=192.168.1.103
    
    [servers:vars]
    ansible_user=admin
    ansible_ssh_pass=oldpassword  # 或者使用现有的SSH密钥

    2. 创建Ansible playbook

    创建 setup_ssh_trust.yml 文件:

    ---
    - name: Setup SSH mutual trust and change user password
      hosts: servers
      become: yes
      vars:
        # 定义变量
        new_password: "NewSecurePassword123!"  # 要设置的新密码
        ssh_key_path: "/home/{{ ansible_user }}/.ssh/id_rsa"
        ssh_pubkey_path: "{{ ssh_key_path }}.pub"
        authorized_keys_path: "/home/{{ ansible_user }}/.ssh/authorized_keys"
    
      tasks:
        # 任务1: 确保openssh-client已安装
        - name: Ensure openssh-client is installed
          apt:
            name: openssh-client
            state: present
          when: ansible_os_family == 'Debian'
    
        - name: Ensure openssh-clients is installed (RedHat)
          yum:
            name: openssh-clients
            state: present
          when: ansible_os_family == 'RedHat'
    
        # 任务2: 生成SSH密钥对(如果不存在)
        - name: Generate SSH key pair if not exists
          become_user: "{{ ansible_user }}"
          community.crypto.openssh_keypair:
            path: "{{ ssh_key_path }}"
            type: rsa
            size: 2048
            force: no  # 不覆盖现有密钥
    
        # 任务3: 收集所有主机的公钥
        - name: Gather public keys from all hosts
          run_once: yes
          delegate_to: localhost
          block:
            - name: Create temp directory for keys
              tempfile:
                state: directory
                suffix: ansible_ssh_keys
              register: keys_tempdir
    
            - name: Fetch public keys from all hosts
              fetch:
                src: "{{ ssh_pubkey_path }}"
                dest: "{{ keys_tempdir.path }}/{{ inventory_hostname }}.pub"
                flat: yes
              delegate_to: "{{ item }}"
              loop: "{{ groups['servers'] }}"
    
        # 任务4: 创建包含所有主机公钥的authorized_keys文件
        - name: Create combined authorized_keys file
          run_once: yes
          delegate_to: localhost
          vars:
            combined_keys_path: "{{ keys_tempdir.path }}/authorized_keys_combined"
          block:
            - name: Combine all public keys
              assemble:
                src: "{{ keys_tempdir.path }}"
                dest: "{{ combined_keys_path }}"
                regexp: ".*\.pub$"
    
        # 任务5: 分发组合的authorized_keys文件到所有主机
        - name: Distribute authorized_keys to all hosts
          copy:
            src: "{{ combined_keys_path }}"
            dest: "{{ authorized_keys_path }}"
            owner: "{{ ansible_user }}"
            group: "{{ ansible_user }}"
            mode: '0600'
          delegate_to: localhost
          run_once: yes
          become: no
    
        - name: Push authorized_keys to each host
          copy:
            content: "{{ lookup('file', combined_keys_path) }}"
            dest: "{{ authorized_keys_path }}"
            owner: "{{ ansible_user }}"
            group: "{{ ansible_user }}"
            mode: '0600'
          become: yes
          become_user: "{{ ansible_user }}"
    
        # 任务6: 确保SSH目录权限正确
        - name: Ensure .ssh directory permissions
          file:
            path: "/home/{{ ansible_user }}/.ssh"
            state: directory
            owner: "{{ ansible_user }}"
            group: "{{ ansible_user }}"
            mode: '0700'
    
        # 任务7: 修改用户密码
        - name: Change user password
          user:
            name: "{{ ansible_user }}"
            password: "{{ new_password | password_hash('sha512') }}"
            update_password: always

    3. 执行Playbook

    运行以下命令执行配置:

    ansible-playbook -i hosts.ini setup_ssh_trust.yml

    4. 验证SSH互信

    执行完成后,可以验证任意两台机器之间是否可以实现SSH免密登录:

    ansible all -i hosts.ini -m ping

    或者手动测试:

    ssh admin@server1 hostname

    5. 可选:更安全的密码管理

    为了更安全地管理密码,建议:

    1. 使用Ansible Vault加密密码

    2. 创建vault加密的变量文件

    创建加密的变量文件:

    ansible-vault create vars/secrets.yml

    内容示例:

    new_password: "NewSecurePassword123!"

    然后修改playbook,移除vars部分,改为:

    vars_files:
      - vars/secrets.yml

    然后使用以下命令运行playbook:

    ansible-playbook -i hosts.ini setup_ssh_trust.yml --ask-vault-pass

    其它操作

    # ssh互信
    ansible ssh-host -m authorized_key -a "user=root state=present key=\"{{ lookup('file', '/root/.ssh/id_rsa.pub') }} \"" -k
    
    ---
      - hosts: ssh-host
        user: root
        tasks:
         - name: sshkey-copy
           authorized_key: user=root key="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
           
    - hosts: group_name
      tasks:
        - name: Enable SSH passwordless login
          authorized_key:
            user: user
            state: present
            key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
            
    # 修改密码并配置sudoer
    - hosts: '{{ host_list }}'
      gather_facts: false
      vars:
        user: anzhihe
        password: "an39DWP6ZDwC."  #python -c 'import crypt;print(crypt.crypt("anzhihe@2025","anzhihe"))'
      tasks:
        - name: adduser for anzhihe
          user: name={{ user }} comment="add debug user:anzhihe" password={{ password }}
        - name: Config /etc/sudoers
          lineinfile: dest=/etc/sudoers state=present line='{{ item }}' validate='visudo -cf %s'
          with_items:
                 - "{{ user }} ALL=(ALL) NOPASSWD: ALL"
                 - "Defaults: {{ user }}  !requiretty"
    
          - name: check user
            shell: id anzhihe && grep anzhihe /etc/sudoers
          #ignore_errors: True
          
        - name: copy sudo file to remote host
          copy: src=/scripts/sudofile dest=/tmp/sudofile
        - name: attach sudofile to /etc/sudoers
          shell: cat /tmp/sudofile >> /etc/sudoers 
          
    # 批量修改不同用户密码
    ---
      - hosts: ssh-host
        gather_facts: false
        tasks:
        - name: change user passwd
          user: name={{ item.name }} password={{ item.chpass | password_hash('sha512') }}  update_password=always
          with_items:
               - { name: 'root', chpass: 'kevin@123' }
               - { name: 'app', chpass: 'bjop123' }
               
    # 指定主机修改用户密码
    # 需要注意脚本中"ens192"是客户机ip所在的网卡设备名称, 这个要根据自己实际环境去配置, 比如eth0, eth1等
    - hosts: test-host
      remote_user: root
      tasks:
      - name: change password for root
        shell: echo '{{ item.password }}' |passwd --stdin root
        when: ansible_ens192.ipv4.address  == '{{ item.ip }}'
        with_items:
         - { ip: "172.16.60.220", password: 'haha@123' }
         - { ip: "172.16.60.221", password: 'kevin@123' }
         - { ip: "172.16.60.222", password: 'bobo@123' }

    注意事项

    1. 敏感信息及密码策略

    • 永远不要将密码明文存储在脚本或历史记录中

    • 使用密码管理器或加密配置文件

    • 考虑使用ansible-vault等工具加密敏感数据

    • 服务器列表文件包含明文密码,处理完毕后应立即删除

    • 确保新密码符合安全策略(如包含特殊字符、长度≥12)

    • 定期更换密码

  • 最小权限原则要求

    • .ssh 目录权限必须为 700

    • authorized_keys 文件权限必须为 600

    • 不要使用root账户,除非绝对必要,为服务创建专用账户

    • 记录所有批量操作,定期检查服务器登录日志

    • 目标主机用户必须有 sudo 权限且配置了免密码sudo:

      # 在目标主机上执行:
      echo "$(whoami) ALL=(ALL) NOPASSWD: /usr/bin/chpasswd" | sudo tee /etc/sudoers.d/password_change
  • 网络隔离

    • 操作期间确保网络环境安全(防止密码被截获)

    • 确保所有目标主机 SSH 端口开放(默认22)

    • 首次连接需接受主机密钥时,添加 -O StrictHostKeyChecking=no


    参考:

    AI领域核心术语技术总览表

    2025-07-11 01:12:03

    分类 术语 基础概述 关键技术 发展历程 应用场景
    基础概念 AI(Artificial Intelligence)人工智能 模拟人类智能的计算机系统,执行学习、推理、决策等任务,用于模拟、扩展和增强人类智能的技术工具和方法

    符号主义(规则系统)、连接主义(神经网络)、行为主义(环境交互),

    生成式AI、自然语言处理(NLP)、Transformer模型、BERT、PEFT微调方法及大语言模型(LLM)等

    1956年达特茅斯会议提出;

    2012年深度学习爆发;

    2022年生成式AI革命

    自动驾驶、医疗诊断、智能客服、内容创作辅助、人机协作
    ML(Machine  Learning)机器学习 利用数据进行学习的技术,从数据中学习规律,使计算机能够通过算法模型从数据中获取特征并不断优化模型以做出决策和预测,无需显式编程即可改进其性能

    监督学习(分类/回归)、无监督学习(聚类)、强化学习(奖励机制)

    机器学习的核心技术包括算法原理,涉及模型训练、特征工程、模型部署等流程,同时涵盖损失函数、正则化项等策略,以实现有效的模型评估与选择。

    1958年感知机诞生;

    1986年BP算法;

    2012年ImageNet竞赛突破

    金融风控、推荐系统、图像识别
    DL(Deep  Learning)深度学习 基于多层神经网络的复杂模式学习,利用多层神经网络处理复杂数据模式的机器学习技术,通过模拟人脑神经网络进行学习和识别的机器学习方法 CNN(图像处理)、RNN/LSTM(时序数据)、Transformer(自注意力机制)

    2012年AlexNet夺冠;

    2014年GAN;

    2015年ResNet

    AlphaGo、语音识别、图像处理、自然语言理解
    RL(Reinforcement Learning)强化学习 通过环境反馈(奖励/惩罚)优化决策策略,是一种优化整个决策过程以最大化累积收益的算法领域,重点关注决策之间的相互影响

    Q-learning和Sarsa、策略梯度、深度强化学习(DQN)

    强化学习的核心要素包括智能体、环境、状态、观测、动作、奖励和策略,它们共同决定了智能体如何通过与环境的交互来最大化累积奖励。

    1997年IBM深蓝;

    2016年AlphaGo;

    2025年工业机器人自主决策

    游戏AI、机器人控制、游戏对抗、资源调度
    模型技术 LLM(Large Language Model)大语言模型 超大规模神经网络,通过海量文本训练掌握语言规律,具备模拟人类语言理解和生成的能力 变压器架构(Transformer)、注意力机制、位置编码、预训练与微调

    2018年BERT;

    2020年GPT-3;

    2023年GPT-4多模态融合

    ChatGPT、文心一言、代码生成
    推理模型 结合逻辑规则与数据驱动的决策系统,专注于多步推理任务的模型,旨在增强人工智能的问题解决能力 神经符号融合、知识图谱集成、动态计算分配 2024年通义千问3推出"混合推理"(快思考+慢思考) 法律咨询、医疗诊断、金融预测
    多模态模型 融合文本、图像、音频等多种输入/输出形式的AI模型和技术 跨模态对齐、联合表示学习、多模态生成、协同学习

    2023年GPT-4V;

    2024年谷歌Gemini;

    2025年Sora视频生成

    视频内容创作、跨媒体搜索、智能硬件交互、图像建模
    训练优化 预训练 通过在大规模未标注数据上进行训练,使模型能够学习到通用的语言模式和特征表示 掩码语言建模(MLM)、自监督学习、万亿级token处理 2018年BERT开启预训练时代;
    2023年千亿参数成为常态
    模型初始能力构建、迁移学习基础、推荐系统
    模型微调 在预训练模型上使用领域数据适配特定任务,通常涉及数据集准备、模型训练和效果评估等步骤,相比提示词调优,它更为复杂且资源需求大 指令微调(Instruction Tuning)、LoRA(低秩适配)、P-tuning v2参数高效微调技术 2020年后成为LLM落地标准流程;
    2024年高效微调技术普及
    行业知识问答、专业文档分析、图像生成与编辑
    模型剪枝 用于减少神经网络的大小和计算复杂度,通过删除不重要的权重或神经元来简化模型结构 结构化剪枝(通道/层移除)、非结构化剪枝(权重归零)、知识蒸馏结合剪枝 2015年首次应用于CNN;
    2024年移动端模型压缩关键技
    大规模语言模型压缩、手机端部署(如荣耀Magic V5搭载通义千问3)
    蒸馏 通过将大型模型的知识和技能传递给小型模型,以提高小型模型的性能和效率,用小模型模仿大模型行为以降低推理成本 知识迁移、软标签学习、输出分布匹配
    白盒蒸馏、多教师蒸馏、自蒸馏
    2015年Hinton提出知识蒸馏概念;
    2024年开源小模型(DeepSeek-V3)的核心技术
    大模型蒸馏、边缘计算、实时推理场景
    数据标注 为训练数据添加标签以指导模型学习,是人工智能开发中的关键环节,涉及对原始数据进行标记和处理,以便机器学习算法能够理解和分析。这一过程通过添加标签、框选、涂色、转写等多种操作,确保数据集的质量和准确性 主动学习、手工标、半自动标注、自动化标注、众包质量控制 1992年LDC建立首个标注库;
    2025年AI辅助标注效率提升10倍
    自动驾驶数据集(图像标框)、医疗影像标注
    应用组件 RAG(Retrieval-Augmented Generation)检索增强生成 通过结合检索和生成模型,利用向量数据库存储和检索文档段落,增强大模型的回答能力,使其能够基于最新数据和文档内容准确回复用户问题,减少幻觉 向量检索、上下文融合、多轮迭代查询、外部知识库、生成框架 2020年Naive RAG;
    2024年Modular RAG(模块化解耦)
    专业问答(医疗/法律)、客服知识库更新、智能问答系统
    Prompt(提示词) 用于定义任务指令、提供输入内容并设定输出要求的关键元素,通过角色扮演、分隔符使用等技巧优化输出,引导AI模型生成特定的回答或执行特定任务。Prompt可以让AI更准确地理解你的需求,从而给出更有用的回答 角色设定、Few-shot Prompting、Chain-of-Thought Prompting及Prompt Chaining 从GPT-1线性指令→2023年混合提示策略(角色+约束+示例) 高效生成报告、创作诗歌、优化代码
    NLP(Natural Language Processing)自然语言处理 使计算机能够理解、解释和生成人类语言的技术 词嵌入、依存句法分析、语义词法分析、情感计算、语言模型 1950s规则驱动→2013年神经NLP→2025年神经符号融合 聊天机器人、虚拟助手、机器翻译、情感分析、智能写作
    AIGC(AI Generated Content)生成式人工智能 人工智能自动生成高质量的文本、图像、音视频等内容 GAN、扩散模型、自回归生成,embedding、one-hot编码、词袋模型、词嵌入模型、CLIP模型和DDPM,生成式AI、分析型AI、认知型AI,内容质量评估 2014年GAN诞生;
    2022年Stable Diffusion;
    2025年多模态AIGC爆发
    虚拟偶像(初音未来)、新闻自动撰稿、影视特效、AI绘图、智能UI
    AI Agent(智能体) 具有自主感知规划、决策和执行任务的AI系统,通过学习与进化,能够完成复杂的任务 大规模预训练模型支持、记忆与认知机制、工具调用(Tool Use)、多智能体协作 2023年AutoGPT;
    2025年钉钉AI表格(单元格即智能入口)
    智能客服、业务流程自动化、个人办公助手、日常任务助手
    工作流编排 将多个AI任务组合为自动化流程,通过将一系列任务或步骤有序连接,确保业务高效流畅地执行 DAG调度、异常处理、人机协同介入 2024年LangChain流行;
    2025年钉钉AI工作流引擎
    电商达人管理、跨部门审批流程、IT系统集成、制造业生产调度
    应用系统 DeepSeek 中国领先的AI公司,专注于大型语言模型(LLM)和多模态模型的研发 MoE架构、小模型优化、长上下文支持 2024年发布R1;
    2025年V3推理成本降1000倍
    企业私有化部署、学术研究、金融健康、医疗健康、电商推荐
    通义千问 阿里云开发的大规模预训练语言模型,旨在提供先进的自然语言处理和多模态处理能力 混合推理(快/慢思考)、多语言支持(119种) 2023年开源;
    2025年千问3性能超越Llama 3
    智能客服、内容生成、编程辅助、高德地图智能导航
    ChatGPT OpenAI开发的对话式生成预训练Transformer模型,其核心目标是通过自然语言交互完成复杂任务。让"ChatGPT=智能"成为全球用户心智共识。 Transformer架构、RLHF(人类反馈强化学习)、指令微调(Instruction Tuning)、多模态扩展 2018:GPT-1诞生,1.17亿参数,验证Transformer有效性;

    2020:GPT-3(1750亿参数)支持零样本学习,API开放引爆开发者生态;

    2025.2:GPT-5上线,强化复杂推理与工具调用

    反欺诈系统、编程辅助、办公自动化、超级助手

    参考: