月度归档: 2021 年 8 月

  • 经典的 Fork 炸弹解析

    经典的 Fork 炸弹解析

    Jaromil 在 2002 年设计了最为精简的一个 Linux Fork 炸弹,整行代码只有 13 个字符,在 shell 中运行后几秒后系统就会宕机:

    :(){ :|:& };:

    这样看起来不是很好理解,我们可以更改下格式:

    :(){	:|:&};:

    更好理解一点的话就是这样:

    bomb(){	bomb|bomb&};bomb

    因为 shell 中函数可以省略 function 关键字,所以上面的 13 个字符的功能是定义一个函数并调用这个函数,函数的名称为 : ,主要的核心代码是 :|:&,可以看出这是一个对函数本身的递归调用,通过 & 实现在后台开启新进程运行,通过管道实现进程呈几何形式增长,最后再通过 : 来调用此函数引爆炸弹。因此,几秒钟内,系统就会因为处理不过来太多的进程而死机,解决的唯一办法就是重启。

    Bomb 一下

    秉着不作不死的心态,我们也来运行一下,于是我将矛头指向云主机,我使用了一个 2G 内存的云主机,首先在本地开启两个终端,在一个终端连接云主机后运行炸弹,几秒后再尝试用另外一个终端登录,效果可以看下图:

    看,运行一段时间后直接报出了 -bash: fork: Cannot allocate memory,说明内存不足了。并且我在二号终端上尝试连接也没有任何反应。因为是虚拟的云主机,所以我只能通过主机服务商的后台来给主机断电重启。然后才能重新登录:

    炸弹的危害

    Fork 炸弹带来的后果就是耗尽服务器资源,使服务器不能正常的对外提供服务,也就是常说的 DoS。与传统 1v1、通过不断向服务器发送请求造成服务器崩溃不同,Fork 炸弹有种坐山观虎斗,不费一兵一卒斩敌人于马下的感觉。更吓人的是这个函数是不需要 root 权限就可以运行的。看到网上有帖子说某些人将个性签名改为 Fork 炸弹,结果真有好奇之人中枪,试想如果中枪的人是在公司服务器上运行的话,oh,!

    预防方式

    当然,Fork 炸弹没有那么可怕,用其它语言也可以分分钟写出来一个,例如,Python 版:

    import os 	
        while True:  	
        os.fork()

    Fork 炸弹的本质无非就是靠创建进程来抢占系统资源,在 Linux 中,我们可以通过 ulimit 命令来限制用户的某些行为,运行 ulimit -a  可以查看我们能做哪些限制:

    ubuntu@10-10-57-151:~$ ulimit -acore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 7782max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 1024pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 8192cpu time               (seconds, -t) unlimitedmax user processes              (-u) 7782virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited

    可以看到,-u 参数可以限制用户创建进程数,因此,我们可以使用 ulimit -u 20 来允许用户最多创建 20 个进程。这样就可以预防 Fork 炸弹。但这样是不彻底的,关闭终端后这个命令就失效了。我们可以通过修改 /etc/security/limits.conf 文件来进行更深层次的预防,在文件里添加如下一行(下面的 ubuntu 需更换为你的用户名):

    ubuntu - nproc 20

    这样,退出后重新登录,就会发现最大进程数已经更改为 20 了:

    这个时候我们再次运行炸弹就不会报内存不足了,而是提示 -bash: fork: retry: No child processes,说明 Linux 限制了炸弹创建进程。

  • mysql excel数据生成sql insert语句

    mysql excel数据生成sql insert语句

    excel表格中有A、B、C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age 。

    在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下:

    1、增加一列(D列)

    2、在第一行的D列,就是D1中输入公式: =CONCATENATE("insert into users (name,sex,age) values ('",A1,"','",B1,"','",C1,"');")

    =CONCATENATE("insert IGNORE  into items (id,item,price) values ('",A2,"','",B2,"','",D2,"');")

    Mysql插入数据:不存在则插入,存在则跳过或更新

    3、此时D1已经生成了如下的sql语句: “insert into users (name,sex,age) values (‘ls’,’女’,’24’)”;

    4、将D1的公式复制到所有行的D列

    5、此时D列已经生成了所有的sql语句

    6、把D列复制到一个纯文本文件中

    7、去掉SQL语句的双引号  

  • WordPress WooCommerce不显示价格 不显示购物车按钮

    不显示价格

    不显示价格,去掉价格字段即可 把代码放在主题的functions.php下

    //Hide price
    add_filter( 'woocommerce_get_price_html', 'woocommerce_hide_price' );
    function woocommerce_hide_price( $price ){
        return '';
    }

    去掉购买按钮

    //Hide buy button
    add_action( 'init', 'woocommerce_hide_buy_button' );
    function woocommerce_hide_buy_button(){
        remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
    }

    wc-ajax

    没有购买按钮,就无法向购物车中添加任何产品,购物车页面可有可无。
    如果完全不需要购物功能,将WooCommerce的购物车、结账等页面删除即可(此项未亲测)。

    在实际的使用过程中,会发现”wc-ajax = get_refreshed_fragments”的加载时间为1.5秒,然后这并不是必须的。并且延缓了网站的加载速度。可以加入代码:

    add_action( 'wp_print_scripts', 'de_script', 100 );
    function de_script() {
        wp_dequeue_script( 'wc-cart-fragments' );
        return true;
    }

    删除产品架构标记

    /**
     * 从“产品类别”和“商店”页面中删除生成的产品架构标记。
     */
    function wc_remove_product_schema_product_archive() {
    	remove_action( 'woocommerce_shop_loop', array( WC()->structured_data, 'generate_product_data' ), 10, 0 );
    }
    add_action( 'woocommerce_init', 'wc_remove_product_schema_product_archive' );
  • WordPress 删除WooCommerce商品详情评论选项卡

    使用wordpress建设网站时,会遇到不想像显示产品评论 信息选项卡太多内容,如何从WooCommerce单一产品页面中删除描述和评论标签。有时我们需要从单一产品页面中删除产品描述和产品评论标签,以使单个产品页面简单而令人印象深刻,或者我们不希望该用户将分享关于网站上列出的产品的评论。如何删除WooCommerce中的描述,评论和其他信息选项卡:

    在functions.php文件的末尾使用下面的代码。

    add_filter( 'woocommerce_product_tabs', 'wcs_woo_remove_reviews_tab', 98 );
    function wcs_woo_remove_reviews_tab($tabs) {
        unset($tabs['reviews']);
        return $tabs;
    }

    此外,要删除额外的信息选项卡,然后使用下面的你的functions.php文件:

    add_filter( 'woocommerce_product_tabs', 'woo_remove_product_tabs', 98 );
    function woo_remove_product_tabs( $tabs ) {
        unset( $tabs['description'] ); // Remove the description tab
        unset( $tabs['reviews'] ); // Remove the reviews tab
        unset( $tabs['additional_information'] ); // Remove the additional information tab
        return $tabs;
    }
  • LNMP定时自动检测502 Bad Gateway错误并重启PHP

    LNMP定时自动检测502 Bad Gateway错误并重启PHP

    简单的脚本,用来监控php的 502 Bad Getway 并自动重启php服务进程,下面记录一下具体的脚本内容,比如将文件命名为 check_php.sh ,放在 /root 目录中

    #!/bin/bash
    MY_URL="https://www.jiloc.com/"
    RESULT=`curl -I $MY_URL|grep "HTTP/1.1 502"`
    if [ -n "$RESULT" ]; then
        /etc/init.d/php-fpm restart
    fi

    给予可执行权限:

    chmod +x /root/check_php.sh

    通过 crontab 设置自动运行:

    crontab -e

    crontab里写入如下内容

    */5 * * * * /root/check_php.sh
  • WordPress获取分类法对象数据函数:get_term

    WordPress获取分类法对象数据函数:get_term

    WordPress函数get_term可以获取任何分类法对象数据,例如分类、标签和自定义分类法。

    get_term( int|WP_Term|object $term, string $taxonomy = '', string $output = OBJECT, string $filter = 'raw' )

    函数参数

    $term

    整数

    分类法的ID

    $taxonomy

    字符串

    分类法的名称

    $output

    字符串,默认值:OBJECT

    返回的数据类型,默认返回对象,可选值:

    • OBJECT:默认值,以对象的形式返回数据;
    • ARRAY_A:以关联数组的形式返回数据;
    • ARRAY_N:以数字数组的形式返回数据。

    $filter

    字符串,默认值:raw

    对数据使用函数sanitize_term进行字段过滤

    函数返回值

    WP_Term Object
    (
        [term_id] => 5
        [name] => 开发
        [slug] => develop
        [term_group] => 0
        [term_taxonomy_id] => 5
        [taxonomy] => category
        [description] => 分类描述
        [parent] => 0
        [count] => 220
        [filter] => raw
    )

    函数使用示例

    $term = get_term(12, 'post_tag');
    echo '<li><a href="' . get_tag_link($term->term_id) . '">' . $term->name . '</a></li>';

    扩展阅读

    get_term()函数位于:wp-includes/taxonomy.php

  • WordPress 指定Page类型首页 获取首页ID

    WordPress 指定Page类型首页 获取首页ID

    当我们开发WordPress的主题或者插件时,有时指定了某个page类型页面来作为首页。

    这时使用 get_the_ID() 函数则无法获取当前id,需要使用如下代码来获取page id:

    $pageID = get_option('page_on_front');

  • Woocommerce文件构成及修改默认模板结构介绍

    Woocommerce文件构成及修改默认模板结构介绍

    修改默认模板样式

    WooCommerce 自带模板在 wp-content/plugins/woocommerce/templates 下。如果想修改默认的样式,可以在当前使用的主题下面创建一个文件夹:woocommerce,粘贴 templates 下所有文件到这个文件。

    文件目录功能

    • auth 用户登录登出认证模板
    • cart 购物车的模板
    • checkout 结账的模板
    • global 公用文件模板
    • loop 商品循环模板
    • myaccount 账号信息模板
    • notices 订购消息模板
    • order 订单模板
    • single-product 单个产品模板
WeChat