如何允许Snap应用程序访问/tmp文件夹?

通常我会避免使用基于Snap的应用程序,但有时候我确实需要它们。
例如 - Markdown Lint Tool只以Snap命名为mdl
当文件位于主文件夹时,它的效果非常好 -
$ echo "# header" > ~/test.md
$ /snap/bin/mdl ~/test.md ; echo $?
0

但是当文件位于/tmp目录时,它会失败:
$ echo "# header" > /tmp/test.md
$ cat /tmp/test.md
# header
$ /snap/bin/mdl /tmp/test.md
/snap/mdl/140/lib/ruby/gems/2.4.0/gems/mdl-0.9.0/lib/mdl/doc.rb:57:in `read': No such file or directory @ rb_sysopen - /tmp/test.md (Errno::ENOENT)
    from /snap/mdl/140/lib/ruby/gems/2.4.0/gems/mdl-0.9.0/lib/mdl/doc.rb:57:in `new_from_file'
    from /snap/mdl/140/lib/ruby/gems/2.4.0/gems/mdl-0.9.0/lib/mdl.rb:75:in `block in run'
    from /snap/mdl/140/lib/ruby/gems/2.4.0/gems/mdl-0.9.0/lib/mdl.rb:73:in `each'
    from /snap/mdl/140/lib/ruby/gems/2.4.0/gems/mdl-0.9.0/lib/mdl.rb:73:in `run'
    from /snap/mdl/140/lib/ruby/gems/2.4.0/gems/mdl-0.9.0/bin/mdl:10:in `<top (required)>'
    from /snap/mdl/140/bin/mdl:23:in `load'
    from /snap/mdl/140/bin/mdl:23:in `<main>'

对于这个特定的应用程序,没有snap connect的选项。
$ snap connections | grep mdl
home                      mdl:home                             :home                                 -

此外,我无法以经典方式进行安装:

$ snap install mdl --classic 
Warning: flag --classic ignored for strictly confined snap mdl

mdl 0.9.0 from Snapcrafters installed

我应该怎么做才能让Snap应用程序完全访问/tmp文件夹?
这是Snap的设计吗?


1关于这个问题之前有过一次长时间的讨论:https://askubuntu.com/questions/1033344/how-to-give-snaps-access-to-somedir。听起来并不乐观。 - ajgringo619
我通过终端检查了snap,并且"snap find mdl"没有返回提供的经典版本。这是一件事。另外,(这是从GitHub复制粘贴的)Markdownlint是用Ruby编写的,并且作为一个rubygem分发。只要您的系统上有一个相对最新的Ruby版本,安装和使用markdownlint将会很简单。您有两个选项来安装它:要从rubygems安装,请运行:gem install mdl - Thomas Byers
谢谢@ThomasByers,但让我们解决这个问题。我了解Ruby和Gem。在我看来,这个问题对受影响的应用程序来说有更广泛的影响。 - N0rbert
2个回答

看起来你可能正在寻找“正确”的方式来解决与快照相关的问题...

但如果你正在寻找一个解决方法,以便可以使用你的 tmp 目录,你可以:

mkdir /home/you/tmp
sudo mount --bind /tmp /home/you/tmp/

mdl将通过/home/you/tmp挂载点完全访问/tmp目录。
echo "# header" > /home/you/tmp/test.md
mdl /home/you/tmp/test.md

要使其永久生效,您可以将以下行添加到/etc/fstab文件中:
 # <file system> <mount point>   <type>  <options>       <dump>  <pass>
/tmp        /home/you/tmp   auto    bind    0   3

使用sudo update-initramfs -u -k all重新构建initrd。

它真的有效,有点取巧。 - N0rbert
@N0rbert 是的,我想你可能会有这种感觉... 我还没有想出其他关于交叉分区和快照的解决方案... 像你一样,我只是尽量避免它们。 - WU-TANG
我已经将建议的行添加到fstab中,所以现在它是永久的。谢谢。奖励即将到来 :) - N0rbert
天哪,Ubuntu 把 /tmp 弄坏了,却似乎没人在意?修复还涉及到 fstab?这太令人气愤了! - mlissner
2@mlissner... 这不是关于 /tmp 的问题... 它涉及到除了 /home/username 和 snaps 之外的任何目录... 这也不是一种解决方法,而是一种与 OP 想要的方式一起使用 snaps 的权宜之计... 你没有仔细阅读问题 - WU-TANG
我理解这个问题。这个人想要以完全正常的方式使用 /tmp 目录。我试图从 Firefox 使用 /tmp,但是无法成功。你可以用任何措辞来表达,但在我的观点中,如果我不能从一个应用程序中使用 /tmp,那么一定有什么东西出了问题,而且我对 Ubuntu 认为这是可以接受的感到震惊。 - mlissner
3你显然没有读懂问题。你甚至没有读懂答案。见鬼,你甚至没有读过我的评论。别人可以花时间重复一遍,但这与/tmp无关...它是SNAPS + 用户主目录之外的任何其他目录...所以,不,/tmp并没有“损坏”,这种说法太荒谬了。如果是这样的话,那么用户具有读写权限的每个其他(非主目录)目录也都是损坏的...我想大多数人都明白/tmp不是问题所在,也许这就是为什么“似乎没人在意”的原因。 - WU-TANG
嗨 @WU-TANG,谢谢你的技巧!问题:你能解释一下为什么“使用sudo update-initramfs -u -k all重新构建initrd”是必要的吗?只添加到fstab中不就足够了吗?谢谢!^_^ - Gerard Bosch
@GerardBosch 你好....我不确定...如果你查看编辑记录,"to make it permanent...."这部分是由原作者"N0rbert"添加的。对于他的逻辑我很感兴趣,只是一直没有机会问他...然后两年过去了。 - WU-TANG
我按照建议将/tmp挂载了起来。我试图用okular(snap)从Thunderbird打开一个.pdf附件。当双击附件时,在/tmp/pid-xxx/attachment.pdf中创建了一个文件,但是我收到了okular的错误消息。不过,我可以双击打开所创建的文件。这是连接问题吗? - giammi56
@giammi56 我不确定,但听起来好像不是这样的。如果你能用快照软件在/tmp目录下创建文件,那么原帖中的问题似乎已经解决了。尤其是如果之前这部分对你来说是无法工作的。你可能需要进一步研究一下这条信息在说什么。 - WU-TANG
@WU-TANG 我可以从Okular snap中保存一个.pdf文件到/tmp,并且在Nautilus上双击它后能够阅读。但是,当从Thunderbird提示阅读时,连接会中断。 - giammi56

我通常非常支持改变和Ubuntu,但是如果你和我一样,觉得这个真的很烦人,我想到的解决办法是在我的主目录下添加一个文件夹:

mkdir /home/mlissner/tmp

并且在重新启动时添加一个crontab来清除它:
sudo crontab -e

然后添加:
@reboot rm -rf /home/mlissner/tmp/*

不得不这样做真是愚蠢。

我完全支持沙盒和安全性。我完全支持改变,但这却删除了一个重要的用例:“将文件保存在这里,然后在我不考虑的情况下将其删除。”

从用户角度来看,它也非常有bug。你可以从Firefox中将东西保存到/tmp目录,没有错误。但是当你尝试在文件浏览器中找到那个东西时,它却不存在。真是令人疑惑。

算我非常恼火。


最后,这就是我做的。一切都太烦人了。 - mlissner
3在最新的Ubuntu版本(至少22.04)中,apt软件包安装了snap版本。 - KumZ
杰出的解决方案。谢谢! - armor