有时显然是随机的,在屏幕或 tmux 下,我无法从 @u 读取用户密钥,我可以从其他终端读取,甚至是我刚刚添加的密钥:
工作时:
$ keyctl pipe $(keyctl padd user test @u <<<"test messsage")
test messsage
失败时:
$ keyctl pipe $(keyctl padd user test @u <<<"test messsage")
keyctl_read_alloc: Permission denied
造成这种情况的原因是什么,我该如何解决或预防它?
当您关闭创建 tmux 或 screen 会话的 shell 会话时,可能会发生这种情况。
关闭 shell 会话将破坏原始会话密钥环,以便当您在另一个会话下重新附加时(或者即使屏幕或 tmux 窗口继续运行),也无法再访问它。 Screen 或 tmux 使 shell 保持运行,但它们不会使会话密钥环保持运行。
修复损坏的 tmux 或屏幕窗口的方法是获取新的 keyctl 会话并将其链接到用户会话。
$ keyctl new_session
$ keyctl link @u @s
(如果您在没有先创建新会话的情况下尝试 keyctl 链接,则会收到错误:
keyctl_link: Key has been revoked
)
这两条语句将修复从该屏幕或 tmux 窗口中的该 shell 生成的任何 new 进程,但不会影响从现有 tmux 或 screen 进程或当前窗口中的现有进程生成的新窗口。
但你想要的是它从一开始就不会成为问题。
当您启动 screen 或 tmux 时,您(或者 screen 或 tmux)应该启动这个新的 keyctl 会话。然后,当启动 shell 注销并销毁其会话密钥环时,它不会影响屏幕或 tmux。
这个表达式前缀适用于任何命令:
keyctl session - bash -c 'keyctl link @u @s && exec "$@"' key-session tmux
文本
key-session
只是一个$0
标签,它没有任何意义,它只是在ps
之前的几毫秒内以top
或exec
给出一个好听的名字。您可以在 tmux 之后传递附加参数。
这些步骤创建一个新会话,然后将用户密钥环链接到会话密钥环。我不知道为什么需要这样做,但这是使其发挥作用的必要步骤。
如果您以这种方式启动 tmux(或 screen),那么所有窗口、子进程等都将有一个比启动会话持续时间更长的持久会话,因此您可以放心地分离和注销。
但是,这会创建一个新的会话密钥环,并删除所有这些子流程的旧密钥环。如果这很重要,那么您将必须阅读有关名称会话密钥环的信息并进行一些密钥环链接。