-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathentrypoint.sh
More file actions
119 lines (93 loc) · 3.45 KB
/
entrypoint.sh
File metadata and controls
119 lines (93 loc) · 3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/bin/bash
: "${SSH_USER:? [ER] SSH_USER 帳號未設定}"
: "${SSH_PASSWORD:? [ER] SSH_PASSWORD 密碼未設定}"
PUID=${PUID:-1000}
PGID=${PGID:-1000}
USE_RRSYNC=${USE_RRSYNC:-"true"} # 預設開啟受限模式
# 建立群組與使用者 (若不存在)
if ! getent group "$SSH_USER" >/dev/null; then
echo "[SSH] 建立群組"
addgroup -g "$PGID" "$SSH_USER"
fi
if ! getent passwd "$SSH_USER" >/dev/null; then
echo "[SSH] 建立帳號"
adduser -D -u "$PUID" -G "$SSH_USER" -h "/home/$SSH_USER" -s /bin/bash "$SSH_USER"
fi
# 目錄權限檢查
WORK_DIR=/worker/data
if [ ! -d "$WORK_DIR" ]; then
echo "[建立目錄] $WORK_DIR"
mkdir -p $WORK_DIR
chown "$PUID:$PGID" $WORK_DIR
elif [ "$(stat -c '%u:%g' $WORK_DIR)" != "$PUID:$PGID" ]; then
echo "[修正權限] $WORK_DIR 擁有者不符,更新為 $PUID:$PGID"
chown "$PUID:$PGID" $WORK_DIR
fi
# --- hotkey處理 ---start
CUSTOM_CONF="/etc/ssh/sshd_config.d/99-hotkey.conf"
KEY_DIR="/ssh_keys"
mkdir -p "$KEY_DIR"
chmod 700 "$KEY_DIR"
mkdir -p /etc/ssh/sshd_config.d
# 清空舊的自定義設定,重新開始
echo "# Generated by entrypoint.sh" > "$CUSTOM_CONF"
WANT_KEYS="rsa ecdsa ed25519"
# 定義你想要支援的金鑰類型
for type in $WANT_KEYS; do
new_path="$KEY_DIR/ssh_host_${type}_key"
# 寫入設定檔(確保 sshd 服務啟動時讀取這裡)
echo "HostKey $new_path" >> "$CUSTOM_CONF"
# 手動產生金鑰 (如果檔案不存在才產生)
if [ ! -f "$new_path" ]; then
echo "[INFO] Generating $type key at $new_path..."
# RSA 強制使用 4096 位元確保安全性
[ "$type" = "rsa" ] && BITS="-b 4096" || BITS=""
ssh-keygen -q -t "$type" $BITS -N "" -f "$new_path"
fi
done
# 修正權限 (金鑰檔案必須是 600)
chmod 600 "$KEY_DIR"/*_key 2>/dev/null || true
chmod 644 "$KEY_DIR"/*.pub 2>/dev/null || true
# --- hotkey處理 ---end
echo "[SSH] 配置服務..."
echo "$SSH_USER:$SSH_PASSWORD" | chpasswd
# 2. 如果有提供公鑰,則設定 SSH Key 認證
if [ -n "$SSH_PUBLIC_KEY" ]; then
USER_HOME=$(eval echo ~$SSH_USER)
mkdir -p "$USER_HOME/.ssh"
echo "$SSH_PUBLIC_KEY" > "$USER_HOME/.ssh/authorized_keys"
chown -R "$SSH_USER:$SSH_USER" "$USER_HOME/.ssh"
chmod 700 "$USER_HOME/.ssh"
chmod 600 "$USER_HOME/.ssh/authorized_keys"
fi
CLEAN_IPS=$(echo "${ALLOW_IP:-0.0.0.0/0}" | tr -d ' ' ) # 去掉所有空格,保留逗號
#CLEAN_IPS=$(echo "${ALLOW_IP}" | tr ',' ' ')
# 寫入
cat <<EOF >> /etc/ssh/sshd_config.d/90-allow.conf
# --- CUSTOM MATCH START ---
# 限制特定使用者只能從特定網段連入
#DenyUsers *
Match Address $CLEAN_IPS
AllowUsers $SSH_USER
ChrootDirectory /worker
ForceCommand internal-sftp
# --- CUSTOM MATCH END ---
EOF
echo "[INFO] 已設定 Match Address 限制: $CLEAN_IPS 對於使用者 $SSH_USER"
# --- 測試設定檔語法 ---
if ! /usr/sbin/sshd -t; then
echo "[FT] sshd_config 語法檢查失敗!請檢查產生的 Match Address 格式。"
echo "以下是目前的設定檔末尾內容:"
tail -n 10 /etc/ssh/sshd_config
# 這裡很關鍵:不要直接 exit,而是進入睡眠模式,讓你有機會 docker exec 進來修
echo "[DEBUG] 進入睡眠模式以供除錯..."
#sleep infinity
#tail -f /dev/null
# 捕捉 SIGTERM 並執行 exit
trap "exit 0" SIGTERM SIGINT
# 循環等待,每次睡 1 秒,這樣它能隨時反應 trap
while true; do
sleep 1 & wait $!
done
fi
exec "$@"