ssh-agent를 래퍼 프로그램으로 어떻게 사용합니까?

엑스 유리

awesomeWindows 관리자를의 하위 프로세스로 시작하려고합니다 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합니까?

UPDssh-agent 가 실행되는 명령에 대한 자식에 관해서 . 즉 대체 할 수 있도록 만들어 commandssh-agent command. 따라서 ssh-agent포크와 부모 execcommand.

UPD 내 잘못, 나는 시작하기 위해 사용 xbindkeys하고 있었고 xterm전자는 전에 시작되었습니다 ssh-agent. 에서처럼 xbindkeys && ssh-agent awesome. 따라서 SSH_*전달할 변수가 없었 습니다 xterm. 아니면 내 가장 가능성있는 설명입니다. awesome의 내장 기능을 사용하여 시작 xterm하면 환경 변수가 올바르게 전달됩니다.

Kusalananda

당신의 업데이트에 당신은 당신이 시작 언급 xterm에서 xbindkeys하고 있기 때문에 당신이 실행

xbindkeys && ssh-agent awesome

bindkeysSSH 관련 환경 xterm이 없으며 그 결과로도 마찬가지입니다.

이 문제를 해결하기 위해

eval "$(ssh-agent)"
xbindkeys && awesome

이제는 xbindkeysawesome(필요하고 원하는 것일 수 있음) 둘 다에 대한 변수를 설정 하지만 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두 번째 프로세스 트리에서)가 에이전트의 상위가됩니다.

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

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

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

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ssh-agent + ssh-add와 마찬가지로 gpg-agent를 어떻게 사용합니까?

분류에서Dev

내 C ++ 프로그램에서 아래 첨자 숫자를 어떻게 사용합니까?

분류에서Dev

SSH 사용자를 다른 SSH 로그인으로 리디렉션하려면 어떻게해야합니까?

분류에서Dev

SSH 사용자를 다른 SSH 로그인으로 리디렉션하려면 어떻게해야합니까?

분류에서Dev

프로그래밍 방식으로 텔레 그램 메시지를 어떻게 보내고 받습니까?

분류에서Dev

프로그래밍 방식으로 또는 cmd를 통해 특정 응용 프로그램으로 어떻게 전환 할 수 있습니까?

분류에서Dev

프로그래밍 방식으로 클라이언트에 SSH 호스트 키를 추가하려면 어떻게해야합니까?

분류에서Dev

ViewController를 프로그래밍 방식으로 어떻게 표시합니까?

분류에서Dev

AbstractMongoEventListener를 프로그래밍 방식으로 어떻게 등록합니까?

분류에서Dev

ssh-agent로 호스트 키 검사를 억제하려면 어떻게해야합니까?

분류에서Dev

ssh-agent로 호스트 키 검사를 억제하려면 어떻게해야합니까?

분류에서Dev

텔레 그램 봇 API를 사용하여 파이썬으로 수직 사용자 정의 키보드 레이아웃을 프로그래밍 방식으로 생성하려면 어떻게해야합니까?

분류에서Dev

프로그램 시작시 클래스의 인스턴스를 자동으로 암시 적으로 생성하려면 어떻게해야합니까?

분류에서Dev

내 kivy 프로그램에서 json api를 어떻게 사용합니까?

분류에서Dev

ssh-agent에서 하나의 키만 사용하도록 ssh를 얻으려면 어떻게해야합니까?

분류에서Dev

수퍼 뷰와 일치하도록 프로그래밍 방식으로 UIViews Autolayout 가장자리를 어떻게 할당합니까?

분류에서Dev

Python으로 사용자 지정 그래프를 만들어 이미지로 라텍스로 내보내려면 어떻게해야합니까?

분류에서Dev

프로그래밍 방식으로 사용자를 로그 아웃하려면 어떻게해야합니까? [Django]

분류에서Dev

수퍼 유저 권한이 필요한 프로그램에서 Valgrind를 어떻게 실행합니까?

분류에서Dev

Aliyun Python SDK를 사용하여 프로그래밍 방식으로 계정 ID 번호를 얻으려면 어떻게해야합니까?

분류에서Dev

Joomla 2.5에서 프로그래밍 방식으로 사용자에게 메모를 추가하려면 어떻게해야합니까?

분류에서Dev

프로그래밍 방식으로 dijit TextBox를 어떻게 만듭니 까?

분류에서Dev

Orchard 1.9에서 분류 용어를 프로그래밍 방식으로 복사하려면 어떻게해야합니까?

분류에서Dev

