我正在运行带有加密主目录 (encryptfs) 的 Ubuntu 13.04 服务器。我保持一个 tmux 会话处于打开状态,其中包含我的开发环境(vim 等)。当我断开连接时,我将断开 tmux 会话,然后断开 ssh 连接。稍后,当我重新连接并重新附加 tmux 会话时,我会收到如下错误:
fatal: Could not change back to '(unreachable)/*****': No such file or directory
Run Code Online (Sandbox Code Playgroud)
这通常意味着 vim(在分离时仍然打开)保存到错误的位置,并且实际上不会将文件写入磁盘,只会写入“无法访问”目录,这似乎是临时的。
如果我从 bash运行 ' pwd '(重新连接后没有做任何其他事情),我会得到正确的目录/home/***/***。如果我运行 'git status',我会得到上面的消息(没有这样的文件),如果我在 vim 中运行' :pwd ',我会得到“ (unreachable)/*** ”。
对此的临时解决方法是运行 ' cd 。' 在运行任何其他命令之前,它允许 git/vim/etc 实际查看目录。这很不方便,因为我经常在 tmux 中打开许多面板/屏幕,我必须运行 ' cd 。' 每次我重新连接时。最重要的是,我必须确保在断开连接之前关闭 vim 或其他任何东西,否则如果我不小心,我可能会丢失数据。
我在某处看到另一个线程,将此归因于 encryptfs在注销时卸载$HOME,但没有回复。这似乎是一个可能的原因,但我不知道从哪里开始。有什么帮助吗?
如果您在注销时没有卸载受 ecryptfs 保护的主目录就足够了,您可以删除 ~/.ecryptfs/auto-umount 并且在您注销时它将停止卸载(这就是我所做的,debian wheezy)。我在 askubuntu 上找到了关于同一件事的这个线程,但是提供的脚本不起作用。这是一个修改版本。
#!/bin/bash
if tmux ls 2>&1 >/dev/null; then
# tmux is still running, do not auto-unmount
rm $HOME/.ecryptfs/auto-umount
else
# no tmux server, auto-unmount is OK.
touch $HOME/.ecryptfs/auto-umount
fi
Run Code Online (Sandbox Code Playgroud)
如该线程中所述,您可以将其作为注销脚本的一部分执行。
不幸的是,没有一种好方法可以让它卸载并让您的所有应用程序在 tmux attach 上自动 cd。如果需要,您可以考虑使用 tmux 键宏来向每个窗口和面板发出命令,如果您将应用程序保持在常规位置,或者有一种理智的方式来准确检测该窗口或面板中正在运行的应用程序;我个人从来没有想过这一点。