一个自动下载最新版本frp打包成deb的bash脚本

frp作者不仅不提供任何发行版的包,甚至把systemd文件给删了1,我每次安装都费劲拖目录写配置,今天花了点时间在gpt帮助下写了个bash脚本,自动从github release下载最新版本frp并打包成deb,这下舒服了。注意替换github api token。需要的依赖:curl,jq 好像没了

#!/bin/bash

# GitHub repository information
repo_owner="fatedier"
repo_name="frp"
binary_name="frp"
os="linux"
arch="amd64"

# GitHub API endpoint for the latest release
github_api_url="https://api.github.com/repos/$repo_owner/$repo_name/releases/latest"

# File to store the current version locally
version_file="current_version.txt"

# Personal access token
github_token="<GITHUB_API_TOKEN 换成你自己的>"

function get_latest_release() {
    # Send a GET request to the GitHub API
    curl -s -H "Accept: application/vnd.github.v3+json" -H "Authorization: Bearer $github_token" "$github_api_url" |
        jq -r .tag_name
}

function download_release() {
    local version=$1
    version="${version#v}"
    # GitHub release asset URL for the binary
    asset_url="https://mirror.ghproxy.com/github.com/$repo_owner/$repo_name/releases/download/v$version/${binary_name}_${version}_${os}_${arch}.tar.gz"

    # Check if the file already exists
    if [[ ! -e "${binary_name}_${version}_${os}_${arch}.tar.gz" ]]; then
        # Download the release binary
        wget "$asset_url"

        echo "Downloaded frp $version for ${os}_${arch}."

    else
        echo "File ${binary_name}_${version}_${os}_${arch}.tar.gz already exists."
    fi

    # Build Debian package
    build_deb_package "$version"
}

function build_deb_package() {
    local version=$1

    # Extract the tar.gz file
    tar -zxf "${binary_name}_${version}_${os}_${arch}.tar.gz"

    work_dir="${binary_name}_${version}_${os}_${arch}"
    # Create Debian directory structure
    debian_dir="${work_dir}/DEBIAN"

    binary_dir="${work_dir}/usr/bin"
    conf_dir="${work_dir}/etc/frp"
    systemd_dir="${work_dir}/etc/systemd/system/"
    doc_dir="${work_dir}/usr/share/doc/frp"

    mkdir -p "$debian_dir" "$binary_dir" "$systemd_dir" "$doc_dir"

    chown -R root:root *
    chmod 755 ${work_dir}/frpc
    chmod 755 ${work_dir}/frps
    chmod 644 ${work_dir}/frpc.toml
    chmod 644 ${work_dir}/frps.toml
    mv ${work_dir}/frpc ${binary_dir}/
    mv ${work_dir}/frps ${binary_dir}/
    mv ${work_dir}/frpc.toml ${conf_dir}/
    mv ${work_dir}/frps.toml ${conf_dir}/
    mv ${work_dir}/LICENSE ${doc_dir}/

    # Create control file
    cat >"$debian_dir/control" <<EOL
Package: $binary_name
Version: $version
Architecture: $arch
Maintainer: YaCHEN Wang <yachen4ever@yahoo.com>
Description: Frp package
Depends: libc6 (>= 2.3.6-6)
Homepage: https://github.com/fatedier/frp
Section: net
Priority: optional
Installed-Size: $(du -sk "${binary_name}_${version}_${os}_${arch}" | cut -f1)
EOL

    cat >"$systemd_dir/frpc.service" <<EOL
[Unit]
Description=Frp Client Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini

[Install]
WantedBy=multi-user.target
EOL

    cat >"$systemd_dir/frpc@.service" <<EOL
[Unit]
Description=Frp Client Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /etc/frp/%i.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/%i.ini

[Install]
WantedBy=multi-user.target
EOL

    cat >"$systemd_dir/frps.service" <<EOL
[Unit]
Description=Frp Server Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy=multi-user.target
EOL

    cat >"$systemd_dir/frps@.service" <<EOL
[Unit]
Description=Frp Server Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/%i.ini

[Install]
WantedBy=multi-user.target
EOL

    # Build .deb package
    dpkg-deb --build "${work_dir}"
}

function main() {
    # Check if the version file exists
    if [[ -e $version_file ]]; then
        # Read the current version from the file
        current_version=$(cat "$version_file")

        # Get the latest release version from GitHub
        latest_version=$(get_latest_release)

        if [[ "$latest_version" && "$latest_version" != "$current_version" ]]; then
            echo "New version available: $latest_version"
            download_release "$latest_version"

            # Update the version file
            echo "$latest_version" >"$version_file"
        elif [[ "$latest_version" == "$current_version" ]]; then
            echo "Already up to date."
            download_release "$current_version"
        else
            echo "Error retrieving latest release information."
        fi
    else
        echo "Error: $version_file not found."
    fi

    # Clean up
    # rm -rf debian
    # rm -rf "${binary_name}_${version}_${os}_${arch}.tar.gz"
}

main

SSH Tunnel 简介

SSH Tunnel是SSH的一种机制,用于从客户端到服务器的隧穿应用端口,反之亦然,可以用于内网穿透,相比其他类似于Frp、Nps等内网穿透软件,Frp不但可以将客户端本地端口、客户端能访问到的内网其他计算机端口映射至远程服务器,还可以将服务器能访问到的本地/其他计算机的任意端口映射至本地。更关键的是,SSH作为一个任何发行版都有的必备软件,其安全性拥有足够的保障。我们知道,根据Don't Break Debian,在使用Debian等Linux系统时,只使用系统包管理器所提供的包是Debian所提倡的。这些Debian所提供的包拥有极高的安全性,只要保持发行版的更新,漏洞就会几乎不可能存在。而运行第三方软件如Frp,则无法保障其安全性,并且,当进行dist-upgrade时,第三方软件很可能破坏Debian的包依赖关系,造成无法欲知的问题。(当然,golang写的软件应该还好)。

Nginx与PHP相关交互参数详解

我们知道,在传统的Apache Httpd中,php是作为Apache的一个mod直接成为Apache的一部分的。好处是Apache和PHP的交互配置简单,无需过多操心。但弊端非常明显,Apache在处理不需要运行php mod的静态资源时,由于php mod已经启用了,所以仍然会加载,使得性能下降。近年来流行起来的Nginx在短短几年,市场份额便与Apache平分秋色,但Nginx与PHP交互的方式FastCGI在配置时可能会使得习惯了Apache的人略感繁琐,在这里详细分析一下。

对计算机字体渲染的一些研究

今天中午我雪和我偶然的说起我在Win8截的图中字体渲染方式似乎和他的Win10不同,想到我们都从来没有在意过计算机字体渲染方面的学问,我粗略的去Google和Wikipedia翻了一番,将补到的一些基础知识记录一下。