2020年8月9日星期日

Windows 使用高级技巧

一、创建目录的软连接:

以管理员身份运行命令提示符,输入mklink /j 并按一下空格键,此时不要回车先放着,我们键入即将生成软连接的目录路径, 两次复制路径之间要加入【空格键】,再次键入真实目录的路劲。
如果说你的文件夹有空格,那就要用英文的【”】这一个符号把路径框起来,像这样。

示例:

mklink /j "D:\Users\李宇鸿\Pictures\Lightroom" "M:\0-Data\Lightroom"

"D:\Users\User\Pictures\Lightroom" 即将生成软连接的目录
"M:\0-Data\Lightroom" 真实存在的目录

正常下可以回车,如果出现文件已存在就把即将生成软连接的文件夹删掉,当原本文件夹下出现一个带有像是“快捷方式”一样的角标的文件夹后,我们可以打开软件验证一下看看是不是还是能正常读写。注意,虽然软连接长得像是快捷方式,但他们完全不是一个东西。

1.建立举例

建立d:develop链接目录,指向远程的目标服务器上的e盘的对应目录。
mklink /d d:\develop \\138.20.1.141\e$\develop

建立d:develop链接目录,指向远程的目标服务器上的e盘的对应目录。
mklink /d d:\recivefiles \\138.20.1.141\e$\recivefiles

2.删除举例

删除虚拟的链接目录,并不会删除远程文件夹真实文件,注意千万不能用deldel会删除远程的真实文件。
rmdir d:\recivefiles
rmdir d:\develop
3.常用路径
mklink /j "C:\Windows\Temp" "B:\TEMP"

二、Win10自带输入法的使用技巧

U模式:输入u后直接输入对应的代码即可快速输入相关字符。
V模式:输入v后直接输入数字即可看见大小写转换。
emoji、颜文字与符号面板:使用 Ctrl + Shift + B 即可唤出。

三、查看系统信息

Win+R输入control.exe /name Microsoft.System,回车 ,打开Win10系统的关于。
快捷键win+printerscreen来打开
Win+R输入 msinfo32 ,回车 ,打开系统信息。

四、系统设置

1.开启休眠功能:在cmd 命令窗口中输入 powercfg -h on
2. 关闭休眠功能:在cmd 命令窗口中输入 powercfg -h off
3.即可将这台计算机的 C:\Hiberfil.sys 减小为 物理内存的 70%。powercfg -h -size 70

五、家庭版升级专业版

Win10家庭版升级到专业版密钥 (任选其一即可)
J7QT3-3GCPG-9GVWT-CH2XR-GMRJM
VK7JG-NPHTM-C97JM-9MPGT-3V66T

六、新增本地账户

1、win键+R键 打开运行
2、输入netplwiz 回车打开设置界面

Docker 安装 OpenWrt

拉取 OpenWrt 镜像

docker pull unifreq/openwrt-aarch64:latest
docker pull kanshudj/n1-openwrtgateway:r20

# 任选一,如镜像作者在官方 hub 增删改过标签而无法拉取,请对照官方信息。

导入OpenWrt 镜像
docker load -i openwrt-aarch64.tar
docker import /root/openwrt-armvirt-64-default-rootfs.tar.gz openwrt:r20.01.24

宿主机开启网卡混杂模式 promisc

# 启用
ifconfig eth0 promisc
#ifconfig wlan0 promisc

# 关闭
ifconfig eth0 -promisc
#ifconfig wlan0 -promisc

# 查询
ifconfig eth0 => 成功标志:PROMISC

#ip link set eth0 promisc on
#ip link set wlan0 promisc on/off
# https://wangchujiang.com/linux-command/c/ip.html

# 设置 promisc 模式重启会失效,解决:
方法 A:
# SSH 命令:
sed -i '/exit 0/i\ifconfig eth0 promisc' /etc/rc.local
#sed -i '/exit 0/i\ip link set eth0 promisc on' /etc/rc.local

方法 B(未测试):
# 编辑 /etc/network/interfaces 加入
iface eth0 inet manual
  up ifconfig eth0 0.0.0.0 up
  up ifconfig eth0 promisc
这一步可以忽略。

Wikipedia:一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。网卡的混杂模式一般在网络管理员分析网络数据作为网络故障诊断手段时用到,同时这个模式也被网络黑客利用来作为网络数据窃听的入口。在 Linux 操作系统中设置网卡混杂模式时需要管理员权限。在 Windows 操作系统和 Linux 操作系统中都有使用混杂模式的抓包工具,比如著名的开源软件 Wireshark。

创建 macvlan 网络

docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=eth0 macvlan

# 解释:
从宿主机 eth0 网卡虚拟出子网卡接口,子网段是 192.168.0.0/24,网关是 192.168.0.1 的 macvlan 网络,名字叫 macvlan。
一个 eth0 只能创建一个 macvlan 网络,但有其它办法多开。

