博客

  • flask-bt之tracker录入

    templates\trackers_index.html

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>trackers</title>
    </head>
    <body>
        {% if session.logged_in %}
        <form action="/logout" method="get">
            <input type="submit" value="登出">
        </form>
        {% else %}
        <form action="/login" method="post">
            <input type="text" name="username" placeholder="用户名">
            <input type="password" name="password" id="password" placeholder="密码">
            <input type="submit" value="登录">
        </form>
        {% endif %}
        <main>
            <!-- flask的flash函数专用固定代码 专门用来显示内容的 -->
            {% for message in get_flashed_messages() %}         
                <div class="alert">{{ message }}</div>     
            {% endfor %}
        </main>
        <p>tracker总数量:{{count}}</p>
        <form action="/trackers_search" method="post">
            <input type="text" name="trackers_name" placeholder="请输入tracker关键字">
            <input type="submit" value="搜索">
        </form>
        {% if session.logged_in %}
        <!-- 登录表单,实际上用户已经登录,所以可以显示欢迎信息或其他内容 -->
        <form action="/trackers_add" method="post">
            <label for="trackers_name">trackers_add:</label>
            <input type="text" name="trackers_name" placeholder="请输入完整的tracker链接">
            <input type="submit" value="提交">
        </form>
        <form action="/trackers_delete" method="post">
            <label for="trackers_name">trackers_delete:</label>
            <input type="text" name="trackers_name" placeholder="请输入完整的tracker链接">
            <input type="submit" value="删除">
        </form>
        {% endif %}
    
        <hr>
        <div class="tracker_box scrollable-div">
            <form action="/get_trackers_as_text" method="get">
                <input type="submit" value="去复制,请使用Ctrl+A和Ctrl+C复制">
            </form>
            {% for i in trackers %}
            <ul style="list-style-type: none">
                <li>{{i.name}}</li>
            </ul>
            {% endfor %}
        </div>
    </body>
    </html>
    <style>
        * {
            margin:0;
            padding:0;
        }
        .scrollable-div {
            height: 800px; /* 或者你需要的高度 */
            overflow-y: auto; /* 内容超出时在 y 轴方向显示滚动条 */
            overflow-x: auto; /* 内容超出时在 x 轴方向显示滚动条 */
        }
    </style>

     

    app.py

    from flask import Flask, request, render_template, redirect, url_for, flash, session
    from flask_sqlalchemy import SQLAlchemy
    import os
    from datetime import datetime
    from flask_cors import CORS
    import secrets
    '''
    待实现:
    flash错误提示显示红色,警告信息显示黄色,成功显示绿色,使用div画出来
    '''
    
    app = Flask(__name__)
    # 为整个应用启用 CORS
    CORS(app)
    # 启用 CORS 并设置特定的域名
    #CORS(app, resources={r"/some_route": {"origins": "http://example.com"}})
    
    # 或者,允许所有域名访问所有路由
    CORS(app, resources={r"*": {"origins": "*"}})
    
    # 获取当前文件的路径
    basedir = os.path.abspath(os.path.dirname(__file__))
    # 设置数据库文件的路径为当前目录下的 data.db
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.db')
    #app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////data.db'
    
    app.secret_key = secrets.token_urlsafe()  # 用于保持会话安全,字符串随机即可
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False#模型修改的跟踪
    db = SQLAlchemy(app)
    
    class Trackers(db.Model):
       __tablename__= 'trackers'
       id = db.Column(db.Integer, unique=True, comment='id')
       name = db.Column(db.String(64), primary_key=True, comment='Trackers,主键')
       is_usable = db.Column(db.String(64), unique=False, comment='Tracker是否可用')
       create_date = db.Column(db.DateTime, unique=False, default=datetime.now(), comment='Tracker创建日期')
       update_date = db.Column(db.DateTime, unique=False, comment='Tracker更新日期')
       def __repr__(self):
          return '<Trackers %r>' % self.name
    
    def create_tables():
        with app.app_context():
            db.create_all()
    
    
    @app.route('/')
    @app.route('/trackers_index')
    def trackers_index():
        trackers = Trackers.query.order_by(Trackers.create_date.desc()).all()#倒序输出所有
        count = Trackers.query.count()#tracker总数量
        return render_template('trackers_index.html', trackers=trackers, count=count)
    
    
    @app.route('/get_trackers_as_text')
    def get_trackers_as_text():
        trackers = Trackers.query.all()
        lines = [f"{tracker.name}" for tracker in trackers]
        text = "<br>".join(lines)
        return text
    
    
    @app.route('/trackers_add', methods=['POST'], endpoint='add_announcement')
    def announcement_add():
        trackers_name = request.form['trackers_name']
        # 关键词列表
        keywords = ['announce', 'http', 'udp', 'https', 'wss']
        # 检查字符串是否包含列表中的任意关键词
        if contains_keywords(trackers_name, keywords) or trackers_name.endswith('announce'):
            print("提交信息中包含关键字")
        else:
            flash("你提交的可能不是tracker链接")
            return redirect(url_for('trackers_index'))
        exists = Trackers.query.filter_by(name=trackers_name).first() is not None
        if exists:
            flash('tracker 已经存在.')
        else:
            flash('tracker 不存在,已插入.')
            new_tracker = Trackers(name=trackers_name)
            db.session.add(new_tracker)
            db.session.commit()
        return redirect(url_for('trackers_index'))
    
    def contains_keywords(s, keywords):
        return any(keyword in s for keyword in keywords)
    
    @app.route('/trackers_delete/<int:trackers_name>', methods=['POST'], endpoint='delete_announcement_specific')
    def delete_announcement_specific(trackers_name):
        data = Trackers.query.filter_by(name=trackers_name).first()
        if data:
            db.session.delete(data)
            db.session.commit()
            flash(f'【{data}】已删除')
            return redirect(url_for('trackers_index'))
        else:
            return 'Tracker not found'
    
    @app.route('/trackers_delete', methods=['POST'], endpoint='delete_announcement')
    def delete_announcement():
        trackers_name = request.form.get('trackers_name') or request.view_args.get('trackers_name')
        if not trackers_name:
            return '什么都没输入,你删除啥呢!!!'
        data = Trackers.query.filter_by(name=trackers_name).first()
        if data:
            db.session.delete(data)
            db.session.commit()
            flash(f'{data}已删除')
            return redirect(url_for('trackers_index'))
        else:
            return f'数据库中不存在该数据!!!{trackers_name}'
        
    
    @app.route('/trackers_update/<int:trackers_name>', methods=['POST'], endpoint='update_announcement')
    def announcement_update(trackers_name):
        data = Trackers.query.filter_by(name=trackers_name).first()
        if data:
            data.name = request.form.get('name')
            data.is_usable = request.form.get('description')
            db.session.commit()
            flash('Data has been updated successfully.', 'success')
        else:
            flash('Data not found.', 'error')
        return redirect(url_for('trackers_index'))
    
    
    @app.route('/trackers_search', methods=['GET', 'POST'])
    def announcement_search():
        if request.method == 'POST':
            trackers_name = request.form.get('trackers_name')
            trackers = Trackers.query.filter(Trackers.name.like(f'%{trackers_name}%')).all()
            return render_template('trackers_index.html', trackers=trackers)
        return render_template('trackers_index.html')
    
    
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'POST':
            username = request.form['username']
            password = request.form['password']
            if username == 'admin' and password == 'admin':
                session['logged_in'] = True
                session['username'] = username
                flash("登陆成功")
                return redirect(url_for('trackers_index'))
            else:
                return '无效的用户名或密码'
        return redirect(url_for('trackers_index'))
    
    
    @app.route('/logout', methods=['GET', 'POST'])
    def logout():
        session.pop('logged_in', None)
        session.pop('username', None)
        return redirect(url_for('trackers_index'))
    
    
    if __name__ == '__main__':
        # 创建数据库
        create_tables()
        app.run(debug=True, host='0.0.0.0', port=5000)

     

  • certbot自动续签脚本学习

    暂时没写完,以后有时间再写。也算是学习了一下linux的shell脚本了。使用的Centos7系统的bash版本信息如下:

    GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
    Copyright (C) 2011 Free Software Foundation, Inc.
    许可证 GPLv3+: GNU GPL 许可证版本3或者更高 <http://gnu.org/licenses/gpl.html>
    
    这是自由软件,您可以自由地更改和重新发布。
    在法律允许的范围内没有担保.

     

    现在已经写了日期判断。

    往后要写的内容是:关闭网站的nginx,然后执行续签的命令,但是现在想不到如何进行续签自动化,因为现在使用的txt解析记录的方式续签的,解析记录需要到域名服务商网站登录这一步很难搞定。

    #!/bin/bash
    
    # 证书文件路径
    CERT_PATH="/etc/letsencrypt/live/kuyour.top/fullchain.pem"
    
    # 获取证书到期日期
    NOT_AFTER=$(openssl x509 -in "$CERT_PATH" -text -noout | grep "Not After" | sed 's/^[ \t]*//;s/[ \t]*$//')
    echo "证书到期时间:"$NOT_AFTER
    
    due_date=$(date -d "${NOT_AFTER:12:20}" +%s)
    #echo $due_date
    
    # 获取当前时间的时间戳
    current_timestamp=$(date +%s)
    #echo $current_timestamp
    
    # 计算时间差
    time_difference=$(($due_date-$current_timestamp))
    days_remaining=$(($time_difference/60/60/24))
    echo "当前距离证书到期的剩余天数:"$days_remaining
    
    echo  $(($days_remaining == 1))
    echo $((1==1))
    
    # 检查剩余天数是否等于1
    if [ $days_remaining -eq 1 ]; then
        echo "剩余天数等于1,执行某些指令"
        # 在这里放置你想要执行的指令
    else
        echo "剩余天数不等于1,不执行指令"
    fi

     

  • bash脚本学习

    date -d 命令可以把类似这样的日期时间转换成时间戳”Jan 28 16:47:16 2025″,它会计算自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。

    命令如下:

    date -d "Jan 28 16:47:16 2025" +%s

    请严格按照这种格式进行填写,双引号后面有一个空格不能省略。

    如果想要把这个日期变成可替换的,可以把整个命令使用小括号括起来,前面加上$符号,例如:

    NOT_AFTER="Jan 28 16:47:16 2025"
    timestamp=$(date -d "$NOT_AFTER" +%s)
    echo $timestamp

    以上代码有几点需要注意:

    • bash脚本不兴有多余的空格,变量声明(变量的创建)时,等号两边不允许有空格。
    • 获取变量要在变量名的前面加$符号。
    • 如果整个命令执行的值要赋值给另一个变量(不管是新的变量还是旧的变量),可以把整个命令使用小括号括起来,然后前面加一个$符号就行。

     

    字符串转数字,使用$(( ))把内容括起来,里面的内容会被自动识别为数值计算逻辑运算,注意是双括号,且都是小括号。例如:

    NOT_AFTER="Jan 28 16:47:16 2025"
    timestamp=$(date -d "$NOT_AFTER" +%s)
    days_remaining=$(($timestamp/60/60/24))
    echo $days_remaining

     

    逻辑表达式

    bash脚本的逻辑表达式中,字符串比较通常使用==!= ,数值比较通常使用 -eq (等于)和 -ne(不等于),这是因为 Bash 从 Unix shell 继承了这些比较运算符,而 Unix shell 中并没有为整数比较提供 ==!= 运算符。

    以下是 Bash 中字符串和整数比较的区别:

    • 字符串比较:

      if [ "$string1" == "$string2" ]; then
          echo "字符串相等"
      fi
      
      if [ "$string1" != "$string2" ]; then
          echo "字符串不相等"
      fi
    • 整数比较:

      if [ "$int1" -eq "$int2" ]; then
          echo "整数相等"
      fi
      
      if [ "$int1" -ne "$int2" ]; then
          echo "整数不相等"
      fi

    如果你尝试使用 == 来比较整数,Bash 会将其视为字符串比较,这可能会导致意外的结果,特别是当整数变量包含前导零或不同的位数时。例如:

    int1=08
    int2=8
    
    if [ "$int1" == "$int2" ]; then
        echo "相等"  # 这会输出“相等”,因为 Bash 将它们视为字符串比较,而 "08" 和 "8" 作为字符串是不相等的。
    fi
    
    if [ "$int1" -eq "$int2" ]; then
        echo "相等"  # 这不会输出任何内容,因为作为整数,08 和 8 是不相等的。
    fi

    因此,为了正确地比较整数,你应该使用 -eq-ne 运算符。

    逻辑表达式中整数比较不加引号也行

    在 Bash 脚本中,是否在条件测试 [ ... ] 中对变量使用引号取决于具体情况。对于整数比较,通常可以不加引号,因为整数变量不包含空格或其他特殊字符,这些字符可能会导致条件测试被错误解析。然而,使用引号是一种更保守的做法,可以防止一些潜在的问题,特别是在变量值未知或可能为空的情况下。

    以下是两种情况的比较:

    使用引号:

    if [ "$int1" -eq "$int2" ]; then
        echo "整数相等"
    fi

    不使用引号:

    if [ $int1 -eq $int2 ]; then
        echo "整数相等"
    fi

    在第二种情况中,如果你的变量 $int1$int2 为空,或者包含空格、特殊字符等,那么条件测试可能会出错。例如:

    int1=""
    int2=5
    
    if [ $int1 -eq $int2 ]; then
        echo "整数相等"  # 这将导致条件测试语法错误,因为 -eq 两边不能有空的参数。
    fi

    为了避免这类问题,推荐在条件测试中总是使用引号,除非变量的内容是已知的,并且不包含任何可能导致解析错误的字符。使用引号是一种好的编程习惯,可以提高脚本的健壮性和可移植性。

     

    if语句基础

    基本if语句命令判断如果特定条件为true,则仅执行给定的一组操作。如果条件为false,则不要执行这些操作。if语句基本语法格式如下:

    if [ expression ];  
    then  
    statements  
    fi

    仅当表达式(在方括号之间)为真时,才会执行thenfi之间的语句。

    注意:观察第一行中使用的空格,在第一行末尾使用分号。两者都必须使用,if条件语句以fi结尾。

     

    • 使用AND运算符使用多个条件:
      if [ expression_1 ] && [ expression_2 ];  
      then  
      statements  
      fi
      
      Bash
    • 使用OR运算符使用多个条件:
      if [ expression_1 ] || [ expression_2 ];  
      then  
      statements  
      fi
      
      Bash
    • 对于具有AND&OR运算符的复合表达式,可以使用以下语法:
      if [ expression_1 && expression_2 || expression_3 ];  
      then  
      statements  
      fi

    //更多请阅读:https://www.yiibai.com/bash/bash-if-statement.html

    示例1

    在此示例中,读取用户输入任意数字,并检查该值是否大于100

    脚本文件:if-example1.sh

    #!/bin/bash  
    
    read -p " Enter number : " number  
    
    if [ $number -gt 100 ]  
    then  
    echo "Value is greater than 100"  
    fi
    执行上面示例代码,得到以下结果:

    示例2

    在此示例中,通过比较两个字符串的值,简单演示了if语句的用法。
    脚本文件:if-example2.sh

    #!/bin/bash  
    
    # if condition is true  
    if [ "yiibai" == "yiibai" ];  
    then  
    echo "true condition"  
    fi  
    
    # if condition is false  
    if [ "yiibai.com" == "xntutor.com" ];  
    then  
    echo "false condition"  
    fi
    
    Bash

    执行上面示例代码,得到以下结果:

     

    示例3

    在此示例中,演示如何使用if语句比较数字。
    脚本文件:if-example3.sh

    #!/bin/bash  
    
    #if condition (greater than) is true  
    if [ 10 -gt 3 ];  
    then  
    echo "10 is greater than 3."  
    fi  
    
    #if condition (greater than) is false  
    if [ 3 -gt 10 ];  
    then  
    echo "3 is not greater than 10."  
    fi  
    
    #if condition (lesser than) is true  
    if [ 3 -lt 10 ];  
    then  
    echo "3 is less than 10."  
    fi  
    
    #if condition (lesser than) is false  
    if [ 10 -lt 3 ];  
    then  
    echo "10 is not less than 3."  
    fi  
    
    #if condition (equal to) is true  
    if [ 10 -eq 10 ];  
    then  
    echo "10 is equal to 10."  
    fi  
    
    #if condition (equal to) is false  
    if [ 10 -eq 9 ];  
    then  
    echo "10 is not equal to 9"  
    fi
    
    Bash

    执行上面示例代码,得到以下结果:
    示例3

     

    示例4

    在此示例中,将演示如何在if表达式中使用AND运算符包括多个条件。

    脚本文件:if-example4.sh

    #!/bin/bash  
    
    # TRUE && TRUE  
    if [ 8 -gt 6 ] && [ 10 -eq 10 ];  
    then  
    echo "Conditions are true"  
    fi  
    
    # TRUE && FALSE  
    if [ "mylife" == "mylife" ] && [ 3 -gt 10 ];  
    then  
    echo "Conditions are false"  
    fi
    
    Bash

    执行上面示例代码,得到以下结果:

    maxsu@ubuntu:~/bashcode$ vi if-example4.sh
    maxsu@ubuntu:~/bashcode$ chmod +x if-example4.sh
    maxsu@ubuntu:~/bashcode$ ./if-example4.sh 
    Conditions are true
    maxsu@ubuntu:~/bashcode$

     

  • 如何查看我的网站证书有效日期

    以前普通网站好像都不太需要弄ssl证书的,现在搞得啥网站都需要ssl证书了。不然浏览器就给你http链接上弄个“不安全”字样。

     

    使用 OpenSSL 命令:

    打开终端或命令行界面,并运行以下命令:

    openssl x509 -in /path/to/your/certificate.pem -text -noout

    /path/to/your/certificate.pem 替换为您的证书文件的实际路径。

    例如我为我的网站申请的证书自动存放在位/etc/letsencrypt/live/kuyour.top/文件夹里面:

    /etc/letsencrypt/live/kuyour.top/fullchain.pem

    /etc/letsencrypt/live/kuyour.top/privkey.pem

    查询我为我的网站申请的证书有效日期:

    openssl x509 -in /etc/letsencrypt/live/kuyour.top/fullchain.pem -text -noout

    你申请成功后会提示类似下面的文字:

    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at:
       /etc/letsencrypt/live/kuyour.top/fullchain.pem
       Your key file has been saved at:
       /etc/letsencrypt/live/kuyour.top/privkey.pem
       Your certificate will expire on 2025-01-28. To obtain a new or
       tweaked version of this certificate in the future, simply run
       certbot again. To non-interactively renew *all* of your
       certificates, run "certbot renew"
     - If you like Certbot, please consider supporting our work by:
    
       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
       Donating to EFF:                    https://eff.org/donate-le

     

     

  • 更换YUM源为阿里云

    由于CentOS 7的官方支持已于2024年6月30日结束,您可以考虑更换YUM源为阿里云,以解决无法连接到官方仓库的问题。以下是操作步骤:

    1. 备份并修改仓库配置文件
      • 首先,备份您的仓库配置文件:
        cd /etc/yum.repos.d/
        mv CentOS-SCLo-scl.repo CentOS-SCLo-scl.repo.bak
        mv CentOS-SCLo-scl-rh.repo CentOS-SCLo-scl-rh.repo.bak
      • 编辑备份的CentOS-SCLo-scl-rh.repo文件,将mirrorlist=注释掉,并将baseurl=取消注释,更改为阿里云的地址:
        vim CentOS-SCLo-scl-rh.repo.bak

        修改内容如下:

        [centos-sclo-rh]
        name=CentOS-7 - SCLo rh
        baseurl=https://mirrors.aliyun.com/centos/$releasever/SCLo/$basearch/rh
        gpgcheck=1
        enabled=1
        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
    2. 启用仓库并更新缓存
      • 启用仓库:
        yum-config-manager --enable centos-sclo-rh
      • 清理缓存并更新:
        yum clean all
        yum makecache

    解决方案2:手动指定仓库地址

    如果上述方法不适用,您可以尝试手动指定仓库地址。编辑/etc/yum.repos.d/CentOS-SCLo-scl-rh.repo文件,将mirrorlist注释掉,并指定baseurl为阿里云的地址:

    vim /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo

    确保文件内容如下:

    [centos-sclo-rh]
    name=CentOS-7 - SCLo rh
    baseurl=https://mirrors.aliyun.com/centos/$releasever/SCLo/$basearch/rh
    gpgcheck=1
    enabled=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

     

  • centos系统中的mysql系统用户

    如何确认Centos系统中是否存在mysql系统用户?

    如果你想查看名为mysql的Linux用户是否存在于你的CentOS系统中,你可以使用以下命令:

    1. 使用id命令
      id mysql

      这个命令会显示用户mysql的UID(用户ID),如果用户不存在,它会显示一个错误消息。

    2. 使用getent命令
      getent passwd mysql

      这个命令会列出所有名为mysql的系统用户的信息,包括他们的UID、GID(组ID)、家目录和登录shell。如果用户不存在,它会显示一个错误消息。

    3. 使用grep命令
      grep mysql /etc/passwd

      这个命令会在/etc/passwd文件中搜索名为mysql的用户条目。如果用户存在,它会显示该用户的详细信息;如果不存在,它不会显示任何内容。

    这些命令可以帮助你确定名为mysql的Linux用户是否存在于你的系统中。如果这些命令返回了用户的信息,那么这个用户就存在于系统中;如果返回了错误消息或没有任何输出,那么这个用户就不存在。

    如何登录Centos系统中的mysql系统用户?

    如果你想以mysql用户身份登录,你可以使用su(switch user)命令来切换到该用户。以下是具体的步骤:

    1. 使用su命令切换用户
      su - mysql

      这个命令会让你切换到mysql用户。如果你设置了mysql用户的密码,系统会提示你输入密码。

    2. 查看mysql用户的家目录: 在切换到mysql用户之前,你可能想查看该用户的家目录。你可以使用以下命令来查看:
      getent passwd mysql

      这个命令会显示mysql用户的密码文件条目,包括家目录路径。

    3. 使用su命令并指定家目录: 如果你知道mysql用户的家目录,你也可以使用-c选项来指定命令,例如:
      su - mysql -c 'echo $HOME'

      这将切换到mysql用户并打印出其家目录路径。

    请注意,出于安全考虑,mysql用户通常没有登录shell,或者其shell被设置为/sbin/nologin/bin/false,这意味着你不能通过sussh登录。这是为了确保数据库用户不能被用来作为常规用户登录系统,从而减少安全风险。

    如果你尝试切换到mysql用户时遇到问题,可能是因为mysql用户的账户被配置为不允许登录。在这种情况下,你需要检查/etc/passwd文件中mysql用户的条目,查看其shell设置是否允许登录。如果mysql用户的shell设置为/sbin/nologin/bin/false,则不能通过su命令登录。

     

    执行su – mysql提示This account is currently not available.

    确认mysql用户目录是否存在,不存在则创建一个,使用以下命令(如果你已获取root权限,下面的命令去掉sudo):

    sudo mkdir /home/mysql

    设置正确的权限,确保mysql用户的家目录权限设置正确。通常,家目录的权限应该是700(只有所有者有读写执行权限)(如果你已获取root权限,下面的命令去掉sudo)。

    sudo chown mysql:mysql /home/mysql
    sudo chmod 700 /home/mysql

    检查用户配置,看看/etc/passwd文件中mysql用户的配置,确保其家目录和shell设置正确。

    如果mysql用户的shell设置为/sbin/nologin/bin/false,您需要将其更改为一个有效的shell,如/bin/bash,如果您希望mysql用户能够登录。

    请根据您的系统配置和安全需求调整上述建议。如果您不确定如何操作,或者需要进一步的帮助,请咨询系统管理员或安全专家。

    如何修改Centos系统中mysql系统用户密码?

    在Linux系统中,root用户具有足够的权限来更改任何用户的密码,包括mysql用户。以下是步骤:

    打开终端: 打开你的Linux终端。

    使用passwd命令: 使用passwd命令后跟mysql用户名来更改密码。你需要有root权限才能执行此操作。

    su -  # 切换到root用户
    passwd mysql

    或者,如果你已经是root用户,可以直接运行:

    passwd mysql

    系统会提示你输入新的密码,输入后再次输入以确认。

    输入新密码: 当系统提示你输入新密码时,输入你想要的新密码,并在提示确认时再次输入相同的密码。

    请注意,更改系统用户的密码是一个敏感操作,应该谨慎进行。确保你输入的密码足够强大,以防止未经授权的访问。此外,如果你正在更改的是系统关键用户(如mysql)的密码,确保在更改密码后更新任何依赖此密码的服务配置。

    如何查询mysql系统用户是否允许登录?

    要查询mysql用户是否允许SSH登录,你需要查看该用户的账户配置,特别是其家目录和登录shell的设置。以下是具体步骤:

    1. 查看mysql用户的账户信息: 你可以使用getent命令来查看mysql用户的账户信息,包括其家目录和登录shell。
      getent passwd mysql

      如果输出中显示的shell是/sbin/nologin/bin/false,那么mysql用户被禁止SSH登录。如果显示的是其他shell路径(如/bin/bash),则理论上mysql用户可以SSH登录。

    2. 检查mysql用户的家目录: 如果getent命令的输出中家目录不存在或无法访问,那么即使mysql用户的shell设置允许登录,系统也会提示“无法更改到目录”的错误。你可以使用以下命令来检查家目录是否存在:
      ls -ld /home/mysql

      如果目录不存在或无法访问,你需要创建或修复家目录,并确保其权限设置正确(如果你已获取root权限,下面的命令去掉sudo):

      sudo mkdir -p /home/mysql
      sudo chown mysql:mysql /home/mysql
      sudo chmod 700 /home/mysql
    3. 查看SSH配置: 检查SSH配置文件/etc/ssh/sshd_config,确认没有设置阻止mysql用户登录的规则,如DenyUsersAllowUsers指令。
    4. 查看SELinux状态: 如果SELinux启用,它可能会阻止mysql用户SSH登录。你可以使用以下命令查看SELinux的状态:
      getenforce

      如果SELinux是Enforcing状态,你可能需要调整SELinux策略或临时设置SELinux为宽容模式进行测试:

      setenforce 0

    通过上述步骤,你可以确定mysql用户是否被允许SSH登录。如果mysql用户的shell设置为不允许登录,或者家目录不存在,你需要进行相应的配置更改。

    要解决mysql用户被禁止SSH登录的问题,检查mysql用户的shell设置: 使用getent passwd mysql命令查看mysql用户的账户信息,特别是其登录shell。如果显示的shell是/sbin/nologin/bin/false,则mysql用户被禁止SSH登录。你需要更改此设置为一个有效的shell,比如/bin/bash

    如何解锁Centos系统中mysql系统用户?

    如果账户被锁定,你可以使用 usermod 命令来解锁账户(如果你已获取root权限,下面的命令去掉sudo):

    sudo usermod -U 用户名

    如果用户的Shell设置为不允许登录,你可以更改它为一个有效的Shell(如果你已获取root权限,下面的命令去掉sudo):

    sudo usermod -s /bin/bash 用户名

    检查账户过期信息

    使用 chage 命令查看账户的过期信息(如果你已获取root权限,下面的命令去掉sudo):

    sudo chage -l 用户名

    如果账户已过期,你可以使用以下命令重置过期日期(如果你已获取root权限,下面的命令去掉sudo):

    sudo chage -E 99999 用户名

    这将把账户的过期日期设置为 “99999”,实际上意味着账户永不过期。

    请根据实际情况选择合适的解决方案,并确保你有足够的权限来执行这些操作。如果你不确定如何操作,或者需要进一步的帮助,请咨询系统管理员。

    如何锁定Centos系统中的mysql系统用户?

    方法1:使用usermod命令锁定用户

    您可以使用usermod命令的-L选项来锁定用户账户。这将禁止用户登录,无论是通过SSH还是其他方式。以下是具体的命令(如果你已获取root权限,下面的命令去掉sudo):

    sudo usermod -L mysql

    这个命令会将mysql用户的账户锁定,使其无法登录。如果需要解锁,可以使用-U选项(如果你已获取root权限,下面的命令去掉sudo):

    sudo usermod -U mysql

    方法2:使用passwd命令锁定用户

    另一种锁定用户的方法是通过passwd命令将用户的密码状态设置为锁定。以下是具体的命令(如果你已获取root权限,下面的命令去掉sudo):

    sudo passwd -l mysql

    这个命令会锁定mysql用户的密码,使其无法通过密码验证登录系统。如果需要解锁,可以使用-u选项(如果你已获取root权限,下面的命令去掉sudo):

    sudo passwd -u mysql

    这两种方法都可以在不修改PAM配置的情况下锁定系统用户。您可以根据实际情况选择适合的方法来锁定mysql用户。

    如何修改centos中mysql系统用户密码?

    在Linux系统中,如果你需要修改mysql用户的密码,你可以使用passwd命令来更改密码。以下是具体的步骤:

    1. 切换到root用户: 如果你不是以root用户身份登录的,你需要先切换到root用户:
      bash
      su -

      输入root用户的密码。

    2. 更改mysql用户密码: 使用passwd命令来更改mysql用户的密码:
      bash
      passwd mysql

      系统会提示你输入新的密码,输入后再次输入以确认。

    请注意,更改系统用户的密码是一个敏感操作,应该谨慎进行。确保你输入的密码足够强大,以防止未经授权的访问。

     

    若果您已经确认了SELinux是禁用的(getenforce执行结果是Disabled),并且/home/mysql目录存在,

    “This account is currently not available.”的问题可能是由于mysql用户的登录Shell设置为不允许登录的Shell导致的。

    可以更改它为一个有效的Shell,比如/bin/bash。使用以下命令来更改(如果你以获取root权限,下面的命令去掉sudo):

    sudo usermod -s /bin/bash mysql

    这个命令会将mysql用户的登录Shell更改为/bin/bash,使其能够登录。

    更改Shell设置后,您可以再次尝试使用su - mysql命令来切换到mysql用户。

    出现-bash-4.2$提示就是登录成功了。

    -bash-4.2$是bash shell的提示符,表明您现在处于mysql用户的命令行界面中,并且bash版本为4.2。$符号表示您现在是以普通用户身份登录,如果是#则表示以root用户身份登录。

    如果您完成了操作,想要退出mysql用户的shell,可以使用以下命令:

    exit

    或者简单地输入logout

  • 给root用户查询mysql数据库的权限,并且能够给其他用户授权查询mysql数据库的权限

    如果你想要给root用户查询mysql数据库的权限,并且允许root用户将这个权限授予给其他用户,你可以使用以下SQL命令:

    GRANT SELECT ON mysql.* TO 'root'@'localhost' WITH GRANT OPTION; 
    flush privileges;

     

    这条命令的含义如下:

    • GRANT SELECT:授予查询(SELECT)权限。
    • ON mysql.*:指定这些权限仅适用于mysql数据库中的所有表。
    • TO 'root'@'localhost':指定被授予权限的用户是root,并且这个root用户可以从本地主机(localhost)连接。
    • WITH GRANT OPTION:允许root用户将其权限授予给其他用户。

    执行这个命令后,root用户将能够查询mysql数据库中的所有表,并且可以将查询权限授予给其他用户。

    请确保在执行这些操作时,你具有足够的权限,并且了解这些操作可能带来的安全风险。在生产环境中,建议谨慎操作,并且仅在必要时授予权限。

  • kill掉mysql相关的所有进程

    在Linux系统中,如果你需要杀死所有与MySQL相关的进程,你可以使用pkillkillall命令,这些命令可以根据进程名称来匹配并终止进程。以下是如何执行这个操作的步骤:

    1. 使用pkill命令:
      pkill -u mysql

      这个命令会杀死所有属于用户mysql的进程。通常MySQL进程是以mysql用户运行的,所以这个命令会杀死所有MySQL相关的进程。

    2. 使用killall命令:
      killall -u mysql

      这个命令同样会杀死所有属于用户mysql的进程。

    3. 如果你想要更精确地只杀死MySQL服务的进程,可以使用pgrepkill组合命令:
      pgrep -u mysql -f mysqld | xargs kill

      这个命令会找到所有包含mysqld的进程(MySQL服务的主要进程),并发送终止信号。

    警告:在执行这些命令之前,请确保你了解这些命令的后果。杀死MySQL相关的所有进程可能会导致数据库服务中断,正在进行的事务可能会被中断,可能会导致数据丢失或损坏。在执行这些操作之前,最好确保数据库已经备份,并且你有足够的权限和理由来执行这些操作。

    如果你只是想重启MySQL服务,而不是杀死所有进程,你可以使用系统的服务管理命令,例如在Systemd系统中:

    sudo systemctl restart mysqld

    或者在较老的系统中使用:

    sudo service mysql restart

    这些命令会安全地重启MySQL服务,而不会丢失任何数据。

  • .pyc文件对程序性能提升有多大?

    .pyc 文件对程序性能的提升主要体现在以下几个方面:

    1. 加快程序加载速度.pyc 文件是预编译的字节码,Python 解释器可以直接加载它,避免了每次运行时重新编译源代码的过程。这可以减少程序的启动时间,特别是在大型项目中,如果有大量的 .py 文件,使用 .pyc 文件可以显著减少程序启动时间
    2. 减少解释器的编译负担:使用 .pyc 文件可以减轻 Python 解释器的编译负担,因为不需要每次都对 .py 文件进行编译
    3. 提高运行效率.pyc 文件是一个可执行的字节码文件,目的是节省 Python 解析器翻译时间,从而提高运行效率。虽然性能提升可能只是一点点,但对于大型项目来说,节省的时间会更多一些
    4. 保护源代码:发布程序时,只提供 .pyc 文件可以有效隐藏源代码,防止他人查看或修改,这在一定程度上也减少了代码被篡改的风险,从而可能间接提高程序的稳定性和安全性

    总的来说,.pyc 文件对程序性能的提升主要体现在加快程序加载速度和减少解释器编译负担上,对于大型项目或者频繁启动的程序,这种性能提升会更加明显。然而,对于单次执行的小型脚本,这种性能提升可能不太显著。

  • .pyc是啥文件?如何执行.pyc文件

    .pyc 文件是 Python 程序的编译文件,它是 Python 源代码(.py 文件)的字节码版本。.pyc 文件通常由 Python 解释器在需要时自动生成,用于提高程序的加载速度,因为从 .pyc 文件加载代码比从 .py 文件编译代码要快。

    执行 .pyc 文件的方法如下:

    1. 直接执行.pyc 文件可以直接被 Python 解释器执行。你只需要在命令行中使用 Python 解释器,然后指定 .pyc 文件的路径即可。例如:
      python your_script.pyc

      或者如果你使用的是 Python 3.x 版本,可能需要使用:

      python3 your_script.pyc
    2. 使用 import 语句: 你也可以在 Python 程序中使用 import 语句来导入 .pyc 文件,就像导入普通的 .py 文件一样。例如:
      import your_script
    3. 使用 exec 函数: 如果你有一个 .pyc 文件的路径,可以使用 exec 函数来执行其中的代码。例如:
      with open('your_script.pyc', 'rb') as file:
          exec(file.read())

    请注意,.pyc 文件是针对特定版本的 Python 解释器生成的,这意味着它们可能不兼容不同版本的 Python。此外,出于安全考虑,.pyc 文件不应该从不可信任的来源执行,因为它们可能包含恶意代码。