ssh-agentをラッパーとして使用する方法は?

ssh-agentをラッパーとして使用する方法は?

awesomeWindows Managerをとして使用しようとしています。 ()をssh-agent使用すると機能します。しかし今、私はそれを働かせようとしています。startxssh-agent startxlightdm

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

bindkeysSSH関連の環境はありません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 -kSSH変数の設定が解除されるだけで不要になる可能性があるので(どうせスクリプトが終了するため)、トラップを実行するように設定できますssh-agent -k >/dev/null


ssh-agent起動するコマンドのサブプロセスであることそうだ奇妙な。

ssh-agent実際のエージェントプロセスをフォークし、元のプロセスを実行したいコマンドのプロセスに置き換えます(使用exec())。その結果、元のプロセス(xterm2番目のプロセスツリー)がエージェントの親プロセスになります。

/*
 * 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);
}

(サブプロセスは残りのコードを実行し続けます。)

これにより、たとえば、実行したいコマンドに大きな影響を与えずにエージェントをシャットダウンできます。

おすすめ記事