openwrt中taiscale自动安装脚本详解

openwrt中taiscale自动安装脚本详解

一、代码仓库地址

https://github.com/adyanth/openwrt-tailscale-enabler

二、代码仓库中脚本文件详解

主要包含三个脚本分别是etc/init.d/tailscaleusr/bin/tailscaleusr/bin/tailscaled ,接下来逐个分析一下脚本中的具体内容:

在这里插入图片描述

1、etc/init.d/tailscale

这个脚本在 OpenWRT 系统初始化时执行,用于控制 Tailscale 守护进程的启动和停止。脚本具体内容如下:

#!/bin/sh /etc/rc.common

# 版权声明,表明脚本归 Google LLC 所有,使用 Apache-2.0 许可。

USE_PROCD=1  # 使用 procd,OpenWRT 的进程管理守护程序。
START=99     # 设置脚本启动的顺序,数字越大越后启动。
STOP=1       # 设置脚本停止的顺序,数字越小越先停止。

# start_service 函数定义了服务启动时的行为。
start_service() {
  procd_open_instance  # 开启一个新的 procd 实例。
  procd_set_param command /usr/bin/tailscaled  # 设置要运行的命令(Tailscale 守护进程)。

  # 设置 Tailscale 监听 VPN 数据包的端口号。
  # 远程节点将自动获悉新端口号,但如果要设置外部防火墙规则,则可能需要配置此项。
  procd_append_param command --port 41641

  # OpenWRT 的 /var 是链接到 /tmp 的,所以将持久状态写到别的地方。
  procd_append_param command --state /etc/config/tailscaled.state
  
  # 为 TLS 证书和 Taildrop 持久化文件
  procd_append_param command --statedir /etc/tailscale/

  procd_set_param respawn  # 设置进程崩溃后自动重启。
  procd_set_param stdout 1 # 将标准输出重定向到系统日志。
  procd_set_param stderr 1 # 将标准错误输出也重定向到系统日志。

  procd_close_instance  # 关闭 procd 实例。
}

# stop_service 函数定义了服务停止时的行为。
stop_service() {
  /usr/bin/tailscaled --cleanup  # 执行 Tailscale 守护进程的清理操作。
}

2、usr/bin/tailscale

这个脚本首先检测系统架构并下载适用于该架构的 Tailscale 版本。它还确保下载最新版本的 Tailscale。脚本使用 wget 工具从 Tailscale 官方网站下载 tar 压缩包,并将其解压到 /tmp 目录。最后,脚本尝试运行解压后的 Tailscale 程序。脚本具体内容如下:

#!/bin/sh

# 当脚本中的任何命令执行失败时,脚本将停止执行。
set -e

