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
합니까?
UPDssh-agent
가 실행되는 명령에 대한 자식에 관해서 . 즉 대체 할 수 있도록 만들어 command
와 ssh-agent command
. 따라서 ssh-agent
포크와 부모 exec
는 command
.
UPD 내 잘못, 나는 시작하기 위해 사용 xbindkeys
하고 있었고 xterm
전자는 전에 시작되었습니다 ssh-agent
. 에서처럼 xbindkeys && ssh-agent awesome
. 따라서 SSH_*
전달할 변수가 없었 습니다 xterm
. 아니면 내 가장 가능성있는 설명입니다. awesome
의 내장 기능을 사용하여 시작 xterm
하면 환경 변수가 올바르게 전달됩니다.
당신의 업데이트에 당신은 당신이 시작 언급 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
두 번째 프로세스 트리에서)가 에이전트의 상위가됩니다.
/*
* 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] 삭제
몇 마디 만하겠습니다