쉘 세션에 SSH 키(비밀번호 포함)를 별도로 추가하지 마세요.

쉘 세션에 SSH 키(비밀번호 포함)를 별도로 추가하지 마세요.

.<name of shell>rc참고: 이 특정 SSH 키에는 비밀번호가 있고 비밀번호를 계속 입력할 필요가 없기 때문에 여기에 몇 줄을 추가해도 문제가 해결되지 않습니다.

ssh-agent그래서 나는 그것이 뒤에서 어떻게 작동하는지 정말로 이해하지 못합니다 . 저는 일부 원격 리소스에 액세스하기 위해 키를 추가해야 할 때마다 ssh-agent및 를 사용합니다 . ssh-add ~/.ssh/id_rsa키를 한 번 추가했으므로 동일한 "셸 세션"에 대해 다시 추가할 필요가 없습니다("셸 세션"은 아마도 적절한 용어가 아닐 것입니다).

불행히도 새로운 쉘 세션을 계속 생성하고 있습니다. 저는 OS X의 tmux에서 zsh를 실행 중이고 창의적인 이름의 ssh key 를 가지고 있습니다 id_rsa. SSH 키에는 이와 관련된 비밀번호가 있습니다.

새 쉘을 시작할 때마다 다음을 수행해야 합니다.

$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa
<type password>

이건 정말 짜증나는 일이에요.

ssh-agent환경 변수의 출력이 SSH_AGENT_PID매번 다르다는 것을 알았습니다. 내 직감은 이 환경 변수가 SSH_AUTH_SOCK단일 셸 세션 내에서 키를 다시 추가할 필요가 없는 이유라는 것입니다 . 프로그램 을 호출하면 ssh이러한 환경 변수를 사용하여 통신 ssh-agent하고 인증이 성공합니다.

ssh-agent세션 간에 s를 공유할 수 있는 방법이 있는지 궁금합니다 . 아마도 올바른 방법은 SSH 키를 추가 tmux하고 부팅하기 전에 환경 변수를 보존 tmux하도록 구성하는 것입니다. 정말 잘 모르겠습니다. 이 문제를 해결하는 표준적인 방법은 무엇입니까?SSH_AUTH_SOCKSSH_AGENT_PID

답변1

ssh-agent가 작동하는 방식은 세션당 하나의 에이전트가 있다는 것입니다. 상담원은 세션을 시작하고 끝납니다.

세션은 터미널을 열거나 셸을 시작할 때가 아니라 로그인할 때 시작됩니다. ssh-agent이것을 쉘 시작 스크립트의 일부로 체계적으로 실행하는 것은 확실히 오류입니다.

저는 OSX 사용자가 아니기 때문에 뭔가 빠졌을 수도 있지만 제가 이해한 바로는 비고대 OSX 버전(10.5 기준)에서는 SSH가 OSX 키체인과 통합되어 있습니다. 그러므로 ssh-agent전혀 달리면 안됩니다. 이 SSH_AUTH_SOCK변수는 launchd 소켓을 가리켜야 합니다(launchd는 ssh 프록시 서비스를 제공합니다). 바라보다SSH 키와 함께 Mac OS X 키체인을 사용하는 방법은 무엇입니까?그리고ssh가 Snow Leopard의 ssh-agent에 내 키를 추가하지 못하도록 하려면 어떻게 해야 합니까?

어떤 이유로든 이를 고수 ssh-agent하고 모든 세션에 대해 하나의 프록시를 사용하려는 경우(이것이 합리적임) SSH 소켓에 고정 경로를 사용할 수 있습니다. (저는 Windows에서 이 작업을 수행했습니다.) 귀하의 경로에서 고정 경로를 .profile설정 하고 아직 실행 중이 아닌 경우 시작하십시오.SSH_AUTH_SOCKssh-agent

export SSH_AUTH_SOCK=~/.ssh/auth_sock
if ! fuser "$SSH_AUTH_SOCK" >/dev/null 2>/dev/null; then
  # Nothing has the socket open, it means the agent isn't running
  ssh-agent -a "$SSH_AUTH_SOCK" -s >~/.ssh/agent-info
fi

내 코드는 프록시 종료를 시도하지 않습니다. 로그아웃 시 에이전트를 종료하려면 로그아웃 스크립트에 kill 지시어를 추가하세요. 물론 사용자로 실행 중인 모든 프로세스를 종료하면 에이전트도 포함됩니다.

답변2

다음은 원하는 것을 처리하는 로그인 스크립트의 작은 조각입니다.

SSHAF=$HOME/.ssh_agent_env
[ -f $SSHAF ] && . $SSHAF

# if ssh-agent not really running?
if [ -n "$SSH_AGENT_PID" ] && ! kill -0 $SSH_AGENT_PID >/dev/null
then ssh-agent >$SSHAF 
     . $SSHAF
     ssh-add # add list of more keys here if needed
fi