参数:
-d macvlan              # 创建类型为 macvlan 网络模式。
--subnet                # 创建大池网段,指定容器网段获取范围。
--ip-range              # 创建小池网段,指定容器网段获取范围。
--gateway               # 网关,继承宿主机所在网关(主路由 IP )。
-o parent=eth0          # 解释:-o -> option / parent=eth0,指 macvlan 模式继承的物理接口。
-o macvlan_mode bridge  # macvlan 模式,默认就是 bridge,不用理会。
macvlan_lan             # 定义该 macvlan 的名字。
查看 macvlan 是否创建成功

# 查看命令
docker network ls

# 查看 docker 网桥详细
docker network inspect macvlan_lan

创建 OpenWrt 容器

# 忽略
docker rm -f OpenWrt

# 运行
示例:
docker run --restart always -d --network macvlan --privileged unifreq/openwrt-aarch64:latest  /sbin/init

docker run -d \
    --restart always \
    --privileged \
    --network macvlan \
    --ip 192.168.2.200 \
    unifreq/openwrt-aarch64:latest

# 参数:
-d                  # 后台运行
--name              # 容器名字
--restart always    # 自启
--privileged        # 容器提权
--network           # 指定哪个 macvlan 网络,这里是 macvlan
--ip                # 必须指定 ip,防止局域网 ip 冲突

查看容器名称
docker ps -a


查看 OpenWrt 网络配置

docker exec 查询出来的容器名称 ifconfig
示例:
docker exec 0ae353551c4d ifconfig

# 查看到 br-lan 显示的是错误地址 192.168.1.1,下面会修改成正确地址。
# 只看到 lo 请忽略。
进入 OpenWrt shell 修正网络参数

docker exec -it 0ae353551c4d bash

vi /etc/config/network
按下 i

# 建议 proto 使用 static 而不使用 dhcp。
config interface 'lan'
        option type 'bridge'
        option ifname 'eth0'
        option proto 'static'
        option ipaddr '192.168.0.200'
        option netmask '255.255.255.0'
        option gateway '192.168.0.1'
        option dns '192.168.2.1'
        option ip6assign '60'

# 退出保存
esc -> :wq

# 重启 OpenWrt 网络服务,确认修改
/etc/init.d/network restart
ifconfig

# 退出 OpenWrt shell
exit

# 重启 OpenWrt
docker restart 0ae353551c4d

检查网络状态

docker exec OpenWrt ping 192.168.2.1    # 主路由
docker exec OpenWrt ping 223.6.6.6      # 外网
访问 Docker OpenWrt

后台:192.168.2.200
用户:root
密码:password 或 admin

# 检查设置
1.OP 打开网络 => 接口 => LAN 修改 => 网关/DNS:主路由 IP。

2.OP 打开网络 => 防火墙 => 自定义规则,添加后重启防火墙。
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

3.主路由 Padavan 设置,解决访问网站慢或在线视频卡顿。
外部网络 WAN -> 外网设置选项卡 -> IPv4 硬件加速,由 OFFLOAD TCP/UDP for LAN/WLAN,修改为 OFFLOAD TCP/UDP for LAN
路由部分

OP 打开网络 => 接口 => LAN 修改 => DHCP 服务器 (勾选忽略此接口)
主路由 Padavan 设置 => 内部网络 LAN => DHCP 服务器 => 默认网关:192.168.0.200/DNS 服务器:192.168.0.200
检查方式:OpenWrt => 状态 => 实时信息
注意善用 OpenWrt 网络 => 诊断功能。
至此完成 Docker OpenWrt 旁路由安装。


Docker镜像的导入导出

本文介绍Docker镜像的导入导出,用于迁移、备份、升级等场景,准备环境如下:

查看镜像:

docker images

查看容器:

docker ps -a

导入导出命令介绍

涉及的命令有export、import、save、load

①save 保存

命令

docker save [options] images [images...]

示例:

docker save -o nginx.tar nginx:latest

docker save > nginx.tar nginx:latest

其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)

②load 导入

命令

docker load [options]

示例:

docker load -i nginx.tar

docker load < nginx.tar

其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息

③export 导出

命令

docker export [options] container

示例:

docker export -o nginx-test.tar nginx-test

其中-o表示输出到文件,nginx-test.tar为目标文件,nginx-test是源容器名(name)

④import 导入

命令

docker import [options] file|URL|- [REPOSITORY[:TAG]]

示例:

docker import nginx-test.tar nginx:imp

cat nginx-test.tar | docker import - nginx:imp

⑤区别

export命令导出的tar文件略小于save命令导出的

export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出

基于第二点,export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,不熟悉的可以去看Dockerfile),不能进行回滚操作;而save是依据镜像来的,所以导入时可以完整保留下每一层layer信息。如下图所示,nginx:latest是save导出load导入的,nginx:imp是export导出import导入的。

⑥建议

可以依据具体使用场景来选择命令,

若是只想备份images,使用save、load即可;

若是在启动容器后,容器内容有变化,需要备份,则使用export、import。

wget高级用法

有个小资料站想整站下载保存,想起 wget 能胜任,Google 找来方法,wget 确实好用。

wget 是一个从网络上自动(可以在用户退出系统的之后在后台执行,直至任务完成)下载文件的自由工具,支持 HTTP,HTTPS 和 FTP 协议,可以使用 HTTP 代理。

