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()). 결과적으로 원래 프로세스( xterm두 번째 프로세스 트리)가 에이전트의 상위 프로세스가 됩니다.

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

(하위 프로세스는 나머지 코드를 계속 실행합니다.)

이를 통해 예를 들어 실행하려는 명령에 큰 영향을 주지 않고 에이전트를 종료할 수 있습니다.

관련 정보