假如你的脚本内容是
#!/bin/bash
echo "欢迎使用自动命名脚本"
hostnamectl set-hostname pve-$(date +%s)
创建编译文件
创建文件nano auto-name.go ,输入以下内容,注意替换内容
package main
import (
"os"
"os/exec"
)
func main() {
script := `#!/bin/bash
echo "欢迎使用自动命名脚本"
hostnamectl set-hostname pve-$(date +%s)
`
cmd := exec.Command("bash", "-c", script)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Run()
}
安装工具
apt update
apt install golang -y
编译后即可运行
go build -o auto-name auto-name.go
./auto-name
自动编译脚本
新建脚本 nano sh2go.sh 粘贴下面的内容
#!/bin/bash
# sh2go - shell脚本编译为AES-256加密Go二进制
# 用法: ./sh2go.sh <脚本文件> [输出文件名]
SCRIPT="$1"
OUTPUT="${2:-$(basename "$SCRIPT" .sh)}"
[ -z "$SCRIPT" ] && echo "用法: $0 <脚本文件> [输出文件名]" && exit 1
[ ! -f "$SCRIPT" ] && echo "错误: $SCRIPT 不存在" && exit 1
export PATH=$PATH:/usr/local/go/bin HOME=${HOME:-/root}
echo "[1/5] 检查Go..."
if ! command -v go &>/dev/null; then
echo " 安装Go..."
V="1.22.5" T="/tmp/go${V}.linux-amd64.tar.gz"
if [ ! -f "$T" ] || ! file "$T" | grep -q gzip; then
for u in "https://golang.google.cn/dl/go${V}.linux-amd64.tar.gz" \
"https://mirrors.aliyun.com/golang/go${V}.linux-amd64.tar.gz"; do
echo " 下载: $u"
curl -fSL --connect-timeout 15 --max-time 300 -o "$T" "$u" 2>&1 && file "$T" | grep -q gzip && break
done
fi
file "$T" | grep -q gzip || { echo "错误: Go下载失败"; exit 1; }
echo " 解压..."
tar -C /usr/local -xzf "$T" || { echo "错误: Go解压失败"; exit 1; }
fi
echo " Go: $(go version)"
echo "[2/5] 检查依赖..."
python3 -c "from cryptography.hazmat.primitives.ciphers.aead import AESGCM" 2>/dev/null || {
echo " 安装 cryptography..."
pip3 install cryptography -q 2>&1 || { echo "错误: cryptography安装失败"; exit 1; }
}
echo "[3/5] 加密脚本..."
TMPDIR=$(mktemp -d)
cp "$SCRIPT" "$TMPDIR/script.sh" && chmod +x "$TMPDIR/script.sh"
cd "$TMPDIR" || { echo "错误: 无法进入临时目录"; exit 1; }
go mod init sh2go 2>/dev/null
python3 -c "
import hashlib, os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
passphrase = os.urandom(16).hex()
obf_key = int.from_bytes(os.urandom(1), 'big')
with open('script.sh', 'rb') as f: pt = f.read()
salt = os.urandom(16); nonce = os.urandom(12)
key = hashlib.pbkdf2_hmac('sha256', passphrase.encode(), salt, 100000, dklen=32)
ct = AESGCM(key).encrypt(nonce, pt, None)
with open('payload.bin', 'wb') as f: f.write(salt + nonce + ct)
obf = bytes(b ^ obf_key for b in passphrase.encode())
arr = ','.join(str(b) for b in obf)
with open('pass.txt', 'w') as f: f.write(f'{arr}|{obf_key}|{len(passphrase)}')
print(f' 脚本: {len(pt)}字节 -> 密文: {len(salt)+len(nonce)+len(ct)}字节')
" || { echo "错误: 加密失败"; exit 1; }
OBF_ARR=$(cut -d'|' -f1 pass.txt)
OBF_KEY_BYTE=$(cut -d'|' -f2 pass.txt)
cat > main.go << GOEOF
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/sha256"
_ "embed"
"os"
"os/exec"
"golang.org/x/crypto/pbkdf2"
)
//go:embed payload.bin
var payload []byte
func getPass() string {
obf := []byte{${OBF_ARR}}
k := byte(${OBF_KEY_BYTE})
out := make([]byte, len(obf))
for i, b := range obf { out[i] = b ^ k }
return string(out)
}
func decrypt() string {
salt := payload[:16]; nonce := payload[16:28]; ct := payload[28:]
key := pbkdf2.Key([]byte(getPass()), salt, 100000, 32, sha256.New)
block, _ := aes.NewCipher(key)
gcm, _ := cipher.NewGCM(block)
plain, _ := gcm.Open(nil, nonce, ct, nil)
return string(plain)
}
func main() {
cmd := exec.Command("bash", "-c", decrypt())
cmd.Stdin = os.Stdin; cmd.Stdout = os.Stdout; cmd.Stderr = os.Stderr
cmd.Run()
}
GOEOF
echo "[4/5] 下载Go依赖(首次较慢)..."
GOPROXY=https://goproxy.cn,direct go get golang.org/x/crypto/pbkdf2 2>&1 || { echo "错误: go get失败"; exit 1; }
GOPROXY=https://goproxy.cn,direct go mod tidy 2>&1 || { echo "错误: go mod tidy失败"; exit 1; }
echo " 依赖就绪"
echo "[5/5] 编译..."
go build -ldflags="-s -w" -trimpath -o "$OUTPUT" . 2>&1 || { echo "错误: 编译失败"; exit 1; }
SIZE=$(du -h "$OUTPUT" | cut -f1)
cp "$OUTPUT" "$OLDPWD/$OUTPUT"
cd "$OLDPWD" && rm -rf "$TMPDIR"
echo ""
echo "完成! ./$OUTPUT ($SIZE)"
echo "加密: AES-256-GCM + PBKDF2(10万轮) + 密钥混淆"
echo "运行: ./$OUTPUT"
给权限chmod +x sh2go.sh 运行 ./sh2go.sh 脚本.sh 输出文件名
例:./sh2go.sh auto.sh auto