#!/bin/sh # # S99ssh - HiBy R3 Pro II: dropbear SSH 服务 + ADB 持久自启 # # 设计要点: # * dropbear 为静态 musl 二进制(/usr/sbin/dropbear),仅 pubkey 认证 # (编译时已去掉 password auth,无需 /etc/passwd 写密码)。 # * /root 位于只读 squashfs,authorized_keys 放可写 UBIFS 卷: # /usr/data/ssh/.ssh/authorized_keys # 并用 bind-mount 把 /usr/data/ssh 挂到 /root(/root 在固件中是空目录), # dropbear 按 passwd 的 pw_dir=/root 查找 ~/.ssh/authorized_keys。 # * host key 首次开机用 dropbearkey 生成到 /usr/data/ssh/ # (dropbear -R 的运行时生成路径是只读的 /etc/dropbear,不可用)。 # * 日志:/usr/data/ssh.log(= /data/ssh.log)。 # * 顺带删除 /usr/data/disableadb,使 ADB 在 USB 连接时持久自启 # (etc/init.d/adb/S440adb 检查该文件存在则不起 adb)。 # case "$1" in start) echo "Starting dropbear sshd ..." # ADB 持久自启:清掉禁用标记 rm -f /usr/data/disableadb # UBIFS 未挂好/不可写则放弃(避免在只读 squashfs 上瞎写) [ -d /usr/data ] && [ -w /usr/data ] || { echo "S99ssh: /usr/data not writable, abort" > /dev/console 2>&1 exit 0 } mkdir -p /usr/data/ssh/.ssh chmod 700 /usr/data/ssh chmod 700 /usr/data/ssh/.ssh # 首次开机:从只读模板写入 authorized_keys if [ ! -f /usr/data/ssh/.ssh/authorized_keys ] && [ -f /etc/dropbear/authorized_keys ]; then cp /etc/dropbear/authorized_keys /usr/data/ssh/.ssh/authorized_keys fi chmod 600 /usr/data/ssh/.ssh/authorized_keys 2>/dev/null # /root 只读 -> bind 可写的 ssh 工作目录过去 mount --bind /usr/data/ssh /root 2>/dev/null # MeowAPPs 应用加载器: 把看门狗复制到可写卷 (cave exec 路径 /usr/data/meow_watchdog) if [ -f /usr/bin/meow_watchdog ]; then cp -f /usr/bin/meow_watchdog /usr/data/meow_watchdog 2>/dev/null chmod 755 /usr/data/meow_watchdog 2>/dev/null fi # 首次开机:生成 ed25519 host key if [ ! -f /usr/data/ssh/dropbear_ed25519_host_key ]; then /usr/sbin/dropbearkey -t ed25519 -f /usr/data/ssh/dropbear_ed25519_host_key \ >> /usr/data/ssh.log 2>&1 chmod 600 /usr/data/ssh/dropbear_ed25519_host_key fi # 启动 dropbear:仅 pubkey 认证,禁用端口转发 /usr/sbin/dropbear -j -k \ -r /usr/data/ssh/dropbear_ed25519_host_key \ -p 22 \ -P /usr/data/ssh/dropbear.pid \ >> /usr/data/ssh.log 2>&1 & ;; stop) killall dropbear 2>/dev/null sleep 1 umount /root 2>/dev/null ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0