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
두 번째 프로세스 트리)가 에이전트의 상위 프로세스가 됩니다.
/*
* 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);
}
(하위 프로세스는 나머지 코드를 계속 실행합니다.)
이를 통해 예를 들어 실행하려는 명령에 큰 영향을 주지 않고 에이전트를 종료할 수 있습니다.