wget 镜像/下载整站
wget -m 镜像站点
wget -m --no-check-certificate www.example.com
-m —— 镜像 (–mirror 等价于 -r -N -l inf -nr)
--no-check-certificate —— 不检查 SSL 证书

以递归的方式下载整站,并将页面中链接转换为本地链接
wget -r -p -np -k http://www.example.com
说明:

-r, –recursive(递归)
-k, –convert-links(转换链接、将 HTML 页面中的链接转换为相对链接即本地链接)
-p, –page-requisites(下载所有的图片等页面显示所需的内容)
-np, –no-parent(不追溯至父级)
–restrict-file-names=nocontrol 用来解决中文乱码问题(需要可以试试)
使用 wget 同步网站镜像
wget -m -L –reject = http://www.***.com/***/
来源:(原创)使用wget同步网站镜像的方法

下载整个 example.com 网站
wget --random-wait -r -p -e robots=off -U mozilla http://example.com
wget 其他使用技巧
来源:wget 使用技巧

wget -r -np -nd http://example.com/packages/
下载 http://example.com 网站上 packages 目录中所有文件。其中,-np 作用是不遍历父目录,-nd 表示不在本机重新创建目录结构。

wget -r -np -nd --accept=iso http://example.com/centos-5/i386/
与上一条命令相似,但多加一个 --accept=iso 选项,这指示 wget 仅下载 i386 目录中所有扩展名为 iso 的文件。也可以指定多个扩展名,只需用逗号分隔即可。

wget -i filename.txt
常用于批量下载,把所有需要下载文件的地址放到 filename.txt 中,然后 wget 就会自动下载所有文件。

wget -c http://example.com/really-big-file.iso
这里所指定的 -c 选项的作用为断点续传。

wget -m -k (-H) http://www.example.com/
用来镜像一个网站,wget 将对链接进行转换。如果网站中的图像是放在另外的站点,那么可以使用 -H 选项。

wget -nd -r -l1 --no-parent http://ooxx.com/packages/
下载 packages 目录下所有文件:-nd 不创建目录;-r 递归下载;-l1只下载当前目录下的文件;–no-parent 不下载父目录中的文件。

wget -nd -r -l1 --no-parent -A.ipk -A.gz http://ooxx.com/packages/
只下载 http://ooxx.com/packages/ 下 .ipk 文件和 .gz 文件。

wget -c -r -np -k -L --reject=html http://mirrors.rit.edu/rpi/images/ -e robots=off
下载网站目录下除 html 外的文件和目录,且不遵守 robots.txt 限制。

wget 各种选项分类列表
来源:博客教主 - (整理)wget 参数用法详解

启动
-V, –version 显示wget的版本后退出
-h, –help 打印语法帮助
-b, –background 启动后转入后台执行
-e, –execute=COMMAND 执行 `.wgetrc' 格式的命令,wgetrc 格式参见 /etc/wgetrc 或 ~/.wgetrc

记录和输入文件
-o, –output-file=FILE 把记录写到FILE文件中
-a, –append-output=FILE 把记录追加到FILE文件中
-d, –debug 打印调试输出
-q, –quiet 安静模式(没有输出)
-v, –verbose 冗长模式(这是缺省设置)
-nv, –non-verbose 关掉冗长模式,但不是安静模式
-i, –input-file=FILE 下载在FILE文件中出现的URLs
-F, –force-html 把输入文件当作HTML格式文件对待
-B, –base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
–sslcertfile=FILE 可选客户端证书
–sslcertkey=KEYFILE 可选客户端证书的KEYFILE
–egd-file=FILE 指定EGD socket的文件名

下载
–bind-address=ADDRESS 指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)
-t, –tries=NUMBER 设定最大尝试链接次数(0 表示无限制).
-O –output-document=FILE 把文档写到FILE文件中
-nc, –no-clobber 不要覆盖存在的文件或使用.#前缀
-c, –continue 接着下载没下载完的文件
–progress=TYPE 设定进程条标记
-N, –timestamping 不要重新下载文件除非比本地文件新
-S, –server-response 打印服务器的回应
–spider 不下载任何东西
-T, –timeout=SECONDS 设定响应超时的秒数
-w, –wait=SECONDS 两次尝试之间间隔SECONDS秒
–waitretry=SECONDS 在重新链接之间等待1…SECONDS秒
–random-wait 在下载之间等待0…2*WAIT秒
-Y, –proxy=on/off 打开或关闭代理
-Q, –quota=NUMBER 设置下载的容量限制
–limit-rate=RATE 限定下载输率

目录
-nd –no-directories 不创建目录
-x, –force-directories 强制创建目录
-nH, –no-host-directories 不创建主机目录
-P, –directory-prefix=PREFIX 将文件保存到目录 PREFIX/…
–cut-dirs=NUMBER 忽略 NUMBER层远程目录

HTTP 选项
–http-user=USER 设定HTTP用户名为 USER.
–http-passwd=PASS 设定http密码为 PASS.
-C, –cache=on/off 允许/不允许服务器端的数据缓存 (一般情况下允许).
-E, –html-extension 将所有text/html文档以.html扩展名保存
–ignore-length 忽略 `Content-Length’头域
–header=STRING 在headers中插入字符串 STRING
–proxy-user=USER 设定代理的用户名为 USER
–proxy-passwd=PASS 设定代理的密码为 PASS
–referer=URL 在HTTP请求中包含 `Referer: URL’头
-s, –save-headers 保存HTTP头到文件
-U, –user-agent=AGENT 设定代理的名称为 AGENT而不是 Wget/VERSION.
–no-http-keep-alive 关闭 HTTP活动链接 (永远链接).
–cookies=off 不使用 cookies.
–load-cookies=FILE 在开始会话前从文件 FILE中加载cookie
–save-cookies=FILE 在会话结束后将 cookies保存到 FILE文件中

FTP 选项
-nr, –dont-remove-listing 不移走 `.listing’文件
-g, –glob=on/off 打开或关闭文件名的 globbing机制
–passive-ftp 使用被动传输模式 (缺省值).
–active-ftp 使用主动传输模式
–retr-symlinks 在递归的时候,将链接指向文件(而不是目录)