# 检查是否已有 /tmp/tailscale 文件,如果没有,则执行后续安装步骤。
if [ ! -f /tmp/tailscale ]; then
    # 获取当前系统的架构类型。
    arch=$(uname -m)
    # 对于 MIPS 架构,进一步确定是大端(be)还是小端(le)。
    if [ "$arch" == "mips" ]; then
        endianness=$(echo -n I | hexdump -o | awk '{ print (substr($2,6,1)=="1") ? "le" : ""; exit }')
    # 对于其他架构类型,进行名称调整以匹配 Tailscale 的命名规则。
    elif [ "$arch" == "armv7l" ]; then
        arch=arm
    elif [ "$arch" == "aarch64" ]; then
        arch=arm64
    elif [ "$arch" == "x86_64" ]; then
        arch=amd64
    fi

    # 设置 Tailscale 的默认版本号。
    tailscale_version="1.56.1"

    # 从 Tailscale 的官方网站获取最新版本号。
    
    latest_version=$(wget -O- https://pkgs.tailscale.com/stable/ | grep tailscale_ | head -1 | cut -d'_' -f 2)
    # 如果最新版本号与默认版本号不同,则使用最新版本号。
    if [ "$tailscale_version" != "$latest_version" ]; then
        tailscale_version=$latest_version
    fi

    # 组合出完整的 Tailscale 版本号。
    version="${tailscale_version}_${arch}${endianness}"

    # 显示下载信息。
    echo "Downloading Tailscale ${version} .."

    # 创建文件列表,用于指定 tar 命令解压哪些文件。
    echo -e "tailscale_${version}/tailscale" > /tmp/tailscale_${version}_files.txt

    # 如果 /tmp/tailscaled 文件不存在,则将其添加到文件列表中。
    if [ ! -f /tmp/tailscaled ]; then
        echo -e "tailscale_${version}/tailscaled" >> /tmp/tailscale_${version}_files.txt
    fi

    # 下载并解压 Tailscale。
    wget -O- https://pkgs.tailscale.com/stable/tailscale_${version}.tgz | tar x -zvf - -C /tmp -T /tmp/tailscale_${version}_files.txt

    # 移动解压后的文件到 /tmp 目录,并清理不再需要的文件。
    mv /tmp/tailscale_$version/* /tmp
    rm -rf /tmp/tailscale_${version}*

    # 显示下载完成信息。
    echo "Done!"
fi

# 运行 Tailscale,传递任何给脚本的参数。
/tmp/tailscale "$@"

这句详细解释一下每个命令具体含义:

wget -O- https://pkgs.tailscale.com/stable/ | grep tailscale_ | head -1 | cut -d'_' -f 2
  1. wget -O- https://pkgs.tailscale.com/stable/
    • 这个命令使用 wget 从指定的 URL 下载数据。
    • -O- 参数指示 wget 将下载的内容输出到标准输出(stdout),而不是保存为文件。
  2. | grep tailscale_
    • 通过管道(|),将 wget 的输出传递给 grep 命令。
    • grep 命令搜索包含 “tailscale_” 的文本行。
  3. | head -1
    • 再次通过管道将 grep 的输出传递给 head 命令。
    • head -1 命令提取传入数据的第一行。
  4. | cut -d'_' -f 2
    • 最后,将 head 的输出传递给 cut 命令。
    • cut 命令按照指定的分隔符(这里是下划线 _)分割文本,并提取第二段文本(-f 2)。
3、usr/bin/tailscaled

这个脚本的主要作用是检查并下载最新版本的 Tailscale,然后在 /tmp 目录下运行它。脚本首先确定运行它的系统的架构类型,然后下载并解压适合该架构的 Tailscale 版本。如果 /tmp/tailscaled 文件已存在,脚本不会执行下载和安装步骤。脚本具体内容如下:

#!/bin/sh

# 当任何语句的执行结果不是true时就退出脚本
set -e

# 检查/tmp/tailscaled文件是否存在,如果不存在,则执行后续的安装步骤
if [ ! -f /tmp/tailscaled ]; then
    # 获取系统的架构类型
    arch=$(uname -m)
    # 如果架构是mips,则进一步确定是大端(be)还是小端(le)
    if [ "$arch" == "mips" ]; then
        endianness=$(echo -n I | hexdump -o | awk '{ print (substr($2,6,1)=="1") ? "le" : ""; exit }')
    # 对于其他架构类型,进行名称调整以匹配 Tailscale 的要求
    elif [ "$arch" == "armv7l" ]; then
        arch=arm
    elif [ "$arch" == "aarch64" ]; then
        arch=arm64
    elif [ "$arch" == "x86_64" ]; then
        arch=amd64
    fi

    # 设置 Tailscale 的默认版本
    tailscale_version="1.56.1"

    # 从 Tailscale 的官方网站获取最新版本号
    latest_version=$(wget -O- https://pkgs.tailscale.com/stable/ | grep tailscale_ | head -1 | cut -d'_' -f 2)
    # 如果最新版本号与默认版本号不同,则使用最新版本
    if [ "$tailscale_version" != "$latest_version" ]; then
        tailscale_version=$latest_version
    fi

    # 组合出完整的 Tailscale 版本号
    version="${tailscale_version}_${arch}${endianness}"

    # 显示下载信息
    echo "Downloading Tailscale ${version} .."

    # 记录要下载的文件列表
    echo -e "tailscale_${version}/tailscaled" > /tmp/tailscale_${version}_files.txt

    # 从 Tailscale 的官方网站下载并解压相应版本的 Tailscale
    wget -O- https://pkgs.tailscale.com/stable/tailscale_${version}.tgz | tar x -zvf - -C /tmp -T /tmp/tailscale_${version}_files.txt

    # 移动解压后的文件并清理临时文件
    mv /tmp/tailscale_$version/* /tmp
    rm -rf /tmp/tailscale_${version}*

    # 显示下载完成信息
    echo "Done!"
fi

# 执行 Tailscale
/tmp/tailscaled "$@"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/252452.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】AOF 基础

因为 Redis AOF 的实现有些绕, 就分成 2 篇进行分析, 本篇主要是介绍一下 AOF 的一些特性和依赖的其他函数的逻辑,为下一篇 (Redis AOF 源码) 源码分析做一些铺垫。 AOF 全称: Append Only File, 是 Redis 提供了一种数据保存模式, Redis 默认不开启。 AOF 采用日志的形式来记…

Go标准包之flag命令行参数解析

1.介绍 在 Go中,如果要接收命令行参数,需要使用 flag 包进行解析。不同的参数类型可以通过不同的方法接收。 2.参数接受 2.1 接受方式 使用flag接收参数,可以由以下三种方式接受: 方式一: flag.Type(name,defaultVal,desc)方…

Linux上使用HTTP协议进行数据获取的实战示例

嗨,Linux爱好者们,今天我们要一起探讨一下如何在Linux上进行HTTP协议的数据获取。这不是一项简单的任务,但放心,我会以最简单的语言,结合实例来给大家讲解。 首先,我们需要一个工具,那就是curl…

Python生成器(Generator)(继续更新...)

学习网页: Welcome to Python.orghttps://www.python.org/https://www.python.org/ Python生成器 生成器(Generator)是 Python 的一种特殊类型的迭代器。生成器允许你创建自己的数据流,每次从数据流中获取一个元素,…

医保电子凭证在项目中的集成应用

随着医保电子凭证使用普及,医疗行业的各个场景都要求支持医保码一码通办,在此分享一下,在C#和js中集成医保电子凭证的demo 供有需要的小伙伴参考。 一、项目效果图 在c#中集成医保电子凭证效果 在js中集成医保电子凭证效果 二、主要代码 c#…

Linux_Docker图形化工具Portainer如何安装并结合内网穿透实现远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…

算法竞赛备赛进阶之树形DP训练

目录 1.树的最长路径 2.树的中心 3.数字转换 4.二叉苹果树 5.战略游戏 6.皇宫守卫 树形DP是一种动态规划方法,主要用于解决树形结构的问题。在树形DP中,通常会使用动态规划的思想来求解最优化问题。其核心在于通过不断地分解问题和优化子问题来解决…

【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇

在我们使用sa-token安全框架的时候,有时候会提示:SaTokenException:非Web上下文无法获取Request 错误截图: 在官方网站中,查看常见问题排查: 错误追踪: 跟着源码可以看到如下代码: 从源码中&a…

01 整体代码运行流程

文章目录 01 整体代码运行流程1.1 运行官方 Demo1.2 变量命名规则1.3 多线程1.4 线程锁1.5 SLAM 主类 System 01 整体代码运行流程 1.1 运行官方 Demo 以 stereo_kitti 为例,执行 ./stereo_kitti path_to_vocabulary path_to_settings path_to_sequence./stereo_…

大创项目推荐 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数:2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

W25Q64(模拟SPI)读写数据的简单应用

文章目录 一、W25Q64是什么?二、使用步骤1.硬件1.引脚说明2.硬件连接3.设备ID4.内部框架5.指令集指令集1指令集2 2.软件1.W25Q64引脚定义代码如下(示例):2.W25Q64初始化代码如下(示例):3.W25Q64…

在排序数组中查找元素的第一个和最后一个位置(Java详解)

一、题目描述 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示…

Android开发——组合函数、注解与连接Android设备

1、JetPack Compose、组合函数与注解和文本修改 1、JetPack Compose:Jetpack Compose 是由 Google 推出的用于构建 Android 用户界面的现代化工具包。它是一个声明式的 UI 工具包,用于简化 Android 应用程序的用户界面设计和开发。Jetpack Compose 采用…

02.Git常用基本操作

一、基本配置 (1)打开Git Bash (2)配置姓名和邮箱 git config --global user.name "Your Name" git config --global user.email "Your email" 因为Git是分布式版本控制工具,所以每个用户都需要…

02-分组查询group by和having的使用

分组查询 MySQL中默认是对整张表的数据进行操作即整张表为一组, 如果想对每一组的数据进行操作,这个时候我们需要使用分组查询 分组函数的执行顺序: 先根据where条件筛选数据,然后对查询到的数据进行分组,最后也可以采用having关键字过滤取得正确的数据 group by子句 在一条…

【STM32】STM32学习笔记-EXTI外部中断(11)

00. 目录 文章目录 00. 目录01. 中断系统02. 中断执行流程03. STM32中断04. NVIC基本结构05. NVIC优先级分组06. EXTI简介07. EXTI基本结构08. AFIO复用IO口09. EXTI框图10. 计数器模块11. 旋转编码器简介12. 附录 01. 中断系统 中断:在主程序运行过程中&#xff0…

easy贪吃蛇

之前承诺给出一个贪吃蛇项目。 1.EasyX库认知 有关EasyX库的相关信息,您可以看一下官方的文档:EasyX官方文档。 这里我做几点总结: EasyX库就和名字一样,可以让用户调用一些简单的函数来绘制图像和几何图形利用EasyX库可以制作…

ES6 面试题 | 15.精选 ES6 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

知识付费平台选择指南:如何找到最适合你的学习平台?

在当今的知识付费市场中,用户面临的选择越来越多,如何从众多知识付费平台中正确选择属于自己的平台呢?下面,我们将为您介绍我有才知识付费平台相比同行的优势,帮助您做出明智的选择。 一、创新的技术架构,…

3.3【窗口】窗口的几何形状(二,窗口属性)

写在前面 应用程序使用窗口来显示内容。一些属性决定了窗口及其内容的大小和位置。其他属性决定了窗口内容的外观和解释。 了解窗口属性引用的两个坐标系非常重要。如果你知道你正在使用的坐标系,那么为你的窗口属性选择设置值会容易得多,并且会更有意义。 一,显示相关属…