network学习
Dockerfile
-
基础镜像是
polar-base
,架构为x86_64
-
apt-get update
命令,用于更新软件包列表,&& \
表示继续下一行命令。 -
安装了一系列软件包,
--force-yes
参数用于强制安装软件包,-y
参数表示自动回答"yes"。 -
apt-get clean
清理了APT缓存 -
rm -rf /var/lib/apt/lists/*
:删除了APT软件包列表,以减小镜像大小 -
COPY __DIRECTORY_NAME__ /__DIRECTORY_NAME__
: 这一行将__DIRECTORY_NAME__
目录复制到镜像的/__DIRECTORY_NAME__
目录下。 -
COPY start.sh /start.sh
: 这一行将start.sh
文件复制到镜像的根目录下。 -
其余的
COPY
命令类似地将其他文件复制到镜像中的不同目录。 -
ENTRYPOINT ["/__DIRECTORY_NAME__/jsrun.sh"]
: 这一行指定了容器启动时要运行的命令或脚本为/__DIRECTORY_NAME__/jsrun.sh
。
【敲重点】在基于x86_64架构的polar-base
镜像上安装软件包,并将一些文件复制到镜像中,最后设置了容器的入口点为jsrun.sh
脚本。
jsrun.sh脚本
-
max_pid=$(ps -eo pid= | sort -nr | head -n 1)
: 这一行通过ps
命令列出当前所有进程的PID,然后通过sort -nr
按照数字大小逆序排序,最后通过head -n 1
获取排序后的第一个PID,即最大的PID。 -
max_pid=$(($max_pid + 100))
: 这一行将最大PID增加100。 -
for i in $(seq 1 $max_pid); do ls >/dev/null 2>&1; done
: 这个循环会执行ls
命令,将其输出重定向到/dev/null
,以忽略ls
命令的输出。循环次数为$max_pid次,即之前获取的最大PID加100。2>&1
表示将标准错误输出重定向到标准输出,这样任何错误信息也会被丢弃。 -
- 如果
$NETWORK_MODE
的值等于3或6,则OUT_IFNAME_LIKE
被设置为"ipfsbit"。 - 如果
$NETWORK_MODE
的值等于4或5,则OUT_IFNAME_LIKE
被设置为"ppp"。
- 如果
-
WORKING_DIRECTORY=$(dirname "$0")
: 这行代码使用dirname "$0"
获取当前脚本文件的目录路径,并将其赋值给WORKING_DIRECTORY
变量。$0
代表当前脚本的文件名。 -
cd $WORKING_DIRECTORY
: 这行代码将当前工作目录切换到WORKING_DIRECTORY
所指定的目录,即当前脚本文件所在的目录。 -
export PATH=$PATH:$WORKING_DIRECTORY
: 这行代码将当前目录添加到系统的PATH环境变量中,以便系统可以在搜索可执行文件时包含当前目录。通过将当前工作目录添加到PATH中,您可以直接在脚本中执行当前目录下的可执行文件,而无需指定完整路径。
pre_start -
JS_BACKUP_DIR=/storage/$(echo $IMAGE_VERSION | cut -d':' -f2 | cut -d'-' -f1)
: 这一行设置了一个变量JS_BACKUP_DIR
,根据$IMAGE_VERSION
的值提取特定部分并拼接成一个目录路径。 -
if [[ -f "${JS_BACKUP_DIR}/cache-node" && -f "${JS_BACKUP_DIR}/libkcg.so" ]]
: 这个条件语句检查是否存在${JS_BACKUP_DIR}/cache-node
和${JS_BACKUP_DIR}/libkcg.so
两个文件。 -
cp -rf ${JS_BACKUP_DIR}/* /mc-spider-pcdn
: 如果上述文件都存在,则将${JS_BACKUP_DIR}
目录下的所有内容复制到/mc-spider-pcdn
目录中。 -
else
: 如果上述文件不存在,则执行以下操作:- 检查
/mc-spider-pcdn/cache-node
和/mc-spider-pcdn/libkcg.so
文件是否存在。 - 如果它们存在,则执行
true
,表示不执行任何操作。 - 如果它们不存在,则执行以下操作:
- 根据条件选择将
/mc-spider-pcdn/spider-pcdn-ipv4
或/mc-spider-pcdn/spider-pcdn-ipv6
目录下的内容复制到/mc-spider-pcdn
目录中。 - 删除
/mc-spider-pcdn/spider-pcdn-ipv4
和/mc-spider-pcdn/spider-pcdn-ipv6
目录。
- 根据条件选择将
- 创建
${JS_BACKUP_DIR}
目录,并将/mc-spider-pcdn/cache-node
和/mc-spider-pcdn/libkcg.so
文件复制到该目录中。
- 检查
-
chmod +x /mc-spider-pcdn/cache-node
: 最后一行将/mc-spider-pcdn/cache-node
文件设置为可执行权限。
start_js_one
-
if [[ ! -z "$OUT_IFNAME_LIKE" ]]
: 这个条件语句检查变量$OUT_IFNAME_LIKE
是否为空。如果不为空,则执行以下操作:- 使用
ip link
命令获取网络接口信息,然后通过一系列的grep
、tr
、awk
和xargs
命令筛选出符合条件的网卡名称,并将结果存储到OUT_IFNAME_ARRAY
数组中。
- 使用
-
else
: 如果$OUT_IFNAME_LIKE
为空,则执行以下操作:- 使用
ip route show default
命令获取默认路由信息,然后通过一系列的grep
、awk
和xargs
命令筛选出默认网络接口的名称,并将结果存储到OUT_IFNAME_ARRAY
数组中。
- 使用
-
local OUT_IFNAME_NUM=${#OUT_IFNAME_ARRAY[@]}
: 这行代码获取OUT_IFNAME_ARRAY
数组的长度,即网络接口名称的数量,并将其存储在OUT_IFNAME_NUM
变量中。 -
local index=$((DOCKER_INDEX-1))
: 这行代码将DOCKER_INDEX
减去1的结果存储在index
变量中。 -
local nic=${OUT_IFNAME_ARRAY[$((${DOCKER_INDEX}%${OUT_IFNAME_NUM}))]}
: 这行代码计算出要使用的网络接口名称,通过取余数的方式从OUT_IFNAME_ARRAY
数组中选择一个网络接口名称,并将其存储在nic
变量中。 -
export IFNAME=$nic
: 将选择的网络接口名称存储在IFNAME
环境变量中,以便后续使用。 -
spider-pcdn.sh >/dev/null 2>&1 &
: 最后一行启动一个名为spider-pcdn.sh
的脚本,并将其输出重定向到/dev/null,以便在后台运行,不显示任何输出。
【敲重点】定义参数+文件备份,目录复制+选择网络接口名称+启动spider-pcdn.sh脚本
在脚本中引入另一个名为core.sh
的脚本文件,以扩展当前脚本的功能。
调用了一个名为pre_start
的函数,文件备份和目录内容复制等操作。
如果$TOGETHER
等于1,则调用start_js_one
函数(根据条件选择网络接口名称)并启动spider-pcdn.sh
脚本。
如果$TOGETHER
不等于1,调用start_js
函数,直接启动spider-pcdn.sh
脚本在后台运行。
while : do sleep 3600 done
: 每3600秒(1小时)执行一次sleep
命令,使脚本保持运行状态。
spider-pcdn.sh
-
echo $
:$
是一个特殊变量,表示当前进程的进程号(PID)。在这里,echo $
会输出当前进程的 PID。 -
> /tmp/mc-spider-pcdn.pid
:>
符号用于将命令的输出重定向到指定文件中。在这里,echo $
的输出(当前进程的 PID)会被重定向并写入一个名为/tmp/mc-spider-pcdn.pid
的文件中。
这行代码是一个 Bash 脚本中的条件语句,用于检查变量$guid
是否为空(即长度为0)。具体解释如下: -
if [[ -z "$guid" ]]; then
:这是一个条件语句的开始,其中[[ -z "$guid" ]]
是条件判断部分,-z
表示检查变量是否为空。$guid
是要检查的变量。 -
march=$(arch | tr ‘a-z’ ‘A-Z’ | sed ‘s/_64//g’) 系统架构信息
arch
命令用于显示当前系统架构信息。tr 'a-z' 'A-Z'
将arch
命令输出的小写字母转换为大写字母。sed 's/_64//g'
用于删除字符串中所有的_64
子串。
-
mkdir -p $spider_pcdn_path 指定要创建的目录路径
mkdir -p
是一个常见的命令,用于创建目录。-p
选项表示递归创建目录,即如果上级目录不存在也会一并创建。
-
upnpc -e $description -a $local_ip $js_port $js_port tcp || upnpc -e $description -n $local_ip $js_port $js_port tcp
尝试添加一个端口映射规则,如果添加失败(可能是因为规则已存在),则强制添加一个新的端口映射规则-e $description
:这里-e
选项用于指定规则的描述信息,$description
是描述信息的变量。-a
表示添加端口映射规则。$local_ip
是本地IP地址。$js_port
是要映射的本地端口。tcp
表示映射的协议为 TCP。
-
kill -s USR1 PID
kill
命令用于向指定的进程发送信号。-s USR1
参数指定了要发送的信号为USR1
,这是一个用户自定义的信号,可以被接收进程用来执行特定的操作。 -
trap ‘restart’ SIGUSR1 当接收到
SIGUSR1
信号时,执行后面的'restart'
部分 -
NAT=$(cat /tmp/nat-tun.log | jq -r ‘.nat’)
- 这行代码从
/tmp/nat-tun.log
文件中读取内容,然后使用jq
工具解析 JSON 格式的数据。 jq -r '.nat'
的作用是从 JSON 数据中提取nat
字段的值,并使用-r
标志以原始文本形式输出,而不是带引号的字符串。
- 这行代码从
-
ip=$(ip addr show $device | grep -v “inet6” | grep “inet” | awk ‘{print $2}’ | cut -d’/’ -f1) 提取出 IPv4 地址
-
ip addr show $device
:这部分命令使用ip addr show
命令显示指定设备($device
)的网络配置信息。这会列出该设备的所有网络配置,包括 IPv4 和 IPv6 地址。 -
grep -v "inet6"
:这一步使用grep
命令过滤掉包含 “inet6” 的行,即过滤掉 IPv6 地址的行,只保留包含 IPv4 地址的行。 -
grep "inet"
:接着使用grep
命令筛选出包含 “inet” 的行,即只保留包含 IPv4 地址的行。 -
awk '{print $2}'
:使用awk
命令提取每一行中的第二列,即 IPv4 地址加上掩码位数(例如,192.168.1.1/24)。 -
cut -d'/' -f1
:最后使用cut
命令以/
为分隔符,只保留每行中的第一部分,即去掉掩码位数,只留下纯粹的 IPv4 地址。
-
-
ip route get 223.5.5.5 | head -n 1 | grep -o "dev \w+.?\w+ " | awk ‘{print $2}’ 网络接口名称
-
ip route get 223.5.5.5
:这部分命令使用ip route get
命令来获取到目标地址223.5.5.5
的路由信息。 -
head -n 1
:通过head -n 1
命令只保留输出的第一行,即路由信息中与目标地址最相关的那一行。 -
grep -o "dev \w\+\.\?\w\+ "
:使用grep -o
命令查找匹配模式"dev \w\+\.\?\w\+ "
的部分,这个模式匹配了以 "dev " 开头的网络接口名称。其中:dev
匹配 "dev " 字符串。\w\+
匹配一个或多个字母、数字或下划线。\.\?
匹配零个或一个点号。\w\+
再次匹配一个或多个字母、数字或下划线。- 最后的空格确保匹配到整个 "dev interface_name " 格式。
- isp=$(curl dcs.linkfog.cn/api/v2/network/ISP),使用 curl 命令从指定的 URL获取数据
- SPEED=$(echo yes | /usr/bin/speedtest --accept-license --progress=no -f json --output-header -b | jq ‘.upload .bandwidth’ 2>/dev/null) 执行一个speedtest测试,提取上传带宽信息
echo yes | /usr/bin/speedtest --accept-license --progress=no -f json --output-header -b
: 这部分命令执行了一个speedtest测试,使用了一些参数:echo yes
:这是将"yes"字符串输出的一种方式,可能是用于确认或者接受某些询问。/usr/bin/speedtest
:这是执行speedtest测试的可执行文件的路径。--accept-license
:这个参数可能是用于接受许可协议。--progress=no
:这个参数可能是用于关闭进度显示。-f json
:这个参数指定输出格式为JSON。--output-header -b
:这些参数可能是用于输出头信息和带宽信息。
【敲重点】获取参数值
service-scripts
-
FORMAT = “[%(filename)s:%(lineno)s - %(funcName)20s() - %(asctime)-15s ] %(message)s”
这行代码定义了一个日志格式字符串,通常用于配置日志记录器(logger)的输出格式。让我解释一下这个格式字符串中的各个部分:%(filename)s
:日志消息所在的文件名。%(lineno)s
:日志消息所在的行号。%(funcName)20s
:日志消息所在的函数名,宽度为20个字符。%(asctime)-15s
:日志记录的时间,左对齐,宽度为15个字符。%(message)s
:日志消息的内容。
-
mount,用于挂载文件系统到指定的挂载点。
-
umount ,卸载挂载点
-
modprobe: 加载内核模块
-
iptables -t raw -D OUTPUT -m cgroup --cgroup {classid} -j ACCEPT这条命令的作用是从IPv4的raw表中删除一个输出规则。具体解释如下:
iptables
: 这是用于配置IPv4防火墙规则的命令。-t raw
: 指定要操作的表为raw表,raw表是iptables中的一个特殊表,用于在数据包进入网络协议栈之前进行处理。-D OUTPUT
: 表示删除输出链中的规则。-m cgroup --cgroup {classid}
: 使用cgroup模块,指定要匹配的cgroup类别的classid。-j ACCEPT
: 表示如果数据包符合规则,则接受该数据包。
因此,这条命令的目的是从IPv4的raw表中删除一个针对特定cgroup类别的输出规则,允许匹配到该规则的数据包通过防火墙。
-
ip6tables -t raw -L -v -n >/dev/null 2>&1
-
ip6tables
: 这是用于配置IPv6防火墙规则的命令。-t raw
: 指定要操作的表为raw表,raw表是iptables中的一个特殊表,用于在数据包进入网络协议栈之前进行处理。-L
: 列出规则。-v
: 显示详细的信息,包括数据包和字节计数。-n
: 显示数值格式的IP地址和端口号。>/dev/null
: 将标准输出重定向到/dev/null
,即丢弃输出。2>&1
: 将标准错误输出重定向到标准输出,也就是将错误信息也重定向到/dev/null
,这样错误信息也会被丢弃。
总之,这条命令的作用是在IPv6的raw表中列出所有规则,但将输出和错误信息都重定向到/dev/null
,以实现静默执行并丢弃输出。
-
ip6tables -t mangle -D OUTPUT ! -o lo -m cgroup --cgroup {classid} -j ACCEPT
这条命令的作用是从IPv6的mangle表中删除一个输出规则。具体解释如下:ip6tables
: 这是用于配置IPv6防火墙规则的命令。-t mangle
: 指定要操作的表为mangle表,mangle表用于修改数据包的特定字段。-D OUTPUT
: 表示删除输出链中的规则。! -o lo
: 表示匹配不是发往本地回环接口(lo
)的数据包。-m cgroup --cgroup {classid}
: 使用cgroup模块,指定要匹配的cgroup类别的classid。-j ACCEPT
: 表示如果数据包符合规则,则接受该数据包。
因此,这条命令的目的是从IPv6的mangle表中删除一个针对特定cgroup类别的非本地回环接口的输出规则,允许匹配到该规则的数据包通过防火墙。
原文地址:https://blog.csdn.net/qq_51636863/article/details/137506146
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!