递归下载
-r, –recursive 递归下载--慎用!
-l, –level=NUMBER 最大递归深度 (inf 或 0 代表无穷).
–delete-after 在现在完毕后局部删除文件
-k, –convert-links 转换非相对链接为相对链接
-K, –backup-converted 在转换文件X之前,将之备份为 X.orig
-m, –mirror 等价于 -r -N -l inf -nr.
-p, –page-requisites 下载显示HTML文件的所有图片

递归下载中的包含和不包含(accept/reject)
-A, –accept=LIST 分号分隔的被接受扩展名的列表
-R, –reject=LIST 分号分隔的不被接受的扩展名的列表
-D, –domains=LIST 分号分隔的被接受域的列表
–exclude-domains=LIST 分号分隔的不被接受的域的列表
–follow-ftp 跟踪HTML文档中的FTP链接
–follow-tags=LIST 分号分隔的被跟踪的HTML标签的列表
-G, –ignore-tags=LIST 分号分隔的被忽略的HTML标签的列表
-H, –span-hosts 当递归时转到外部主机
-L, –relative 仅仅跟踪相对链接
-I, –include-directories=LIST 允许目录的列表
-X, –exclude-directories=LIST 不被包含目录的列表
-np, –no-parent 不要追溯到父目录
wget -S –spider url 不下载只显示过程

2020年8月8日星期六

安装docker


安装docker

①快速安装
apt install docker.io

apt install docker-compose           ( 会自动安装docker.io )



