[software development] 给文件管理器添加飞牛扩展
Tofloor
poster avatar
玲泷沙.spark
deepin
7 hours ago
Author

https://gitee.com/humanfans/dde-filemanger-fnos

上传到飞牛 (fnnas-uploader)

DDE 文件管理器右键菜单扩展:将选中的文件/目录通过 SMB 上传到飞牛 NAS (fnOS)。

功能

  • 右键文件/目录(支持多选)→「上传到飞牛」→ 弹窗输入目标目录 → 上传
  • 目标目录自动逐级创建;目录整体上传时保留本地目录结构
  • 支持中文文件名、含空格路径、嵌套目录
  • 连接设置:服务器地址/用户名/密码三步输入,自动列出共享供选项选择,并设置默认保存路径;上传时预填默认路径可修改
  • 上传结果通过系统通知反馈;详细日志在 ~/.config/fnnas-uploader/upload.log

菜单结构

上传到飞牛
├── 选择目录并上传...    → fnnas-upload.sh upload %F
└── 连接设置...          → fnnas-upload.sh config

安装

./install.sh          # 用户级安装, 无需 root

安装内容:

  • 菜单配置 → ~/.local/share/deepin/dde-file-manager/context-menus/fnnas-upload.conf
  • 上传脚本 → ~/.local/share/fnnas-uploader/scripts/fnnas-upload.sh

菜单约 300ms 自动生效;若未出现,重启文件管理器:

killall dde-file-manager 2>/dev/null; dde-file-manager &

卸载:./uninstall.sh

deb 包安装(推荐)

# 构建(项目根目录, 需要 dpkg-dev debhelper)
dpkg-buildpackage -uc -us -b
# 产物: ../fnnas-uploader_1.0.0-1_all.deb

# 安装 / 卸载
sudo dpkg -i fnnas-uploader_1.0.0-1_all.deb
sudo dpkg -r fnnas-uploader

deb 包将菜单配置安装到系统级 /usr/share/applications/context-menus/,
脚本安装到 /usr/share/fnnas-uploader/scripts/。安装 deb 前建议先卸载用户级
安装(否则用户级配置优先级更高,会遮蔽系统级)。

依赖

  • smbclient(samba-client 包)
  • zenity(Deepin 自带)
  • notify-send(libnotify-bin)
sudo apt install smbclient zenity libnotify-bin

使用

  1. 右键任意文件/目录 →「上传到飞牛」→「连接设置...」,按步骤填写:
    • 服务器地址(如 192.168.1.38)
    • 用户名(留空表示匿名访问)
    • 密码
    • 连接成功后自动列出服务器上的共享,从选项列表中选择默认保存共享
    • 输入该共享内的默认保存目录(留空 = 共享根目录)
  2. 右键目标文件 →「上传到飞牛」→「选择目录并上传...」
  3. 弹窗预填默认保存路径,可修改(留空 = 共享根目录),确定后开始上传

配置与日志

  • 连接配置:~/.config/fnnas-uploader/config(权限 600,含明文密码,请勿共享)
  • 日志:~/.config/fnnas-uploader/upload.log

也可手动编辑 config:

SERVER=192.168.1.38
SHARE=ywk
PORT=445
USER=james
PASSWORD=***
DEFAULT_TARGET=/备份

DEFAULT_TARGET 为默认保存路径(共享内目录,可留空)。

技术说明

  • 采用 dde-file-manager 的 Custom Menu Script 扩展机制(零 C++ 编译,
    配置 + 脚本即可),规范见 dde-file-manager docs/extension/01-custom-menu-script.md
  • 上传通过 smbclient 交互式 stdin 命令流实现:
    • 目标目录逐级 mkdir(已存在自动复用)
    • 每个文件先 lcd 到本地父目录再 put basename(smbclient 的 put 不接受本地绝对路径)
    • 目录递归:阶段 1 去重建目录,阶段 2 从共享根绝对导航后逐个上传
  • 密码通过 PASSWD 环境变量传递,避免出现在进程列表

项目结构

fnnas-uploader/
├── menus/
│   └── fnnas-upload.conf        # 右键菜单配置 (__SCRIPTS_DIR__ 为路径占位符)
├── scripts/
│   └── fnnas-upload.sh          # 上传/配置脚本 (可被 source 做函数测试)
├── debian/                      # deb 打包 (dpkg-buildpackage)
│   ├── control                  #   包元信息与依赖
│   ├── rules                    #   安装规则 (sed 替换脚本路径占位符)
│   ├── changelog
│   ├── copyright                #   GPL-3.0-or-later
│   └── source/format            #   3.0 (native)
├── install.sh                   # 用户级安装
├── uninstall.sh                 # 用户级卸载
└── README.md

开发与验证

# 语法检查
bash -n scripts/fnnas-upload.sh

# 函数级测试 (脚本含 source guard, 可作函数库)
SERVER=192.168.1.38 USER=james PASSWORD=*** PORT=445 \
    source scripts/fnnas-upload.sh && list_shares

# 无弹窗上传测试 (FNNAS_TARGET 跳过 zenity)
FNNAS_TARGET=/测试目录 scripts/fnnas-upload.sh upload 文件1 目录2

# 打包
dpkg-buildpackage -uc -us -b

许可证

GPL-3.0-or-later,详见 debian/copyright

更新日志

  • 1.0.0 (2026-08-09)
    • 右键菜单「上传到飞牛」:选择目录并上传 / 连接设置
    • 连接向导:服务器/用户名/密码 + 自动列出共享选择 + 默认保存路径
    • SMB 上传:目录递归、中文/空格路径、目标目录自动创建
    • deb 打包支持
Reply Favorite View the author
All Replies
avatar
MeGusta
deepin
an hour ago
#1

这个棒,配个截图效果会更好~

Reply View the author