Ubuntu 22.04 部分应用无法打开SFTP挂载的远程文件问题排查
问题根源
你遇到的情况其实挺常见的——能正常打开远程文件的应用(比如Gedit、LibreOffice)都原生支持GNOME的GVFS(GNOME Virtual File System),它能直接解析sftp://这类远程文件URI;而Geany、Sublime这类应用没有集成GVFS支持,它们只能识别本地文件系统的路径,完全看不懂sftp://开头的远程地址。
Ubuntu 22.04默认用GVFS来管理远程挂载(比如SFTP),这些远程目录其实会被悄悄挂载到本地的一个特殊路径下,只是平时不会直接显示出来而已。
快速解决方法:用本地挂载路径打开文件
先找到SFTP挂载后的本地实际路径
GVFS的挂载点默认在/run/user/你的用户ID/gvfs/目录下,你可以用这条命令快速查看当前的挂载点:ls /run/user/$(id -u)/gvfs/比如你的SFTP挂载会显示为
sftp:host=remote,user=me这样的文件夹,进入这个文件夹就能看到和远程一模一样的文件结构了。用本地路径启动应用
比如要打开那个远程的file.txt,直接用本地挂载路径运行:geany /run/user/1000/gvfs/sftp:host=remote,user=me/home/me_in_remote/file.txt这样Geany就能正常加载文件了。
长期解决方案:让不支持GVFS的应用兼容右键打开
如果不想每次都手动输路径,我们可以给这类应用加个“包装脚本”,自动把sftp://的URI转换成本地挂载路径,再传给应用:
创建一个包装脚本
比如给Geany创建geany-gvfs-wrapper,内容如下:#!/bin/bash # 处理GVFS远程URI,转换为本地挂载路径 if [[ "$1" == sftp://* ]]; then # 解析sftp URI的用户、主机和路径 uri="$1" user_host=$(echo "$uri" | sed -n 's/sftp:\/\/\([^@]*@[^/]*\).*/\1/p') user=$(echo "$user_host" | cut -d@ -f1) host=$(echo "$user_host" | cut -d@ -f2) remote_path=$(echo "$uri" | sed -n 's/sftp:\/\/[^/]*\(.*\)/\1/p') # 拼接成本地GVFS挂载路径 local_path="/run/user/$(id -u)/gvfs/sftp:host=$host,user=$user$remote_path" exec geany "$local_path" else # 如果是本地文件,直接打开 exec geany "$@" fi给脚本加执行权限
chmod +x geany-gvfs-wrapper可以把这个脚本放到
~/.local/bin/目录下(这个目录默认在你的系统PATH里,方便调用)。修改应用的.desktop文件
找到Geany的.desktop文件(一般在/usr/share/applications/geany.desktop或者~/.local/share/applications/),把Exec=那一行改成:Exec=geany-gvfs-wrapper %F保存后,右键选择Geany打开远程文件时,脚本就会自动转换路径,应用就能正常打开了。
补充说明
- 为什么右键菜单里的应用能打开?因为这些应用的.desktop文件已经配置了支持GVFS的参数(比如
MimeType里包含了远程文件类型,或者本身集成了GVFS),系统会自动把远程URI转换成它们能识别的格式。 - 对于Sublime Text,你可以用完全一样的方法创建包装脚本,修改它的.desktop文件来解决问题。
备注:内容来源于stack exchange,提问作者user171780