②常规安装
国内主机先添加源及公钥后更新索引
使用docker-ce清华源:
deb [arch=arm64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian buster stable
安装docker-ce源公钥:
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -

开始安装
apt install docker-ce
apt install docker-ce-cli
apt install docker-compose


③Docker的启动与停止
systemctl命令是系统服务管理器指令
启动docker:
systemctl start docker

停止docker:
systemctl stop docker

重启docker:
systemctl restart docker

查看docker状态:
systemctl status docker

开机启动:
systemctl enable docker
 
查看docker概要信息
docker info

查看docker帮助文档
docker --help


④ 设置ustc的镜像
ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。

https://lug.ustc.edu.cn/wiki/mirrors/help/docker

编辑该文件:
vi /etc/docker/daemon.json 
在该文件中输入如下内容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

我们在使用 Docker 一段时间后,系统一般都会残存一些临时的、没有被使用的镜像文件,可以通过以下命令进行清理:
docker system prune -a -f
支持的子命令有:
-a, --all: 删除所有没有用的镜像,而不仅仅是临时文件;
-f, --force:强制删除镜像文件,无需弹出提示确认;
另外,执行完 docker image prune 命令后,还是告诉我们释放了多少存储空间!

docker rm -f `docker ps -a -q`               # 删除所有容器
docker rmi -f `docker images -q`           # 删除所有的镜像

Linux搭建V,2Ray客户端


1. 安装V2ray客户端

下载不同平台的安装包https://github.com/v2ray/v2ray-core

V2RAY的客户端(你需要走代理的电脑)和服务端(搭建了V2RAY服务的VPS)共用一套配置文件:config.json
1.1 在线安装
sudo su bash <(curl -L -s https://install.direct/go.sh)

该安装脚本会下载v2ray-linux-64.zip文件,如果是没有FQ的情况下,使用离线安装
1.2 离线安装

先到github上下载对应平台的软件压缩包并重命名为v2ray.zip,如不能下载手动可上传放在用户目录
wget https://install.direct/go.sh
wget -c "https://github.com/v2ray/v2ray-core/releases/download/v4.27.0/v2ray-linux-arm64-v8a.zip" -O v2ray.zip
sudo bash go.sh --local ./v2ray.zip

其中go.sh是安装自动化脚本,使用该脚本执行下载下来的离线安装包,安装过程需要root权限.


1.3安装proxy-chain
sudo apt install proxychains4
卸载
sudo apt-get --purge remove proxychains4
sudo apt autoremove proxychains4
修改参数:
sudo nano /etc/proxychains.conf
最后一行改为:
socks5 127.0.0.1 1080 这里的1080就是v2ray的socks5 代理端口,要保持和config里一致.
测试proxy-chain:
proxychains wget http://www.google.com
使用proxy-chain
proxychains bash
这就进入能自由联网的子命令行了
看自己在不在子bash里
ps -f
显示3个进程:父zsh,本zsh,ps -f子进程.只显示两个则不在子进程里.
退出,执行exit会回到父命令行中.



1.3 安装说明
使用go.sh安装完成后会在系统中自动安装以下组件:
/usr/bin/v2ray/v2ray:V2Ray 程序;
/usr/bin/v2ray/v2ctl:V2Ray 工具;
/etc/v2ray/config.json:配置文件;
/usr/bin/v2ray/geoip.dat:IP 数据文件
/usr/bin/v2ray/geosite.dat:域名数据文件
此脚本会配置自动运行脚本。自动运行脚本会在系统重启之后,自动运行 V2Ray。目前自动运行脚本只支持带有 Systemd 的系统,以及 Debian / Ubuntu 全系列。
运行脚本位于系统的以下位置:
/etc/systemd/system/v2ray.service: Systemd
/etc/init.d/v2ray: SysV
脚本运行完成后,你需要:
编辑 /etc/v2ray/config.json 文件来配置你需要的代理方式;
运行 service v2ray start 来启动 V2Ray 进程;
之后可以使用 service v2ray start|stop|status|reload|restart|force-reload 控制 V2Ray 的运行。

1.4 go.sh内容

#!/bin/bash

# This file is accessible as https://install.direct/go.sh
# Original source is located at github.com/v2fly/v2ray-core/release/install-release.sh

# If not specify, default meaning of return value:
# 0: Success
# 1: System error
# 2: Application error
# 3: Network error

# CLI arguments
PROXY=''
HELP=''
FORCE=''
CHECK=''
REMOVE=''
VERSION=''
VSRC_ROOT='/tmp/v2ray'
EXTRACT_ONLY=''
LOCAL=''
LOCAL_INSTALL=''
DIST_SRC='github'
ERROR_IF_UPTODATE=''

CUR_VER=""
NEW_VER=""
VDIS=''
ZIPFILE="/tmp/v2ray/v2ray.zip"
V2RAY_RUNNING=0

CMD_INSTALL=""
CMD_UPDATE=""
SOFTWARE_UPDATED=0

SYSTEMCTL_CMD=$(command -v systemctl 2>/dev/null)
SERVICE_CMD=$(command -v service 2>/dev/null)

#######color code########
RED="31m" # Error message
GREEN="32m" # Success message
YELLOW="33m" # Warning message
BLUE="36m" # Info message


#########################
while [[ $# > 0 ]]; do
case "$1" in
-p|--proxy)
PROXY="-x ${2}"
shift # past argument
;;
-h|--help)
HELP="1"
;;
-f|--force)
FORCE="1"
;;
-c|--check)
CHECK="1"
;;
--remove)
REMOVE="1"
;;
--version)
VERSION="$2"
shift
;;
--extract)
VSRC_ROOT="$2"
shift
;;
--extractonly)
EXTRACT_ONLY="1"
;;
-l|--local)
LOCAL="$2"
LOCAL_INSTALL="1"
shift
;;
--source)
DIST_SRC="$2"
shift
;;
--errifuptodate)
ERROR_IF_UPTODATE="1"
;;
*)
# unknown option
;;
esac
shift # past argument or value
done

###############################
colorEcho(){
echo -e "\033[${1}${@:2}\033[0m" 1>& 2
}

archAffix(){
case "${1:-"$(uname -m)"}" in
i686|i386)
echo '32'
;;
x86_64|amd64)
echo '64'
;;
*armv7*|armv6l)
echo 'arm'
;;
*armv8*|aarch64)
echo 'arm64'
;;
*mips64le*)
echo 'mips64le'
;;
*mips64*)
echo 'mips64'
;;
*mipsle*)
echo 'mipsle'
;;
*mips*)
echo 'mips'
;;
*s390x*)
echo 's390x'
;;
ppc64le)
echo 'ppc64le'
;;
ppc64)
echo 'ppc64'
;;
*)
return 1
;;
esac

return 0
}

zipRoot() {
unzip -lqq "$1" | awk -e '
NR == 1 {
prefix = $4;
}
NR != 1 {
prefix_len = length(prefix);
cur_len = length($4);

for (len = prefix_len < cur_len ? prefix_len : cur_len; len >= 1; len -= 1) {
sub_prefix = substr(prefix, 1, len);
sub_cur = substr($4, 1, len);

if (sub_prefix == sub_cur) {
prefix = sub_prefix;
break;
}
}

if (len == 0) {
prefix = "";
nextfile;
}
}
END {
print prefix;
}
'
}

downloadV2Ray(){
rm -rf /tmp/v2ray
mkdir -p /tmp/v2ray
if [[ "${DIST_SRC}" == "jsdelivr" ]]; then
DOWNLOAD_LINK="https://cdn.jsdelivr.net/gh/v2ray/dist/v2ray-linux-${VDIS}.zip"
else
DOWNLOAD_LINK="https://github.com/v2fly/v2ray-core/releases/download/${NEW_VER}/v2ray-linux-${VDIS}.zip"
fi
colorEcho ${BLUE} "Downloading V2Ray: ${DOWNLOAD_LINK}"
curl ${PROXY} -L -H "Cache-Control: no-cache" -o ${ZIPFILE} ${DOWNLOAD_LINK}
if [ $? != 0 ];then
colorEcho ${RED} "Failed to download! Please check your network or try again."
return 3
fi
return 0
}

