왜 ssh-agent의 출력을 평가합니까?


67

실행 ssh-agent하려면 사용해야합니다

eval $(ssh-agent)

eval출력 해야 ssh-agent합니까?

내가 그냥 실행할 수 있도록 설계되지 않은 이유는 무엇입니까?


참고 : 백틱 (`)은 더 이상 사용되지 않아 제거되었습니다. 예를 들어 여기에서 자세한 내용을 읽을 수 있습니다 .


누가 eval을 사용해야한다고 말합니까? 이것을 지시하는 것은 무엇입니까? 조금 더 많은 맥락이 도움이 될 것입니다.
0xSheepdog


9
@ 0xSheepdog, man시작 페이지 ...
Jasonwryan

유스 케이스가 매뉴얼 페이지에 문서화 된 것 같습니다. 에 관해서는 "왜 특정한 방식으로 설계되었습니다" ... 어깨를 으쓱를 .
0xSheepdog

5
다시 말하지만, 이것은 ssh-agent"이런 방식으로 설계된"것이 아니라 유닉스 / 리눅스 ssh-agent입니다. 쉘의 자식 프로세스에서 실행 되기 때문 입니다. 자식 프로세스는 부모 프로세스를 수정할 수 없습니다. 그러나 함수는 현재 프로세스에서 실행되기 때문에 가능합니다. 따라서 do_set_ssh_agent() { eval ssh-agent 함수를 작성할 ; }수 있으며 간단하게 다음과 같이 실행할 수 있습니다 $ do_set_ssh_agent. 그러나 "프로그램"은 (일반적으로) 리눅스 / 유닉스에서 "기능"으로 설치되지 않습니다. 대신, 프로그램은 파일로 설치되며, 언급 한 바와 같이 하위 프로세스에서 실행됩니다. (소싱 스크립트는 예외이지만 ssh-agent는 바이너리입니다.)
michael

답변:


79

ssh-agent 연결해야 할 환경 변수를 출력합니다.

shadur@proteus:~$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-492P67qzMeGA/agent.7948; export SSH_AUTH_SOCK;
SSH_AGENT_PID=7949; export SSH_AGENT_PID;
echo Agent pid 7949;
shadur@proteus:~$ 

호출 eval하면 해당 변수를 환경에 즉시로드 할 수 있습니다.

왜 그렇게 ssh-agent할 수 없는지에 대해서는 ... 단어 선택에 주목하십시오. "하지 않습니다", " 할 수 없습니다 ". 유닉스에서 프로세스는 자신의 환경 변수 만 수정하여 자식에게 전달할 수 있습니다. 그것은 할 수없는 시스템이 그것을 허용하지 않기 때문에 부모 프로세스의 환경을 수정합니다. 이것은 매우 기본적인 보안 설계입니다.

당신은 주위에 얻을 수 eval사용하여 ssh-agent utility어디 utility다른 것은 사용자가 설정 한 SSH 환경 변수를 가질 필요가 무엇이든 로그인 쉘, 창 관리자 또는이다. 이것은 매뉴얼에서도 언급됩니다.


고마워, 그것은 분명히 무슨 일이 일어나고 있는지 이해하고 그것을 얻습니다. 그러나 왜 그렇게 설계되지 않고 그렇게 설계되어서 자동으로 변수를 환경에 추가합니까? 그것은 어떤 종류의 유연성을 추가합니까 ???
jx12345

4
@ 당신은 주위에 얻을 수 jx12345 eval사용하여 ssh-agent utility어디 utility다른 것은 사용자가 설정 한 SSH 환경 변수를 가질 필요가 무엇이든 로그인 쉘, 창 관리자 또는이다. 이것은 매뉴얼에서도 언급됩니다. 외부 환경에서는 호출 환경에서 변수를 설정할 수 없습니다.
Kusalananda

@kusalananda 올바른; 편집으로 추가하십시오. 나는 지금 자러 가거나 나 스스로 할 것이다.
Shadur

5
@ jx12345 자체 환경에 변수를 추가 할 수 있지만 쉘이 아니기 때문에 쉘 환경에 변수를 추가 할 수 없기 때문입니다.
user253751

3
@ jx12345 명확하게 : 부모 프로세스에 env 변수를 추가하거나 변경할 수 있다면 부모의 부모에 영향을 줄 수 있으며 PID 1까지도 영향을 줄 수 있습니다. 이것은 "권한 에스컬레이션"이라고 하며 보안 상 정말 나쁜 것 입니다. 점.
Shadur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.