【问题标题】:Tramp-Mode does not disconnect from sudo shell?Tramp-Mode 不会与 sudo shell 断开连接?
【发布时间】:2015-08-04 19:26:12
【问题描述】:

我使用 emacs 的 tramp-mode 来编辑 root 拥有的文件,语法为 /sudo::<filepath>

这工作得很好,但如果不通过 h​​top 或其他进程管理器手动杀死子进程,我似乎无法结束 sudo 会话。 tramp-cleanup-*-connection 命令不会结束会话。

如何让 emacs 结束 sudo 会话?理想情况下,我希望它在所有 sudo 打开的缓冲区都被杀死后结束会话。

【问题讨论】:

    标签: emacs tramp


    【解决方案1】:

    我不知道你为什么说“tramp-cleanup-*-connection 命令不会结束会话”;我的快速测试表明tramp-cleanup-this-connection 在我下次尝试做某事时强制 Tramp 重新连接。 (它会单独缓存密码,因此您不一定会收到密码提示;但您应该会在*Messages* 缓冲区中看到“正在打开连接”。)

    这里是您可以添加到kill-buffer-hook 的功能的快速介绍。它不是很优雅,但似乎可以工作。

    (defun tramp-cleanup-sudo-maybe ()
      "If the current buffer is a Tramp \"/sudo:\" buffer, cleanup its connection
    if there are no other sudo buffers remaining after killing this one."
      (save-match-data
        (let ((name (buffer-file-name))
              prefix buffers)
          (when (and name (string-match "\\`\\(/sudo:[^:]*:\\)" name))
            (setq prefix (match-string 1 name))
            (mapc (lambda (buf)
                    (when (string-prefix-p prefix (or (buffer-file-name buf) ""))
                      (setq buffers (cons buf buffers)) ))
                  (buffer-list) )
            (when (< (length buffers) 2)
              (tramp-cleanup-this-connection) ) ) )))
    

    如果您有很多缓冲区,这可能会变慢。如果您觉得需要优化它,我想您可以将每个遥控器的连接计数添加到您自己的alist(或者可能添加到一些现有的 Tramp 连接结构)。或者实际上只是将缓冲区列表的长度(减一,对于我们即将杀死的缓冲区)存储在全局中,然后在下一次调用时,简单地减少它 - 只有当它达到零时,再次扫描所有缓冲区并重新初始化变量;如果它确实是带有此前缀的最后一个 sudo 缓冲区,则进行清理。

    【讨论】:

    • 嗯...你是对的,它确实有效。不知道为什么我认为它没有......我会考虑制作一个用于自动清理的列表。我不知道kill-buffer-hook,所以这很有用,谢谢!
    • alist 可能是矫枉过正。作为第一个近似值,您可以检查tramp 文件名,如果它是/sudo:: 缓冲区,则循环打开缓冲区,如果有多个缓冲区,则不进行清理。如果结果很慢,可以设置一个全局计数器,当你杀死时递减,只有当它达到零时才循环(如果有新的 sudo 缓冲区,则重新初始化计数器)。
    • 用实际代码更新;对文本进行了重大重构,以反映我的理解有所提高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多