최근에 나는 자동 시작(KDE)에 다음 스크립트를 추가했습니다:
eval `ssh-agent`
ssh-add
스크립트는 로그인 시 시작되어야 하며 암호 문구를 요청하고 비밀 키를 로드해야 합니다. 거의 괜찮습니다. 스크립트가 올바르게 실행되고 에이전트가 시작되고 환경 변수가 모두 설정되었으며 암호를 묻는 메시지가 나타납니다. 유일한 문제는 그 이후에는 키가 로드되지 않는다는 것입니다. 그러나 터미널에 ssh-add를 입력하면 암호 문구를 묻는 메시지가 표시되고 나머지 X 세션 동안 키가 저장됩니다.
내가 도대체 뭘 잘못하고있는 겁니까? 암호를 묻는 메시지가 표시되는데 왜 키가 로드되지 않습니까?
추신: 저는 Debian jessie를 사용하고 있습니다.
답변1
이 문제의 원인이 될 수 있다고 생각되는 2가지 가능한 시나리오가 있습니다.
두 가지 모두 많은 데스크탑 관리자가 자체 SSH 키 에이전트를 시작한다는 사실에서 비롯됩니다. 내보낸 변수가 데스크탑 관리자(터미널 에뮬레이터)에 의해 시작된 애플리케이션에 의해 선택되려면 데스크탑 관리자보다 먼저 에이전트를 시작해야 하기 때문입니다.
귀하의 데스크톱 관리자는 귀하가 시작한 후 자체 SSH 에이전트를 시작하고 결국 이를 교체하게 됩니다.
SSH 에이전트를 시작하는 시점과 방법이 확실하지 않지만 데스크톱 관리자가 이후에 하나를 시작하면 내보낸 변수가 생성한 변수보다 우선 적용됩니다.
귀하의 데스크탑 관리자가 귀하보다 먼저 자체 SSH 에이전트를 시작하고 있으며 귀하의 에이전트는 지속되지 않습니다.
방금 터미널 창을 시작하고 작업을 수행하는 경우 터미널 창을 닫은 후에
eval $(ssh-agent); ssh-add
는 내보낸 변수가ssh-agent
유지되지 않습니다. 새 터미널 창을 시작하면 데스크톱 관리자가 시작한 SSH 에이전트가 설정한 변수를 얻을 수 있습니다.
작동 방식 ssh-agent
은 백그라운드에서 데몬을 시작한 다음 설정해야 하는 여러 변수를 인쇄하는 것입니다.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-JLbBwVBP4754/agent.4754; export SSH_AUTH_SOCK;
SSH_AGENT_PID=4755; export SSH_AGENT_PID;
echo Agent pid 4755;
따라서 eval $(ssh-agent)
당신은 모든 변수를 설정하는 것뿐입니다.
이제 변수는 자식에게만 상속되므로 데스크탑 관리자에 유지하려면 데스크탑 관리자가 시작되기 전에 설정해야 합니다. 이는 올바르게 수행하기 어려울 수 있으며 배포판마다 다릅니다. 이것이 바로 많은 데스크톱 관리자가 스스로 수행하는 이유입니다.
이는 때때로 pam 스택 초기화 중에도 수행된다는 점에 유의하십시오.
답변2
Patrick이 지적했듯이 ssh-agent
귀하의 데스크톱 환경에서 생성된 인스턴스와 경쟁할 가능성이 높습니다. 글쎄, 경쟁이라는 말은 아마도 올바른 단어가 아닐 것입니다. 다른 애플리케이션이 에이전트와 대화할 수 있도록 허용하는 변수는 해당 환경에 있어야 합니다. 데스크탑 sessoin의 모든 애플리케이션은 데스크탑 환경의 일부(세션 관리자라고 가정)에 의해 어떤 방식으로 생성되므로 먼저 변수를 세션 관리자의 환경 목록에 가져와야 합니다. 이는 두 가지 방법으로 발생할 수 있습니다.
세션 관리자는 내부적으로 이를 수행합니다(어딘가에 설정한 옵션에 따라 다름). 여기에는 PAM 모듈(로그인/세션 관리자에서 호출)에 의해 생성되는 에이전트가 포함됩니다.
당신과 같은 사용자 스크립트를 통해. 그러나 이는 생각만큼 간단하지 않습니다. 세션 관리자가 스크립트를 실행할 때 스크립트 인터프리터라는 새로운 프로세스를 생성합니다. 해당 환경에서는 변수가 설정되지만 상위 프로세스인 세션 관리자로 다시 쉽게 내보낼 수 없습니다. 이는 쉘에서 동일한 작업을 수행하는 것과 동일합니다. 스크립트를 실행해도 현재 쉘 환경에는 아무런 영향이 없습니다. 그렇게 해야 합니다
source
. 그러면 현재 셸에서 명령이 실행되어 업데이트/생성된 변수에 액세스할 수 있습니다. 이는 세션 관리자에서 수행하기가 다소 복잡합니다(셸 인터프리터가 아니기 때문에). 따라서 당신은ssh-agent
실제로 경쟁하지 않습니다. 그것은ssh-add
스크립트에서 로드된 ID와 함께 거기에 있으며 실제로 그것에 대해 아는 사람은 아무도 없습니다.
무슨 일이 일어나고 있는지 알아보려면 1 의 출력을 확인하세요.
ps fax | grep -E "(ssh|gpg)-[a]gent"
스크립트를 다음으로 변경하십시오.
echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK" > ~/ssh-agent.stdout
echo "SSH_AGENT_PID=$SSH_AGENT_PID" >> ~/ssh-agent.stdout
eval `ssh-agent | tee -a ~/ssh-agent.stdout`
그러면 변수의 내용이 파일에 인쇄된 다음 처리하기 전에 바로 그 위치 ~/ssh-agent.stdout
에 출력이 추가됩니다 (따라서 변수를 내보냅니다). ssh-agent
파일 내용을 환경 변수 SSH_AUTH_SOCK
( SSH_AGENT_PID
예: 새로 생성된 쉘 터미널)와 비교하세요. 대부분의 경우 PID가 (주기적으로) 단조롭게 증가하므로 어느 것이 먼저 시작되었는지 알 수 있습니다. 일부 DE는 SSH 에이전트 서비스도 제공하는 gpg-agent
기능을 사용하기 때문에 해당 부분이 있습니다 .gpg-agent
해당 라인 호출을 완전히 제거할 수도 있습니다 ssh-agent
. SSH 에이전트가 데스크탑 환경을 생성한 후 스크립트가 실행되는 경우 환경 변수가 존재하므로 비밀번호 대화 상자(올바른 에이전트에 대한)가 표시됩니다. 그렇지 않은 경우 스크립트가 DE의 에이전트 인스턴스보다 먼저 실행되고 있으므로 에이전트에 전혀 액세스할 수 없음을 의미합니다.
1 괄호는깔끔한 트릭grep
프로세스 목록에서 자신을 제거합니다 .