linux下的sh脚本转可执行二进制文件

假如你的脚本内容是

#!/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

上一篇 pve快捷设置工具
下一篇 pve退出集群