installSoftware(){
COMPONENT=$1
if [[ -n `command -v $COMPONENT` ]]; then
return 0
fi

getPMT
if [[ $? -eq 1 ]]; then
colorEcho ${RED} "The system package manager tool isn't APT or YUM, please install ${COMPONENT} manually."
return 1
fi
if [[ $SOFTWARE_UPDATED -eq 0 ]]; then
colorEcho ${BLUE} "Updating software repo"
$CMD_UPDATE
SOFTWARE_UPDATED=1
fi

colorEcho ${BLUE} "Installing ${COMPONENT}"
$CMD_INSTALL $COMPONENT
if [[ $? -ne 0 ]]; then
colorEcho ${RED} "Failed to install ${COMPONENT}. Please install it manually."
return 1
fi
return 0
}

# return 1: not apt, yum, or zypper
getPMT(){
if [[ -n `command -v apt-get` ]];then
CMD_INSTALL="apt-get -y -qq install"
CMD_UPDATE="apt-get -qq update"
elif [[ -n `command -v yum` ]]; then
CMD_INSTALL="yum -y -q install"
CMD_UPDATE="yum -q makecache"
elif [[ -n `command -v zypper` ]]; then
CMD_INSTALL="zypper -y install"
CMD_UPDATE="zypper ref"
else
return 1
fi
return 0
}

normalizeVersion() {
if [ -n "$1" ]; then
case "$1" in
v*)
echo "$1"
;;
*)
echo "v$1"
;;
esac
else
echo ""
fi
}

# 1: new V2Ray. 0: no. 2: not installed. 3: check failed. 4: don't check.
getVersion(){
if [[ -n "$VERSION" ]]; then
NEW_VER="$(normalizeVersion "$VERSION")"
return 4
else
VER="$(/usr/bin/v2ray/v2ray -version 2>/dev/null)"
RETVAL=$?
CUR_VER="$(normalizeVersion "$(echo "$VER" | head -n 1 | cut -d " " -f2)")"
TAG_URL="https://api.github.com/repos/v2fly/v2ray-core/releases/latest"
NEW_VER="$(normalizeVersion "$(curl ${PROXY} -H "Accept: application/json" -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0" -s "${TAG_URL}" --connect-timeout 10| grep 'tag_name' | cut -d\" -f4)")"

if [[ $? -ne 0 ]] || [[ $NEW_VER == "" ]]; then
colorEcho ${RED} "Failed to fetch release information. Please check your network or try again."
return 3
elif [[ $RETVAL -ne 0 ]];then
return 2
elif [[ $NEW_VER != $CUR_VER ]];then
return 1
fi
return 0
fi
}

stopV2ray(){
colorEcho ${BLUE} "Shutting down V2Ray service."
if [[ -n "${SYSTEMCTL_CMD}" ]] || [[ -f "/lib/systemd/system/v2ray.service" ]] || [[ -f "/etc/systemd/system/v2ray.service" ]]; then
${SYSTEMCTL_CMD} stop v2ray
elif [[ -n "${SERVICE_CMD}" ]] || [[ -f "/etc/init.d/v2ray" ]]; then
${SERVICE_CMD} v2ray stop
fi
if [[ $? -ne 0 ]]; then
colorEcho ${YELLOW} "Failed to shutdown V2Ray service."
return 2
fi
return 0
}

startV2ray(){
if [ -n "${SYSTEMCTL_CMD}" ] && [[ -f "/lib/systemd/system/v2ray.service" || -f "/etc/systemd/system/v2ray.service" ]]; then
${SYSTEMCTL_CMD} start v2ray
elif [ -n "${SERVICE_CMD}" ] && [ -f "/etc/init.d/v2ray" ]; then
${SERVICE_CMD} v2ray start
fi
if [[ $? -ne 0 ]]; then
colorEcho ${YELLOW} "Failed to start V2Ray service."
return 2
fi
return 0
}

installV2Ray(){
# Install V2Ray binary to /usr/bin/v2ray
mkdir -p '/etc/v2ray' '/var/log/v2ray' && \
unzip -oj "$1" "$2v2ray" "$2v2ctl" "$2geoip.dat" "$2geosite.dat" -d '/usr/bin/v2ray' && \
chmod +x '/usr/bin/v2ray/v2ray' '/usr/bin/v2ray/v2ctl' || {
colorEcho ${RED} "Failed to copy V2Ray binary and resources."
return 1
}

# Install V2Ray server config to /etc/v2ray
if [ ! -f '/etc/v2ray/config.json' ]; then
local PORT="$(($RANDOM + 10000))"
local UUID="$(cat '/proc/sys/kernel/random/uuid')"

unzip -pq "$1" "$2vpoint_vmess_freedom.json" | \
sed -e "s/10086/${PORT}/g; s/23ad6b10-8d1a-40f7-8ad0-e3e35cd38297/${UUID}/g;" - > \
'/etc/v2ray/config.json' || {
colorEcho ${YELLOW} "Failed to create V2Ray configuration file. Please create it manually."
return 1
}

colorEcho ${BLUE} "PORT:${PORT}"
colorEcho ${BLUE} "UUID:${UUID}"
fi
}


