在 Emacs 中,如何使用 Tramp SSH 以不同的组 ID 进行编辑?

In Emacs, how do I use Tramp SSH to edit as a different group ID?

我想我正在寻找的可能是类似于使用 SSH 和 su 进行多跳的解决方案;但我必须使用 sg 而不是 su。用例是我在服务器上有一个用户,出于管理原因,该用户属于多个组(主组 ID group_A、第二组 ID group_B)。使用 SELinux Access Control 所以即使一个目录是我所有的,但如果我的主要组 ID 不正确,我将无法创建文件。在交互式会话中,我会执行 chgrp group_B 切换我的主要组,然后将创建一个新的 shell 会话。如果远程启动程序,我会做 ssh foo.com 'sg group_B /path/to/executable'。如何在 Emacs/Tramp 中实现这些效果?

我发现sshsu等定义在tramp-methods中,可以如下自定义添加另一种名为sg的连接方法:

(eval-after-load 'tramp
  '(add-to-list
    'tramp-methods
    '("sg"
      (tramp-login-program "sg")
      (tramp-login-args (("-") ("%u")))
      (tramp-remote-shell "/bin/sh")
      (tramp-remote-shell-args ("-c")))))

那就可以了

C-x C-f /ssh:myuser@remotehost|sg:group_B@remotehost:/path/to/file

使用ssh通过multi-hops连接到remotehost作为myuser,然后使用[将主组从group_A切换到group_B =15=].