linux安装golang

下载地址
https://golang.google.cn/dl/

安装参考
https://golang.google.cn/doc/install

安装1.22, 如果需要安装其他版本下载对应版本替换即可

wget  https://dl.google.com/go/go1.22.0.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
sudo ln -s /usr/local/go/bin/go /usr/bin/go
export PATH=$PATH:/usr/local/go/bin
go version
echo 'export PATH=$PATH:/usr/local/go/bin‘ >> ~/.profile
source ~/.profile

通过WARP隐藏IP

warp是什么?
Cloudflare Warp 是由 Cloudflare 提供的一项网络优化服务,旨在提供更快速、更安全的互联网体验。它通过在全球范围内部署的服务器网络来加密并加速用户的网络流量。

  • Warp 应用程序:适用于移动设备(iOS 和 Android),安装后可以在手机或平板电脑上使用,以提升移动数据和 Wi-Fi 连接的性能和安全性。
  • Warp+:是 Warp 的付费版本,除了基本的网络优化功能外,还承诺提供更快的速度,并优先处理用户的数据包,减少延迟和提高加载速度。
  • Warp 代理(如 warp-cli):为开发者和高级用户提供命令行工具,可以在服务器和其他支持的平台上配置和使用 Warp 服务。

有时候还可以作为梯子使用 ~~

官网
https://1.1.1.1/

检查是否开启warp
https://cloudflare.com/cdn-cgi/trace
找到 warp=***,
如果为 warp=off,则代表未开启或未代理,
如果为 warp=plus 则代表启用成功,当前网络由 WARP+ 托管,所有网络请求流量通过 WARP+ VPN 转发

...
tls=TLSv1.3
sni=plaintext
warp=plus
...

使用warp 一般我们分为以下几个步骤,

安装cloudflare-warp

linux参考
https://developers.cloudflare.com/warp-client/get-started/linux/

debian/ubuntu

#添加gpg key
curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg

#添加apt源
echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list

#安装
sudo apt-get update && sudo apt-get install cloudflare-warp

使用

使用licensekey来连接, 不限流量

#第一次使用
warp-cli registration new
warp-cli registration license xxxxxxxxx-7xxxxm6-xxxxxxxx
warp-cli connect

#以后使用connect即可
warp-cli connect
warp-cli disconnect

lisence key获取方法

通过电报机器人获取
https://t.me/generatewarpplusbot

关注以后 输入/start 会有提示, 然后依次点击提示按钮即可,最后 输入/generate <提示的简单加减法的值>

/start
/generate xx

Termius pro 通用破解

注意: 这里不是破解Termius服务器,而是破解一些本地termius的功能, 比如隧道跳板机等,xshell也有类似功能,但是xshell没有linux客户端,

参考

https://github.com/h3110w0r1d-y/termius-cracked
https://www.52pojie.cn/thread-1860682-1-1.

安装npm,asar

#这里为ubuntu或者debian
# centos使用yum -y install npm
sudo apt -y install npm

sudo npm config set registry https://registry.npmmirror.com --global
sudo npm install -g asar

解压app.asar

linux版的目录为 /opt/Termius/resources
Mac版的目录为 /Applications/Termius.app/Contents/Resources/
Windows 目录为 C:\Users\Administrator\AppData\Local\Programs\Termius\resources

cd /opt/Termius/resources
asar extract app.asar ./app  # 修改完不需要重新打包
mv app.asar app.asar.bak  # 留个备份,或者直接rm
rm app-update.yml  # 防止自动更新,这个文件不一定有

修改app/js/background-process.js

搜索

await this.api.bulkAccount

将下面的进行替换

const e=await this.api.bulkAccount();

修改为

var e=await this.api.bulkAccount();
e.account.pro_mode=true;
e.account.need_to_update_subscription=false;
e.account.current_period={
    "from": "2022-01-01T00:00:00",
    "until": "2099-01-01T00:00:00"
};
e.account.plan_type="Premium";
e.account.user_type="Premium";
e.student=null;
e.trial=null;
e.account.authorized_features.show_trial_section=false;
e.account.authorized_features.show_subscription_section=true;
e.account.authorized_features.show_github_account_section=false;
e.account.expired_screen_type=null;
e.personal_subscription={
    "now": new Date().toISOString().slice(0, -5),
    "status": "SUCCESS",
    "platform": "stripe",
    "current_period": {
        "from": "2022-01-01T00:00:00",
        "until": "2099-01-01T00:00:00"
    },
    "revokable": true,
    "refunded": false,
    "cancelable": true,
    "reactivatable": false,
    "currency": "usd",
    "created_at": "2022-01-01T00:00:00",
    "updated_at": new Date().toISOString().slice(0, -5),
    "valid_until": "2099-01-01T00:00:00",
    "auto_renew": true,
    "price": 12.0,
    "verbose_plan_name": "Termius Pro Monthly",
    "plan_type": "SINGLE",
    "is_expired": false
};
e.access_objects=[{
    "period": {
        "start": "2022-01-01T00:00:00",
        "end": "2099-01-01T00:00:00"
    },
    "title": "Pro"
}];

