awesome
Windows Managerをとして使用しようとしています。 ()を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
フォーク、親exec
はですcommand
。
UPD残念ながら、私はそれをxbindkeys
起動するために使用していた電子はxterm
偶然にssh-agent
。図、xbindkeys && ssh-agent awesome
。したがって、SSH_*
に渡す変数はありませんxterm
。それともそれが私の可能性が最も高い説明です。組み込みツールを使用してawesome
実行すると、xterm
環境変数が正しく渡されます。
答え1
アップデートでは、以下を実行しxterm
て開始したと述べました。xbindkeys
xbindkeys && ssh-agent awesome
bindkeys
SSH関連の環境はありませんxterm
。
この問題を解決するために提案します
eval "$(ssh-agent)"
xbindkeys && awesome
xbindkeys
これで(変数が必要であり、必要なものである可能性が高い)変数が設定されますが、awesome
ログアウト時にプロセスを自動的に終了するわけではありません。ssh-agent
これを行うには(と一緒にbash
)を使用できます。
eval "$(ssh-agent)"
trap 'eval "$(ssh-agent -k)"' EXIT
xbindkeys && awesome
またはそのようなもの。これはssh-agent -k
シェルがシャットダウンまたはシャットダウンするとTERM
呼び出されHUP
、エージェントがシャットダウンしますINT
。
eval
の出力を実行すると、ssh-agent -k
SSH変数の設定が解除されるだけで不要になる可能性があるので(どうせスクリプトが終了するため)、トラップを実行するように設定できますssh-agent -k >/dev/null
。
ssh-agent
起動するコマンドのサブプロセスであることそうだ奇妙な。
ssh-agent
実際のエージェントプロセスをフォークし、元のプロセスを実行したいコマンドのプロセスに置き換えます(使用exec()
)。その結果、元のプロセス(xterm
2番目のプロセスツリー)がエージェントの親プロセスになります。
/*
* Fork, and have the parent execute the command, if any, or present
* the socket data. The child continues as the authentication agent.
*/
if (D_flag || d_flag) {
log_init(__progname,
d_flag ? SYSLOG_LEVEL_DEBUG3 : SYSLOG_LEVEL_INFO,
SYSLOG_FACILITY_AUTH, 1);
format = c_flag ? "setenv %s %s;\n" : "%s=%s; export %s;\n";
printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name,
SSH_AUTHSOCKET_ENV_NAME);
printf("echo Agent pid %ld;\n", (long)parent_pid);
fflush(stdout);
goto skip;
}
pid = fork();
if (pid == -1) {
perror("fork");
cleanup_exit(1);
}
if (pid != 0) { /* Parent - execute the given command. */
close(sock);
snprintf(pidstrbuf, sizeof pidstrbuf, "%ld", (long)pid);
if (ac == 0) {
format = c_flag ? "setenv %s %s;\n" : "%s=%s; export %s;\n";
printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name,
SSH_AUTHSOCKET_ENV_NAME);
printf(format, SSH_AGENTPID_ENV_NAME, pidstrbuf,
SSH_AGENTPID_ENV_NAME);
printf("echo Agent pid %ld;\n", (long)pid);
exit(0);
}
if (setenv(SSH_AUTHSOCKET_ENV_NAME, socket_name, 1) == -1 ||
setenv(SSH_AGENTPID_ENV_NAME, pidstrbuf, 1) == -1) {
perror("setenv");
exit(1);
}
execvp(av[0], av);
perror(av[0]);
exit(1);
}
(サブプロセスは残りのコードを実行し続けます。)
これにより、たとえば、実行したいコマンドに大きな影響を与えずにエージェントをシャットダウンできます。