설명: $HOME(.ssh_agent_env)의 도트 파일에 ssh-agent에 대한 환경 설정 변수를 저장하고, 해당 파일이 존재하는 경우(라인 2) 해당 파일을 가져와 (아마도) 실행 중인 ssh-agent 프로세스 ID를 가져옵니다. . (SSH_AGENT_PID 변수) SSH_AGENT_PID 변수가 설정된 경우 kill -0을 사용하여 에이전트가 해당 PID에서 실행 중인지 확인합니다. (프로세스가 실행 중인 경우 kill -0은 반환 코드를 0(true), 1(false)로 설정합니다.) 그렇지 않고 에이전트가 실행되고 있지 않으면 에이전트를 시작하고 출력을 .ssh_agent_env 파일에 저장하고 해당 파일을 가져와서 셸 세션에 값을 추가한 다음 ssh-add를 실행하여 키를 캐시합니다.

처음 시스템에 진입하면 해당 파일이 존재하지 않아 에이전트가 시작됩니다. 이 파일이 존재하면 언제든지 에이전트가 실행 중인지 확인합니다. 그렇지 않다면 시작하겠습니다.

참고: 이것은 위의 첫 번째 답변 중 솔루션 2를 실행 중인 구현입니다.

답변3

기본적으로 이 기능은 ssh-agent백그라운드에서 자체적으로 시작하고 ssh클라이언트 유틸리티가 프록시(주로 의 소켓 경로 SSH_AUTH_SOCK)에 도달하는 방법을 알기 위해 사용하는 여러 환경 변수를 인쇄합니다. 에이전트를 다시 시작하면 여러 개의 복사본이 실행 중이지만 일반적으로 셸에서 하나만 액세스할 수 있습니다... ( ps uax | grep agent실행 중인 복사본 수를 확인하려면 이와 같은 항목을 확인하세요.) ssh-add실행되면 에이전트에 연결되고, 그리고 메모리에서 키를 읽도록 요청합니다. 그러면 ssh동일한 인스턴스에 연결된 ssh-agent모든 클라이언트가 저장된 키를 활용할 수 있습니다.


하나만 실행하는 데는 여러 가지 옵션이 있습니다 ssh-agent.

1) 세션을 ssh-agent시작하기 tmux전에(또는 screen해당 문제에 대해) 시작하십시오. 이 시점에서 설정된 환경 변수는 tmux또는 에서 실행하는 모든 셸 에 상속되어야 합니다 screen. ( tmux환경 변수를 정리하지 않으려면 특별한 구성이 필요한지 모르겠습니다 .)

저는 (부적절하게) 게으르기 때문에 각 세션을 시작하기 전에 수동으로 이 작업을 수행했지만 screen에이전트를 시작한 다음 시작/세션을 시작하는 스크립트를 만드는 것은 쉬울 것입니다.screentmux

그래픽 데스크탑 환경과 같은 것을 고려하고 있다면 DE가 시작될 때(가능한 경우) 에이전트를 시작하여 시작하는 모든 터미널에서 환경 변수를 사용할 수 있도록 해야 합니다.

2) 로그인할 때 시스템이 이미 시작되었을 수 있습니다 ssh-agent. 이 경우 ssh-add에이전트의 새 복사본을 시작하지 않고 해당 키만 입력 할 수 있어야 합니다 . 구체적 ssh으로 OS ssh-add평소처럼 사용할 수도 있습니다 .

3) 완전히 별개의 쉘에서 단일 에이전트를 사용하려는 경우(따라서 환경 변수를 상속할 수 없음) 쉘의 시작 스크립트에서 에이전트가 실행 중인지 확인하고 그렇지 않으면 시작하십시오. 프록시의 소켓 주소를 파일에 저장하거나 소켓에 대한 고정 경로를 사용하십시오.


어쨌든 문제는 환경 변수 를 동일한 ssh-agent.ssh-add

그런데 ssh-add키를 보관해야 하는 기간을 정의하는 데 사용할 수 있는 매개변수가 있습니다. 실행하면 ssh-add -t 3600 my-key-file에이전트가 1시간 후에 키를 잊어버리도록 지시합니다. 이렇게 하면 키가 메모리에 암호화되지 않은 상태로 유지되는 시간을 줄이는 데 도움이 될 수 있습니다.

답변4

이상적으로는 ssh-agent한 번 시작하고 ssh-add한 번만 실행하면 후속 쉘이 에이전트를 상속합니다.

GUI를 통해 로그인하고 창 관리자가 .xsession또는 를 사용하는 경우 .xinitrc파일에 다음을 추가할 수 있습니다.

if [ -z "$SSH_AUTH_SOCK" ]; then
  eval $(ssh-agent)
  ssh-add
fi

xterm이는 창 관리자(또는 다른 터미널 에뮬레이터)에 의해 생성된 모든 프로세스가 이 에이전트를 상속한다는 의미입니다.

X11 없이 작업하고 있다면 정말 훌륭하다는 사실에 기뻐하고 다음 행을 쉘 초기화 스크립트 .bash_profile에 추가하세요..profile

현재 셸의 출력을 eval가져와서 평가하며 임의의 값으로 설정합니다. 그러면 수동으로 실행한 것과 거의 동일하게 실행됩니다. 이 프록시는 로그인 후 곧 시작될 수 있는 세션에 의해 상속됩니다(실제 로그인 셸을 설정하지 않은 경우).ssh-agentSSH_AUTH_SOCKSSH_AGENT_PIDssh-addtmuxtmux

완벽한 세상에서는 실행 중인 SSH 에이전트만 있고 로그아웃했다가 다시 로그인하거나 다른 콘솔에 로그인할 때까지 비밀번호를 다시 제공할 필요가 없습니다.

관련 정보