installInitScript(){
if [[ -n "${SYSTEMCTL_CMD}" ]]; then
if [[ ! -f "/etc/systemd/system/v2ray.service" && ! -f "/lib/systemd/system/v2ray.service" ]]; then
unzip -oj "$1" "$2systemd/v2ray.service" -d '/etc/systemd/system' && \
systemctl enable v2ray.service
fi
elif [[ -n "${SERVICE_CMD}" ]] && [[ ! -f "/etc/init.d/v2ray" ]]; then
installSoftware 'daemon' && \
unzip -oj "$1" "$2systemv/v2ray" -d '/etc/init.d' && \
chmod +x '/etc/init.d/v2ray' && \
update-rc.d v2ray defaults
fi
}

Help(){
cat - 1>& 2 << EOF
./install-release.sh [-h] [-c] [--remove] [-p proxy] [-f] [--version vx.y.z] [-l file]
-h, --help Show help
-p, --proxy To download through a proxy server, use -p socks5://127.0.0.1:1080 or -p http://127.0.0.1:3128 etc
-f, --force Force install
--version Install a particular version, use --version v3.15
-l, --local Install from a local file
--remove Remove installed V2Ray
-c, --check Check for update
EOF
}

remove(){
if [[ -n "${SYSTEMCTL_CMD}" ]] && [[ -f "/etc/systemd/system/v2ray.service" ]];then
if pgrep "v2ray" > /dev/null ; then
stopV2ray
fi
systemctl disable v2ray.service
rm -rf "/usr/bin/v2ray" "/etc/systemd/system/v2ray.service"
if [[ $? -ne 0 ]]; then
colorEcho ${RED} "Failed to remove V2Ray."
return 0
else
colorEcho ${GREEN} "Removed V2Ray successfully."
colorEcho ${BLUE} "If necessary, please remove configuration file and log file manually."
return 0
fi
elif [[ -n "${SYSTEMCTL_CMD}" ]] && [[ -f "/lib/systemd/system/v2ray.service" ]];then
if pgrep "v2ray" > /dev/null ; then
stopV2ray
fi
systemctl disable v2ray.service
rm -rf "/usr/bin/v2ray" "/lib/systemd/system/v2ray.service"
if [[ $? -ne 0 ]]; then
colorEcho ${RED} "Failed to remove V2Ray."
return 0
else
colorEcho ${GREEN} "Removed V2Ray successfully."
colorEcho ${BLUE} "If necessary, please remove configuration file and log file manually."
return 0
fi
elif [[ -n "${SERVICE_CMD}" ]] && [[ -f "/etc/init.d/v2ray" ]]; then
if pgrep "v2ray" > /dev/null ; then
stopV2ray
fi
rm -rf "/usr/bin/v2ray" "/etc/init.d/v2ray"
if [[ $? -ne 0 ]]; then
colorEcho ${RED} "Failed to remove V2Ray."
return 0
else
colorEcho ${GREEN} "Removed V2Ray successfully."
colorEcho ${BLUE} "If necessary, please remove configuration file and log file manually."
return 0
fi
else
colorEcho ${YELLOW} "V2Ray not found."
return 0
fi
}

checkUpdate(){
echo "Checking for update."
VERSION=""
getVersion
RETVAL="$?"
if [[ $RETVAL -eq 1 ]]; then
colorEcho ${BLUE} "Found new version ${NEW_VER} for V2Ray.(Current version:$CUR_VER)"
elif [[ $RETVAL -eq 0 ]]; then
colorEcho ${BLUE} "No new version. Current version is ${NEW_VER}."
elif [[ $RETVAL -eq 2 ]]; then
colorEcho ${YELLOW} "No V2Ray installed."
colorEcho ${BLUE} "The newest version for V2Ray is ${NEW_VER}."
fi
return 0
}