file
保存文件,重新打开Termius 即可, pro功能即可使用,

破解脚本

Python版本

import re

# 要替换的原文本(可能需要调整正则表达式以精确匹配)
pattern = re.compile(r'const e=await this\.api\.bulkAccount\(\);', re.DOTALL)

# 新的文本内容
replacement = """
var e=await this.api.bulkAccount();
e.account.pro_mode=true;
e.account.need_to_update_subscription=false;
e.account.current_period={
    "from": "2022-01-01T00:00:00",
    "until": "2099-01-01T00:00:00"
};
e.account.plan_type="Premium";
e.account.user_type="Premium";
e.student=null;
e.trial=null;
e.account.authorized_features.show_trial_section=false;
e.account.authorized_features.show_subscription_section=true;
e.account.authorized_features.show_github_account_section=false;
e.account.expired_screen_type=null;
e.personal_subscription={
    "now": new Date().toISOString().slice(0, -5),
    "status": "SUCCESS",
    "platform": "stripe",
    "current_period": {
        "from": "2022-01-01T00:00:00",
        "until": "2099-01-01T00:00:00"
    },
    "revokable": true,
    "refunded": false,
    "cancelable": true,
    "reactivatable": false,
    "currency": "usd",
    "created_at": "2022-01-01T00:00:00",
    "updated_at": new Date().toISOString().slice(0, -5),
    "valid_until": "2099-01-01T00:00:00",
    "auto_renew": true,
    "price": 12.0,
    "verbose_plan_name": "Termius Pro Monthly",
    "plan_type": "SINGLE",
    "is_expired": false
};
e.access_objects=[{
    "period": {
        "start": "2022-01-01T00:00:00",
        "end": "2099-01-01T00:00:00"
    },
    "title": "Pro"
}];
"""

# 文件路径
file_path = '/opt/Termius/resources/app/js/background-process.js'

# 读取文件
with open(file_path, 'r', encoding='utf-8') as file:
    content = file.read()

# 替换文本
new_content = re.sub(pattern, replacement, content)

# 写回文件
with open(file_path, 'w', encoding='utf-8') as file:
    file.write(new_content)

print("替换完成。")

GO版本

src.js

const e=await this.api.bulkAccount();

dst.js

var e=await this.api.bulkAccount();
e.account.pro_mode=true;
e.account.need_to_update_subscription=false;
e.account.current_period={
    "from": "2022-01-01T00:00:00",
    "until": "2099-01-01T00:00:00"
};
e.account.plan_type="Premium";
e.account.user_type="Premium";
e.student=null;
e.trial=null;
e.account.authorized_features.show_trial_section=false;
e.account.authorized_features.show_subscription_section=true;
e.account.authorized_features.show_github_account_section=false;
e.account.expired_screen_type=null;
e.personal_subscription={
    "now": new Date().toISOString().slice(0, -5),
    "status": "SUCCESS",
    "platform": "stripe",
    "current_period": {
        "from": "2022-01-01T00:00:00",
        "until": "2099-01-01T00:00:00"
    },
    "revokable": true,
    "refunded": false,
    "cancelable": true,
    "reactivatable": false,
    "currency": "usd",
    "created_at": "2022-01-01T00:00:00",
    "updated_at": new Date().toISOString().slice(0, -5),
    "valid_until": "2099-01-01T00:00:00",
    "auto_renew": true,
    "price": 12.0,
    "verbose_plan_name": "Termius Pro Monthly",
    "plan_type": "SINGLE",
    "is_expired": false
};
e.access_objects=[{
    "period": {
        "start": "2022-01-01T00:00:00",
        "end": "2099-01-01T00:00:00"
    },
    "title": "Pro"
}];

crack.go

package main

import (
    "fmt"
    "log"
    "os"
    "regexp"
)

func main() {
    // 读取要替换的文本和替换文本
    originalText, err := os.ReadFile("src.js")
    if err != nil {
        log.Fatalf("failed reading file: %s", err)
    }
    replacementText, err := os.ReadFile("dst.js")
    if err != nil {
        log.Fatalf("failed reading file: %s", err)
    }

    // 读取目标文件
    targetFileContent, err := os.ReadFile("/opt/Termius/resources/app/js/background-process.js")
    if err != nil {
        log.Fatalf("failed reading file: %s", err)
    }

    // 使用regexp进行替换
    // 注意:这里的正则表达式需要根据实际文本进行调整
    re := regexp.MustCompile(`(?s)` + regexp.QuoteMeta(string(originalText)))
    replacedContent := re.ReplaceAll(targetFileContent, replacementText)

    // 将替换后的内容写回文件
    if err := os.WriteFile("/opt/Termius/resources/app/js/background-process.js", replacedContent, 0666); err != nil {
        log.Fatalf("failed writing to file: %s", err)
    }

    fmt.Println("替换完成。")
}