Ubuntu Server 설치 프로그램은 Github에서 ssh 키를 어떻게 얻습니까?

분류에서Dev

Ubuntu Server 설치 프로그램은 Github에서 내 ssh 키를 어떻게 얻습니까?

분류에서Dev

C #을 사용하여 프로그래밍 방식으로 "웹 사이트 모드 열기"에서 Visual Studio를 열려면 어떻게합니까?

분류에서Dev

SSH를 통해 트래픽을 터널링하는 로컬 SOCKS 프록시를 어떻게 설정합니까?

분류에서Dev

SSH를 통해 트래픽을 터널링하는 로컬 SOCKS 프록시를 어떻게 설정합니까?

분류에서Dev

graphviz를 사용하여 Thompson의 구성을 어떻게 그래프로 표시합니까?

Related 관련 기사

  1. 1

    ssh-agent + ssh-add와 마찬가지로 gpg-agent를 어떻게 사용합니까?

  2. 2

    내 C ++ 프로그램에서 아래 첨자 숫자를 어떻게 사용합니까?

  3. 3

    SSH 사용자를 다른 SSH 로그인으로 리디렉션하려면 어떻게해야합니까?

  4. 4

    SSH 사용자를 다른 SSH 로그인으로 리디렉션하려면 어떻게해야합니까?

  5. 5

    프로그래밍 방식으로 텔레 그램 메시지를 어떻게 보내고 받습니까?

  6. 6

    프로그래밍 방식으로 또는 cmd를 통해 특정 응용 프로그램으로 어떻게 전환 할 수 있습니까?

  7. 7

    프로그래밍 방식으로 클라이언트에 SSH 호스트 키를 추가하려면 어떻게해야합니까?

  8. 8

    ViewController를 프로그래밍 방식으로 어떻게 표시합니까?

  9. 9

    AbstractMongoEventListener를 프로그래밍 방식으로 어떻게 등록합니까?

  10. 10

    ssh-agent로 호스트 키 검사를 억제하려면 어떻게해야합니까?

  11. 11

    ssh-agent로 호스트 키 검사를 억제하려면 어떻게해야합니까?

  12. 12

    텔레 그램 봇 API를 사용하여 파이썬으로 수직 사용자 정의 키보드 레이아웃을 프로그래밍 방식으로 생성하려면 어떻게해야합니까?

  13. 13

    프로그램 시작시 클래스의 인스턴스를 자동으로 암시 적으로 생성하려면 어떻게해야합니까?

  14. 14

    내 kivy 프로그램에서 json api를 어떻게 사용합니까?

  15. 15

    ssh-agent에서 하나의 키만 사용하도록 ssh를 얻으려면 어떻게해야합니까?

  16. 16

    수퍼 뷰와 일치하도록 프로그래밍 방식으로 UIViews Autolayout 가장자리를 어떻게 할당합니까?

  17. 17

    Python으로 사용자 지정 그래프를 만들어 이미지로 라텍스로 내보내려면 어떻게해야합니까?

  18. 18

    프로그래밍 방식으로 사용자를 로그 아웃하려면 어떻게해야합니까? [Django]

  19. 19

    수퍼 유저 권한이 필요한 프로그램에서 Valgrind를 어떻게 실행합니까?

  20. 20

    Aliyun Python SDK를 사용하여 프로그래밍 방식으로 계정 ID 번호를 얻으려면 어떻게해야합니까?

  21. 21

    Joomla 2.5에서 프로그래밍 방식으로 사용자에게 메모를 추가하려면 어떻게해야합니까?

  22. 22

    프로그래밍 방식으로 dijit TextBox를 어떻게 만듭니 까?

  23. 23

    Orchard 1.9에서 분류 용어를 프로그래밍 방식으로 복사하려면 어떻게해야합니까?

  24. 24

    Ubuntu Server 설치 프로그램은 Github에서 ssh 키를 어떻게 얻습니까?

  25. 25

    Ubuntu Server 설치 프로그램은 Github에서 내 ssh 키를 어떻게 얻습니까?

  26. 26

    C #을 사용하여 프로그래밍 방식으로 "웹 사이트 모드 열기"에서 Visual Studio를 열려면 어떻게합니까?

  27. 27

    SSH를 통해 트래픽을 터널링하는 로컬 SOCKS 프록시를 어떻게 설정합니까?

  28. 28

    SSH를 통해 트래픽을 터널링하는 로컬 SOCKS 프록시를 어떻게 설정합니까?

  29. 29

    graphviz를 사용하여 Thompson의 구성을 어떻게 그래프로 표시합니까?

뜨겁다태그

보관