Socat是一个简单且高效能的端口转发软件，支持IPv4和IPv6、TCP和UDP。对于家庭宽带仅有公网IPv6的情况很有帮助，并且Openwrt下可以直接通过opkg install socat来安装Socat。监听IPv4的80端口的TCP协议，并转发到192.168.1.100的8080端口socat TCP4-LISTEN:80,reuseaddr,fork TCP4:192.168.1.100:8080但在使用的过程中，遇到了一个问题，按照网上的教程，转发IPv6的同时，会占用IPv4的相同端口，导致IPv4和IPv6的相同端口不能用于不同的用途。经过翻看Socat源码后，终于找到了监听IPv6的同时不占用IPv4相同端口的附加参数ipv6-v6only=1监听IPv6的80端口（会同时占用IPv4的80端口）的TCP协议，并转发到192.168.1.100的8080端口socat TCP6-LISTEN:80,reuseaddr,fork TCP4:192.168.1.100:8080仅监听IPv6的80端口（不占用IPv4的80端口）的TCP协议，并转发到192.168.1.100的8080端口socat TCP6-LISTEN:80,ipv6-v6only=1,reuseaddr,fork TCP4:192.168.1.100:8080
常规反代配置 location / { proxy_pass https://abc.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }而此时使用该配置反代Cloudflare全站加速下的HTTPS站点时，即反代服务器使用HTTPS 443端口访问Cloudflare，访问https://abc.com会出现 502 Bad Request 报错，应添加两行proxy_ssl设置， proxy_ssl_name $host; proxy_ssl_server_name on;修改后的反代配置为 location / { proxy_pass https://abc.com; proxy_ssl_name $host; proxy_ssl_server_name on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }这样再次访问https://abc.com就可以正常访问了。Attention:如果使用宝塔面板的反代，请注意proxy_ssl设置需要添加到每一种需要反代的文件类型的location /下，否则会出现首页返回200成功状态码，但引用的js、css、图片的资源依然返回502 Bad Request状态码，从而导致页面显示不完全。如果反代站与源站域名不同可尝试将Nginx配置中所有的$host修改为源站域名，如上述示例就可以修改为abc.com
编译Openwrt/LEDE系统，能够在保证兼容性和稳定性的前提下，定制出一个干净的、符合自己需求的固件。本文以lean维护的lede源码为例，讲述一个萌新的编译经历准备1、Ubuntu 14.04/16.04 LTS x64 所有操作在非root用户下执行sudo apt-get update sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint2、全局外网环境# Ubuntu下设置代理，关闭终端后自动失效 export http_proxy="http://127.0.0.1:1080" export https_proxy="http://127.0.0.1:1080" # 手动取消代理 export -n http_proxy export -n https_proxy编译1、首次编译# 下载源码 git clone https://github.com/coolsnowwolf/lede # 进入编译主目录 cd lede # 更新并安装feeds源 ./scripts/feeds update -a ./scripts/feeds install -a # 打开配置 make menuconfig # 开始编译 make -j1 V=s2、非首次编译# 进入编译主目录 cd lede # 清理工作，根据需要选择 # 1、删除临时文件目录 rm -rf ./tmp # 2、删除配置文件 rm -rf .config # 3、删除bin、build_dir文件，即清理上次编译成果打包前后的文件 make clean # 4、make clean再删除staging_dir、toolchain、logs，即清除编译结果、交叉编译链工具以及工具链目录 make dirclean # 5、make dirclean再删除dl、.config，即清除除首次git下载外所有内容 make distclean # 更新源码，更新并安装feeds源 git pull ./scripts/feeds update -a ./scripts/feeds install -a # 打开配置 make menuconfig # 开始编译, -j5的5为编译进程数量，可以设置为电脑cpu核心数+1 make -j5 V=s固件路径编译完成后，编译好的固件在lede目录下的bin/targets中，ipk安装包则在lede目录下的bin/packages中20230812 现已直接偷懒使用在线定制网站https://supes.top/
OrangePi Zero在刷写Openwrt/LEDE后，往往TF卡的空间得不到充分的利用，rootfs往往只占用了几百兆甚至几十兆，而像armbian那样直接使用resize2fs又会报错。因此需要在另一台Linux设备上对TF卡进行重新分区。1、插入读卡器，查询新挂载TF卡设备名，我的是/dev/sdbfdisk -l2、修改磁盘分区fdisk /dev/sdb # 记下sdb2的start信息，我的是45056 p # 删除第二个分区sdb2 d 2 # 重建第二个分区sdb2 n p 2 45056 [enter] # 使用默认值，直接回车 y w3、如果sdb1和sdb2处于挂载状态，需要卸载挂载umount /dev/sdb1 umount /dev/sdb24、修复并使用resize2fs完成调整e2fsck -f /dev/sdb2 resize2fs /dev/sdb2完成后即可拔下读卡器尽情享受啦~参考openwrt系统32GTF卡分区问题 - 程序园
Typecho登陆后归档页面私密文章不显示的解决方法
Typecho登陆后，打开归档页面，设置为“私密”属性的文章并不能显示，一定程度上影响了使用体验。编辑Typecho根目录下的var/Widget/Contents/Post/Recent.php 文件，将$this->db->fetchAll($this->select() ->where('table.contents.status = ?', 'publish') ->where('table.contents.created < ?', $this->options->time) ->where('table.contents.type = ?', 'post') ->order('table.contents.created', Typecho_Db::SORT_DESC) ->limit($this->parameter->pageSize), array($this, 'push'));改为if ($this->user->hasLogin()) { $this->db->fetchAll($this->select() ->where('table.contents.status = ? OR table.contents.status = ?', 'publish','private') ->where('table.contents.created < ?', $this->options->time) ->where('table.contents.type = ?', 'post') ->order('table.contents.created', Typecho_Db::SORT_DESC) ->limit($this->parameter->pageSize), array($this, 'push')); } else { $this->db->fetchAll($this->select() ->where('table.contents.status = ?', 'publish') ->where('table.contents.created < ?', $this->options->time) ->where('table.contents.type = ?', 'post') ->order('table.contents.created', Typecho_Db::SORT_DESC) ->limit($this->parameter->pageSize), array($this, 'push')); }修改完成后，登录并打开归档页面，就可以看到设置为“私密”的文章啦
Typecho自动修正文章cid、分类标签mid不连续的方法
网上有些关于自动调整Typecho的cid、mid的php脚本，然而其中使用的mysql方法过于老旧且不支持php7，每次需要手动访问运行很麻烦。本文就上述的脚本进行了修改，使其支持php7且能够在发布文章后自动运行。1、修改网站根目录下config.inc.php最后定义数据库部分/** 定义数据库参数 */ $hostname_blog = "数据库连接地址"; $database_blog = "数据库名"; $username_blog = "数据库用户名"; $password_blog = "数据库密码"; $db = new Typecho_Db('Pdo_Mysql', 'typecho_'); $db->addServer(array ( 'host' => $hostname_blog, 'user' => $username_blog, 'password' => $password_blog, 'charset' => 'utf8', 'port' => '3306', 'database' => $database_blog, ), Typecho_Db::READ | Typecho_Db::WRITE); Typecho_Db::set($db);2、在/admin目录下新建change-cid.php文件。因示例中关于页、归档页、分类页、标签页占据了1~4的cid（需要手动进入mysql修改表typecho_contents中的cid列），所以本脚本会从表typecho_contents的第五行开始自动修改文章别名slug为cid-4，请按照自己的需求在第19-20行进行修改<?php /** * Typecho重新排列不连续的文章ID * 作者：https://ghostinto.top/ */ $blog = mysqli_connect($hostname_blog,$username_blog,$password_blog,$database_blog) or trigger_error(mysqli_error(),E_USER_ERROR); $no = 1; function change_cid($cid) { global $no; global $blog; // 修改post cid，并修改分类、标签、自定义字段、评论的对应关系 $sql = 'update typecho_contents set cid = ' . $no . ' where cid = ' . $cid; mysqli_query($blog,$sql); //按照自己的需求修改cid调整的起始序号 if ($no > "4") { $sql = 'update typecho_contents set slug = ' . ($no - "4") . ' where cid = ' . $no; mysqli_query($blog,$sql); } $sql = 'update typecho_relationships set cid = ' . $no . ' where cid = ' . $cid; mysqli_query($blog,$sql); $sql = 'update typecho_comments set cid = ' . $no . ' where cid = ' . $cid; mysqli_query($blog,$sql); $no = $no + 1; } $query_postRecord = "SELECT cid FROM typecho_contents ORDER BY cid ASC"; $all_postRecord = mysqli_query($blog,$query_postRecord); $row_postRecord = mysqli_fetch_assoc($all_postRecord); do { change_cid( $row_postRecord['cid'] ); } while ($row_postRecord = mysqli_fetch_assoc($all_postRecord)); // 重新设置post id自增起点 mysqli_query($blog,'alter table typecho_contents AUTO_INCREMENT = '.$no); //echo 'ok'; //测试时使用，正式使用时注释掉 mysqli_close($blog); ?>3、在/admin目录下新建change-mid.php文件<?php /** * Typecho重新排列分类和标签（meta）不连续的mid * 作者：https://ghostinto.top/ */ $blog = mysqli_connect($hostname_blog,$username_blog,$password_blog,$database_blog) or trigger_error(mysqli_error(),E_USER_ERROR); $no = 1; function change_mid($mid) { global $no; global $blog; // 修改meta id，并修改分类、标签、自定义字段、评论的对应关系 $sql = 'update typecho_metas set mid = ' . $no . ' where mid = ' . $mid; mysqli_query($blog,$sql); $sql = 'update typecho_relationships set mid = ' . $no . ' where mid = ' . $mid; mysqli_query($blog,$sql); $no = $no + 1; } //mysqli_select_db($database_blog, $blog); $query_postRecord = "SELECT mid FROM typecho_metas ORDER BY mid ASC"; $all_postRecord = mysqli_query($blog,$query_postRecord); $row_postRecord = mysqli_fetch_assoc($all_postRecord); do { change_mid( $row_postRecord['mid'] ); } while ($row_postRecord = mysqli_fetch_assoc($all_postRecord)); // 重新设置meta id自增起点 mysqli_query($blog,'alter table typecho_metas AUTO_INCREMENT = ' . $no); //echo 'ok'; //测试时使用，正式使用时注释掉 mysqli_close($blog); ?>4、修改/admin/manage-posts.php文件，在原内容前加入如下内容。如果对于分类、标签修改管理较多，可以在/admin/manage-categories.php和/admin/manage-tags.php文件前加入相同内容。<?php //发布文章后会跳转manage-posts.php文章管理页面，加载该页面时自动进行cid、mid调整 require "../config.inc.php"; require "change-cid.php"; require "change-mid.php"; ?>
在使用了Cloudflare加速的域名后面加上/cdn-cgi/trace即可，如http://a.com/改为http://a.com/cdn-cgi/traceCloudflare全球网络信息：https://www.cloudflare.com/network/Cloudflare服务器状态监控：https://www.cloudflarestatus.com/fl=23f81 h=www.xxxxx.com 你的域名 ip=127.0.0.1 你的IP地址 ts=1513341407.4 visit_scheme=http uag=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36 colo=HKG 节点信息，香港 spdy=off http=http/1.1 loc=CN
无OPKG管理器情况下手动安装IPK包的方法
在嵌入式平台上，很多基于openwrt的路由器固件并没有自带opkg包管理器，无法使用opkg命令安装ipk包，此时需要手动进行安装。方法大致有两种。1、使用Entware脚本安装opkg管理器wget http://pkg.entware.net/binaries/你的处理器架构/installer/installer.sh chmod +x installer.sh ./installer.sh opkg install xxx.ipk2、在openwrt官网上找到opkg的ipk包进行下载在进行解压tar zxvf xxx.ipk #解压出来三个文件data.tar.gz、control.tar.gz、debian-binary tar zxvf data.tar.gz -C / opkg install xxx.ipk
一、Dockerfile的一些简单语法FROM 拉取DockerHub上已有的Docker作为基础镜像ENV 环境变量设置ADD/COPY 向准备构建Docker中添加一些文件RUN 构建Docker执行的shell命令EXPOSE 打开端口CMD/ENTRYPOINT Docker启动脚本一个简单的例子：FROM arm64v8/mongo:lastest ENV LANG=zh-cn COPY entrypoint.sh /usr/local/bin/ RUN echo "FOR EXAMPLE"; chmod a+x /usr/local/bin/entrypoint.sh EXPOSE 6666 ENTRYPOINT ["entrypoint.sh"]二、根据Dockerfile在本地构建镜像1、将Docker所需要的文件放在一个单独的文件夹下，包括Dockerfile文件，如上述例子文件夹中需要有两个文件Dockerfile和entrypoint.sh2、进入上述的文件夹，并执行命令，注意最后有一个点，表示在当前路径构建docker build -t {dockerhubusername}/{imagename}:{imagetag} .3、使用docker images命令查看本地所有docker镜像，确认是否构建成功三、在Docker Hub上发布你的Docker镜像1、在Docker Hub上注册自己的帐号2、本地执行docker login命令登录你的Docker Hub帐号3、执行docker push {dockerhubusername}/{imagename}:{imagetag}推送你构建好的镜像到Docker Hub上，然后其他小伙伴就可以愉快的使用你的镜像了，撒花★,°:.☆(￣▽￣)/$:.°★ 。
Linux通用1、打包、压缩、解压.tar解包：tar xvf FileName.tar打包：tar cvf FileName.tar DirName（注：tar是打包，不是压缩！）.gz解压1：gunzip FileName.gz解压2：gzip -d FileName.gz压缩：gzip FileName.tar.gz解压：tar zxvf FileName.tar.gz压缩：tar zcvf FileName.tar.gz DirName.bz2解压1：bzip2 -d FileName.bz2解压2：bunzip2 FileName.bz2压缩：bzip2 -z FileName.tar.bz2解压：tar jxvf FileName.tar.bz2 压缩：tar jcvf FileName.tar.bz2 DirName.bz解压1：bzip2 -d FileName.bz 解压2：bunzip2 FileName.bz压缩：未知.tar.bz解压：tar jxvf FileName.tar.bz 压缩：未知.Z解压：uncompress FileName.Z压缩：compress FileName.tar.Z解压：tar Zxvf FileName.tar.Z压缩：tar Zcvf FileName.tar.Z DirName.tgz解压：tar zxvf FileName.tgz压缩：未知.tar.tgz解压：tar zxvf FileName.tar.tgz压缩：tar zcvf FileName.tar.tgz FileName.zip解压：unzip FileName.zip解密解压：unzip -P password FileName.zip压缩：zip -r FileName.zip DirName加密压缩：zip -rP password FileName.zip DirName1 DirName2 FileName1 Filename2zip -r 用于递归处理，将指定目录下的所有文件和子目录一起处理zip/unzip -q 不显示指令执行过程.rar解压：rar a FileName.rar压缩：rar e FileName.rar2、随机字符串生成# 生成64位由A-Z、a-z、0-9、_组成的随机自负床 cat /dev/urandom | tr -dc A-Za-z0-9_ | head -c64 | sed 's/[ \r\b]/a/g'3、快速删除大量文件rm删除内容时，将目录的每一个条目逐个删除(unlink)，需要循环重复遍历很多次；rsync删除内容时，建立好新的空目录，替换掉老目录，不需要进行大量的遍历操作。# 先生成一个空目录 mkdir /tmp/empty rsync--delete-before -avd /tmp/empty /path/delete_dir/ # -delete-before 接收者在传输之前进行删除操作 # -a 归档模式，表示以递归方式传输文件，并保持所有文件属性 # -v 详细输出模式4、修改系统文字编码dpkg-reconfigure locales #安装语言包 LANG=zh_CN.UTF-8 locale #查看是否修改成功5、查看端口监听netstat -ntlp netstat -nlpCentOS 7适用1、服务管理CentOS 7中的服务管理仍然兼容CentOS 6中的service XX {start/stop/restart/status},而新的服务管理命令为systemctl enable XX #设置开机启动XX服务 systemctl start XX #启动XX服务 systemctl stop XX #停止XX服务 systemctl restart XX #重启XX服务 systemctl status XX #查看XX服务的状态2、自定义开机自启脚本(1) 赋予脚本可执行权限（/opt/script/autostart.sh是你的脚本路径）chmod +x /opt/script/autostart.sh(2) 打开/etc/rc.d/rc.local文件，在末尾增加如下内容/opt/script/autostart.sh(3) 在centos7中，/etc/rc.d/rc.local的权限被降低了，所以需要执行如下命令赋予其可执行权限chmod +x /etc/rc.d/rc.local(4) 也可以直接在rc.local中直接写命令3、查找RPM软件包是否安装rpm -qa |grep mariadb #在系统中检索包含mariadb字眼的rpm包4、查找RPM软件包是否安装yum remove mariadb* #在系统中卸载mariadb开头的rpm包参考资料【centos7】添加开机启动服务/脚本 - startcentos - 博客园Centos7 安装mariadb及启动 - javaZhong的博客 - CSDN博客MariaDB 安装与启动 过程记录 - 云中王 - 博客园linux文件夹打包命令 - 小作一个 - 博客园Linux系统下获取随机字符串方法-bobower-ChinaUnix博客