# start_ssh_for_ee47 **Repository Path**: windstarry/start_ssh_for_ee47 ## Basic Information - **Project Name**: start_ssh_for_ee47 - **Description**: 在ee4.7开启ssh和scp功能 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-25 - **Last Updated**: 2026-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # start_ssh_for_ee47 — EmuELEC 设备 SSH / SCP / SFTP 文件传输方案 ## 项目简介 为运行 **EmuELEC 4.7-Nexus(aarch64)** 的掌机 / 盒子,解决其「仅有 dropbear SSH、无 scp / sftp 文件传输」的问题:通过**重编 dropbear**(把端口目录编入会话 PATH)+ 部署 **scp / sftp-server** 二进制,使 **SSH 与 SCP / SFTP 在开机启动的 dropbear 上同时可用**。客户端可直接用 `scp` / `sftp` / WinSCP(SFTP) 传文件,无需任何额外工具。 - 目标机:`192.168.137.195`,端口 `22`,用户 `root`,密码 `emuelec` - 构建配方:`build/build_sftp2.sh`(自包含,源码包随仓库,可离线复现) - 完整部署说明见 [`scp_enable_plan.md`](./scp_enable_plan.md) --- ## 目录结构 ``` start_ssh_for_ee47/ ├── dropbear/ # 设备部署包(与 /storage/roms 同构,整体上传) │ ├── ports/dropbear/ │ │ ├── bin/ # 可执行文件(明细见下表) │ │ ├── libs/ # 私有共享库(明细见下表) │ │ ├── panel/ # LÖVE 状态面板(main.lua + conf.lua,只读展示) │ │ ├── love # LÖVE 启动器入口(注入 libs / libmali / kmsdrm 后 exec 主程序) │ │ ├── DropBear.status.sh # 状态采集层(启动时生成 status.txt,不入库) │ │ ├── LICENSE.txt # LÖVE 及依赖的许可文本(zlib 等) │ │ ├── dropbear_ecdsa_host_key # 主机密钥(拷贝自 $TARGET_DIR,指纹不变) │ │ ├── dropbear_rsa_host_key │ │ └── authorized_keys │ └── ports_scripts/DropBear.sh # 改造版启动脚本(自检 / 回滚 / DB_PORT 开关) ├── build/ # 构建工作区(仅保留配方与源码包,中间产物已 gitignore) │ ├── build_sftp2.sh # 唯一构建配方(自包含:下载 → 编译 → 取 sftp-server → 捆绑库) │ └── dl/dropbear-2025.87.tar.bz2 # dropbear 2025.87 源码包,入库以保证离线复现 ├── ee-filex.sh # tar-over-ssh 传输工具(put / get) ├── ee-cmd.sh # 远端命令执行工具 ├── SSH Over OTG.sh # EE4.7 适配的 OTG 直连脚本(备件,当前内核不支持) ├── scp_enable_plan.md # SSH / SCP / SFTP 部署说明(原规划,现已落地) ├── .gitattributes # 强制全仓库 LF;ELF 二进制标为 binary ├── .gitignore └── README.md ``` ### 端口资源目录的归类约定 目录按「按文件类型归类」组织(2026-09-26 整理:原 `runtime/` 已拆并进 `bin/` 与 `libs/`): | 目录 / 文件 | 放什么 | |---|---| | `bin/` | 可执行文件 + 靠 `$ORIGIN` 定位的依赖(dropbear 工具集、LÖVE 主程序、`libcrypto.so.1.1`) | | `libs/` | 由启动器显式注入路径的私有库(LÖVE 的 4 个库) | | `love` | LÖVE 启动器(唯一入口,注入环境变量后 `exec bin/love.aarch64`) | | `panel/` | 面板 Lua 源码 | > **`bin/` 这个目录名不能改。** 它已编译进 dropbear 二进制作为 SSH 会话的 > `DEFAULT_ROOT_PATH`(实跑 `strings bin/dropbear` 可见 > `/usr/sbin:/usr/bin:/sbin:/bin:/storage/roms/ports/dropbear/bin`), > 改名会导致会话里找不到 `scp` 而失效 —— 除非重新交叉编译二进制。 > **为什么 `libcrypto.so.1.1` 只能留在 `bin/`,不进 `libs/`。** > `sftp-server` 用 `$ORIGIN` rpath 在自身同目录找它,而固件不带 openssl 1.1 > (`/usr/lib/libcrypto.so.1.1` 不存在),所以这条依赖只能靠「同目录」满足。 > 整理时试过三条「外移 + 兜底」路线,**全部实测失败**,结论记录在此避免重复踩坑: > > | 尝试 | 结果 | > |---|---| > | 挪进 `libs/` + `DropBear.sh` export `LD_LIBRARY_PATH` | 守护进程环境里有该变量,但 **dropbear fork 出的 SSH 会话环境是 `NONE`**(不继承),SFTP 协商 EOF 失败 | > | `patchelf --set-rpath` 改写绝对路径 | 设备 patchelf 0.12 报 `cannot normalize PT_NOTE segment`,改不动该 ELF | > | `bin/` 放软/硬链接指向 `libs/` | `/storage/roms` 是 **vfat**,`ln -s` 直接 `Operation not permitted` | > > LÖVE 的 4 个库之所以能放 `libs/`,是因为 `love` 启动器在**脚本内**注入环境变量后立刻 > `exec`,不经 SSH 会话,不受上面的限制。 > **`libdl.so.2` / `libpthread.so.0` 的旧副本已删除。** 实测二者从未被加载 > (`ldd` 显示一律解析到系统的 `/usr/lib` 版本,glibc 2.36 中 libpthread 已并入 libc)。 > 它们是纯冗余文件,删除后 sftp-server / scp 实跑均无变化。 ### `dropbear/ports/dropbear/bin/` 明细(可执行文件) | 文件 | 字节 | 用途 / 说明 | |---|---:|---| | `dropbear` | 551,496 | 重编后的服务端:会话 PATH 与 SFTPSERVER_PATH 已内嵌 | | `dropbear.orig` | 5,479,776 | 原版 dropbear 备份,启动失败时由脚本自动回滚 | | `dropbearkey` | 4,666,992 | **必需**:主机密钥缺失时由启动脚本调用生成 | | `dropbearconvert` | 4,677,304 | 密钥格式转换工具 | | `scp` | 34,616 | scp 二进制(动态链接,**不可**静态链,否则 SIGSEGV) | | `sftp-server` | 129,080 | OpenSSH 版 SFTP 后端,用 `$ORIGIN` 找 libcrypto | | `libcrypto.so.1.1` | 2,612,960 | sftp-server 依赖的 openssl 1.1(固件无此库),**必须与 sftp-server 同目录** | | `love.aarch64` | 10,168 | LÖVE 11.5 主程序(`LOVE 11.5 (Mysterious Mysteries)`) | > `dropbearconvert` / `dropbearkey` 并非 `build_sftp2.sh` 的产物(该配方只 `make PROGRAMS=dropbear`), > 系早期配方遗留,但 `DropBear.sh` 第 47 行对 `dropbearkey` 作**硬性存在校验**(缺失即 fail 退出), > 故重编出新包时必须连同二者一并部署,详见下文「重新构建」。 ### `dropbear/ports/dropbear/libs/` 明细(LÖVE 私有库) 「私有」指固件不自带、必须由本端口提供。这些库全部由 `love` 启动器注入加载路径, 不需要任何环境变量,也不含 glibc 核心库。 | 文件 | 字节 | 用途 / 说明 | |---|---:|---| | `liblove-11.5.so` | 4,143,824 | LÖVE 引擎主体 | | `libluajit-5.1.so.2` | 428,704 | LuaJIT | | `libmodplug.so.1` | 256,496 | 模块音乐解码 | | `libogg.so.0` | 38,648 | Vorbis 解码 | LÖVE 部分取自设备 `/storage/roms/ports/PortMaster/runtimes/love_11.5/`(PortMaster 官方运行时), 原样复制未作改动,**不依赖 PortMaster 目录**,也不改设备系统库。md5 校验值: | 文件 | md5 | |---|---| | `bin/love.aarch64` | `3aac90fe8a035e7c9d36d88ac948cabd` | | `libs/liblove-11.5.so` | `ed09397d6f061c2ae346559d9534c23a` | | `libs/libluajit-5.1.so.2` | `4256a24e2675e8a36da4e0859ed8cafd` | | `libs/libmodplug.so.1` | `65938ffb349530e0a3c515f29058bb3f` | | `libs/libogg.so.0` | `11ff3fa6166a15477eb79245553b8fc0` | 调用方式(启动器已内含 libs 路径、libmali 前置与 `SDL_VIDEODRIVER=kmsdrm`,无需手工 export): ```bash /storage/roms/ports/dropbear/love /storage/roms/ports/dropbear/panel ``` --- ## 快速使用 ```bash # 上传(默认 SFTP 模式,无需 -O) scp -P 22 /本地/路径/文件 root@192.168.137.195:/tmp/ # 下载 scp -P 22 root@192.168.137.195:/tmp/文件 /本地/目录/ # 交互 SFTP sftp -P 22 root@192.168.137.195 ``` **WinSCP**:文件协议选 **SFTP**,主机 `192.168.137.195`、端口 `22`、用户 `root`、密码 `emuelec`。 > 早期临时方案需 `scp -O`(传统 SCP 协议);现已部署 sftp-server,默认 SFTP 即可,老的 `-O` 仍兼容。 --- ## 重新构建(可选) 配方见 `build/build_sftp2.sh`,在 Docker 镜像内执行(**挂载目录用 `$PWD/build`,勿沿用旧的 `E:/Programs/ee_ssh/build` 绝对路径**): ```bash docker run --rm -v "$PWD/build:/work" \ ghcr.io/monkeyx-net/portmaster-build-templates/portmaster-builder:aarch64-latest \ bash /work/build_sftp2.sh ``` 产物落到 `build/out/`,再同步进 `dropbear/ports/dropbear/bin/` 并上传设备。 **重编后必查三件事**: 1. `dropbearkey` / `dropbearconvert` 是否随包部署(见上表说明,缺失会导致启动脚本 fail)。 2. `scp` 是否仍为动态链接——静态链会产生畸形 DYN,运行时 SIGSEGV(139)。 3. 新 `dropbear` 是否含内嵌路径:`strings bin/dropbear | grep /storage/roms/ports/dropbear/bin`。 --- ## 部署到设备 ```bash # 用仓库辅助脚本免交互上传(密码走 EE_PASS 环境变量) EE_PASS=emuelec bash ee-filex.sh put dropbear/ports/dropbear /storage/roms/ports/dropbear ``` 详细编译要点、部署步骤与实机验证结果见 [`scp_enable_plan.md`](./scp_enable_plan.md)。 --- ## 状态面板(Love2D) 启动脚本在 SSH 服务确认存活后自动执行两步: ```bash sh /storage/roms/ports/dropbear/DropBear.status.sh # ① 采集 -> status.txt(真实数据) /storage/roms/ports/dropbear/love .../panel # ② 全屏面板,约 5 秒自动退出 ``` - 面板显示 14 项真实状态(二进制实测字节数、监听地址、守护 PID、握手 banner `SSH-2.0-dropbear_2025.87`、活跃会话数、密钥/授权/面板运行时),按 OK/WARN/ERR 着色。 - 采集与面板都包在子 shell 里且失败不中断:**任何面板异常都不影响已经活着的 SSH**。 - `DB_PANEL=0 bash DropBear.sh` 可跳过面板(如开机自启无人看屏时); `DB_PANEL_HOLD=9` 可延长显示秒数(传给面板的环境变量)。 - `status.txt` 为运行时产物,由采集层在设备上生成,不入 git。 --- ## 注意事项 - 设备根分区只读(squashfs),部署物均在 `/storage`(ext4) 与 `/storage/roms`(vfat),已规避执行位坑; `DropBear.sh` 启动时仍会对 `scp` 与主机密钥补 `chmod 755`。 - 当前内核缺 USB 网络 gadget(RNDIS/ECM 未编译、USB `dr_mode=host`),故 `SSH Over OTG.sh` 暂不可用,留作备件;日常走网络 SSH/SCP/SFTP。 - Windows 宿主书写 shell 脚本须 LF-only,仓库 `.gitattributes` 已强制 `*.sh` 走 LF,避免 `/bin/sh: bad interpreter` 错误。 - 本仓库 `core.filemode=false`,git 索引中 `.sh` 均按 `100644` 记录,克隆到 Linux 后需自行 `chmod +x`;日常按 `bash <脚本>` 调用可绕过。 - `DropBear.sh` 默认会把 `/etc/shadow` 导出为 `/storage/roms/ports/check_shadow`(明文哈希落在 vfat 分区),如无需密码比对建议注释掉脚本末尾那一行以降低泄露风险。