我正在尝试将awesome
Windows 管理器作为ssh-agent
. 当我使用startx
(ssh-agent startx
)时它起作用了。但现在我正试图让它在lightdm
.
lightdm
开始/usr/bin/xinitrcsession-helper
:
#!/bin/bash
exec $HOME/.xinitrc
~/.xinitrc
:
ssh-agent awesome
我得到的是:
509 1 lightdm /usr/bin/lightdm
526 509 Xorg /usr/lib/Xorg :0 -seat seat0 -auth /run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
877 509 lightdm lightdm --session-child 14 21
1003 877 xinitrcse /bin/bash /usr/bin/xinitrcsession-helper
1028 1003 awesome awesome
1029 1028 ssh-a ssh-agent awesome
并且set | grep SSH
什么也不返回。
然后我开始另一个xterm
( ssh-agent xterm
) 并且它有效:
1636 1 xterm xterm
1638 1636 bash bash
1651 1638 vim vim
9435 1651 xterm xterm
9447 9435 ssh-a ssh-agent xterm
9449 9435 bash bash
10464 9449 ps ps -eHo pid,ppid,comm,args
10465 9449 les less
这里奇怪的是ssh-agent
它启动的程序是一个子程序。你能解释一下吗?
以及如何运行awesome
以便之后启动的程序可以看到ssh-agent
?
UPD关于ssh-agent
成为它运行的命令的孩子。那是为了能够替换command
为ssh-agent command
. 所以,ssh-agent
forks 和 parentexec
是command
.
UPD我的不好,我用xbindkeys
的是 start xterm
,而前者恰好是之前启动的ssh-agent
。就像在,xbindkeys && ssh-agent awesome
。所以,它没有SSH_*
变量可以传递给xterm
. 或者说是我最可能的解释。当使用awesome
's 的内置工具启动时xterm
,环境变量是可以传递下来的。
在您的更新中,您提到您
xterm
从开始xbindkeys
并从运行开始bindkeys
不会有与 SSH 相关的环境,因此xterm
也不会。为了解决这个问题,我建议
现在,这将为两者设置变量
xbindkeys
and (这很可能是您需要和想要的),但是当您注销时awesome
它不会自动终止该进程。ssh-agent
为此,您可以使用 (with
bash
),或类似的东西。这将调用
ssh-agent -k
which 将杀死代理,只要该 shell 退出或被TERM
,HUP
或终止INT
。eval
在 的输出上运行ssh-agent -k
只会取消设置 SSH 变量,并且可能不需要它(因为脚本无论如何都将退出),因此可以将陷阱设置为仅运行ssh-agent -k >/dev/null
。ssh-agent
作为它启动的命令的子进程的事情看起来很奇怪。ssh-agent
分叉出实际的代理进程,然后用它应该运行的命令替换原始进程(使用exec()
)。结果是原始进程(xterm
在您的第二个进程树中)是代理的父进程:(然后子进程继续执行其余代码)
例如,这允许您杀死代理而不会对您要运行的命令产生太大影响。