获取OpenAI的AccessToken

有时候我们需要在Pandora-next中设置AccessToken来免梯子访问chatgpt, AccessToken的有效期一般是10天

pandoranext项目已停止

获取AccessToken的前提条件

  • 已经在openai注册过账号
  • 直接访问openai需要梯子

获取AccessToken步骤

  1. 浏览器登陆 https://chat.openai.com/chat
  2. 登陆后访问 https://chat.openai.com/api/auth/session
  3. 返回结果中会有 AccessToken

CKAD 模拟题库 | 28. Jobs

模拟题目:

设置配置环境:

[candidate@node-1] $ kubectl config use-context k8s

Task

  1. 用执行命令'date; echo Hello from the Kubernetes cluster'的镜像 busybox ,创建一个名为 busybox-job 的 Job 。
  2. 修改此 Job ,确保在执行时间超过 3000 秒后,kubernetes 会自动终止该 Job。
  3. 如果容器失败,则尝试重启容器,但最多尝试重启 5 次。
  4. 检查此Job的日志

参考:

https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup

kubectl explain job.spec

继续阅读“CKAD 模拟题库 | 28. Jobs”

CKAD 模拟题库 | 27. Secret 秘钥

模拟题目:

设置配置环境:

[candidate@node-1] $ kubectl config use-context k8s

Task

test 命名空间,创建一个名为 mysecret 的密钥,其值 usernamedevuserpassword为A!B*d$zDsb=test 命名空间,创建一个 pod,镜像使用 nginx:1.16 ,名字为 mypod ,将秘密 mysecret 挂载到路径 /etc/foo 上的卷中

参考:

https://kubernetes.io/zh-cn/docs/tasks/configmap-secret/managing-secret-using-kubectl/
https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod

继续阅读“CKAD 模拟题库 | 27. Secret 秘钥”

CKAD 模拟题库 | 26. SecurityContext 安全上下文

模拟题目:

设置配置环境:

[candidate@node-1] $ kubectl config use-context k8s

Task

test 命名空间,有一个名为 secnginx 的 pod,修改此 pod,为容器添加CAP_NET_ADMINCAP_SYS_TIME 权能

参考:

https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/security-context/#set-capabilities-for-a-container

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-4
spec:
  containers:
  - name: sec-ctx-4
    image: gcr.io/google-samples/node-hello:1.0
    securityContext:
      capabilities:
        add: ["NET_ADMIN", "SYS_TIME"]

继续阅读“CKAD 模拟题库 | 26. SecurityContext 安全上下文”

CKAD 模拟题库 | 25. 资源配额Quota

模拟题目:

设置配置环境:

[candidate@node-1] $ kubectl config use-context k8s

Task

qutt 命名空间,创建一个名为 myquota 的 Quota,该资源 Quota 具有 1 个CPU, 1G 内存和 2个 pod的硬限制。

参考:

https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/#viewing-and-setting-quotas

继续阅读“CKAD 模拟题库 | 25. 资源配额Quota”

CKAD 模拟题库 | 24. sidecar 边车容器

模拟题目:

设置配置环境:

[candidate@node-1] $ kubectl config use-context k8s

Task

  • default 命名空间创建一个 deployment 名为 deploymenb-web
  • 包含一个主容器 lfccncf/busybox:1 ,名称 logger-123
  • 包含一个边车容器 lfccncf/fluentd:v0.12 ,名称 adaptor-dev
  • 在两个容器上挂载一个共享卷 /ckad/log ,当 pod 删除,这个卷不会持久
  • logger-123 容器运行以下命令:
    while true; do
    echo "i luv cncf" >> /ckad/log/input.log; sleep 10;
    done

    结果会文本输出到 /ckad/log/input.log ,格式示例如下:
    i luv cncf
    i luv cncf
    i luv cncf

  • adaptor-dev 容器读取 /ckad/log/input.log ,并将数据输出到 **/ckad/log/output.*** 格式为 Fluentd JSON

    请注意 :完成此任务不需要了解 Fluentd , 完成此任务所需要的知识 .
    /ckad/KDMC00102/fluentd-configmap.yaml 提供规范文件中创建 configmap ,并将该 configmap 挂载到边车容器 adapter-dev 中的 /fluentd/etc

参考:

https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/

继续阅读“CKAD 模拟题库 | 24. sidecar 边车容器”