main(){
#helping information
[[ "$HELP" == "1" ]] && Help && return
[[ "$CHECK" == "1" ]] && checkUpdate && return
[[ "$REMOVE" == "1" ]] && remove && return

local ARCH=$(uname -m)
VDIS="$(archAffix)"

# extract local file
if [[ $LOCAL_INSTALL -eq 1 ]]; then
colorEcho ${YELLOW} "Installing V2Ray via local file. Please make sure the file is a valid V2Ray package, as we are not able to determine that."
NEW_VER=local
rm -rf /tmp/v2ray
ZIPFILE="$LOCAL"
#FILEVDIS=`ls /tmp/v2ray |grep v2ray-v |cut -d "-" -f4`
#SYSTEM=`ls /tmp/v2ray |grep v2ray-v |cut -d "-" -f3`
#if [[ ${SYSTEM} != "linux" ]]; then
# colorEcho ${RED} "The local V2Ray can not be installed in linux."
# return 1
#elif [[ ${FILEVDIS} != ${VDIS} ]]; then
# colorEcho ${RED} "The local V2Ray can not be installed in ${ARCH} system."
# return 1
#else
# NEW_VER=`ls /tmp/v2ray |grep v2ray-v |cut -d "-" -f2`
#fi
else
# download via network and extract
installSoftware "curl" || return $?
getVersion
RETVAL="$?"
if [[ $RETVAL == 0 ]] && [[ "$FORCE" != "1" ]]; then
colorEcho ${BLUE} "Latest version ${CUR_VER} is already installed."
if [ -n "${ERROR_IF_UPTODATE}" ]; then
return 10
fi
return
elif [[ $RETVAL == 3 ]]; then
return 3
else
colorEcho ${BLUE} "Installing V2Ray ${NEW_VER} on ${ARCH}"
downloadV2Ray || return $?
fi
fi

local ZIPROOT="$(zipRoot "${ZIPFILE}")"
installSoftware unzip || return $?

if [ -n "${EXTRACT_ONLY}" ]; then
colorEcho ${BLUE} "Extracting V2Ray package to ${VSRC_ROOT}."

if unzip -o "${ZIPFILE}" -d ${VSRC_ROOT}; then
colorEcho ${GREEN} "V2Ray extracted to ${VSRC_ROOT%/}${ZIPROOT:+/${ZIPROOT%/}}, and exiting..."
return 0
else
colorEcho ${RED} "Failed to extract V2Ray."
return 2
fi
fi

if pgrep "v2ray" > /dev/null ; then
V2RAY_RUNNING=1
stopV2ray
fi
installV2Ray "${ZIPFILE}" "${ZIPROOT}" || return $?
installInitScript "${ZIPFILE}" "${ZIPROOT}" || return $?
if [[ ${V2RAY_RUNNING} -eq 1 ]];then
colorEcho ${BLUE} "Restarting V2Ray service."
startV2ray
fi
colorEcho ${GREEN} "V2Ray ${NEW_VER} is installed."
rm -rf /tmp/v2ray
return 0
}

main




2. 配置v2ray
以kcp为例,贴一段配置代码

{
"log": {
"loglevel": "warning"
},
"inbound": {
"listen": "127.0.0.1",
"port": 1080,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true,
"ip": "127.0.0.1"
}
},
"outbound": {
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "服务器域名",
"port": 服务器端口,
"users": [
{
"id": "服务器ID",
"level": 1,
"alterId": 32,
"security": "chacha20-poly1305"
}
]
}
]
},
"mux": {
"enabled": true,
"concurrency": 8
}
},
"outboundDetour": [
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
}
],
"routing": {
"strategy": "rules",
"settings": {
"rules": [
{
"type": "field",
"port": "54-79",
"outboundTag": "direct"
},
{
"type": "field",
"port": "81-442",
"outboundTag": "direct"
},
{
"type": "field",
"port": "444-65535",
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"gc.kis.scr.kaspersky-labs.com"
],
"outboundTag": "direct"
},
{
"type": "chinasites",
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"0.0.0.0/8",
"10.0.0.0/8",
"100.64.0.0/10",
"127.0.0.0/8",
"169.254.0.0/16",
"172.16.0.0/12",
"192.0.0.0/24",
"192.0.2.0/24",
"192.168.0.0/16",
"198.18.0.0/15",
"198.51.100.0/24",
"203.0.113.0/24",
"::1/128",
"fc00::/7",
"fe80::/10"
],
"outboundTag": "direct"
},
{
"type": "chinaip",
"outboundTag": "direct"
}
]
}
}
}



3. 启动v2ray服务
sudo systemctl start v2ray #启动v2ray
sudo systemctl status v2ray #查看v2ray状态
sudo systemctl stop v2ray #停止v2ray

4. 使用V2RAY
4.1 设置浏览器代理
设置代理为127.0.0.1:1080

Docker--容器实例和镜像的删除与备份

Docker--删除容器实例和镜像

一、删除容器实例

使用命令docker rm 容器ID或者容器名(IMAGE ID)

1、docker ps -a查询已有的实例

# docker ps -a

2、docker rm 容器ID或者容器名,删除已经停止运行的实例。如果没有停止,使用docker stop ID/NAMES停止实例,或者使用docker rm -f 容器ID或者容器名强制删除。 

# docker rm -f 

 3、再次使用docker ps -a查询已有的实例

# docker ps -a

二、删除镜像

使用命令docker rmi -f 容器ID或者容器名(IMAGE ID)

1、docker images查询已有的实例

# docker images

2、使用docker rmi -f 删除hello-world的镜像(-f表示强制操作)

# docker rmi -f fce2

三、删除所有操作(批量) 

docker rm -f `docker ps -a -q` # 删除所有容器

docker rmi -f `docker images -q` # 删除所有的镜像


Docker容器备份迁移


1. 容器生成新的镜像

-p : 在commit时,将容器暂停

docker commit -p be14de974ce4 onlyoffice20230628:7.3.3

查看镜像大小

ll -h onlyoffice20230628.tar

2. 将镜像保存成一个tar压缩包

docker save onlyoffice20230628:7.3.3 > onlyoffice20230628.tar

3. 在另一台主机上加载镜像的tar压缩包

docker load -i onlyoffice20230628.tar