ssh 에이전트 및 화면


8

StackOverflow에서 잠시 후 ssh-agent 및 crontab에 대해이 질문을했습니다 . Linux 시스템의 ssh-agent 및 screen에 대해 비슷한 질문이 있습니다.

따라서 내 Mac에서는 ssh-agent가 시스템 시작시 시작되므로 항상 사용할 수 있습니다. X-Windows를 사용하는 경우 Linux (redhat el5 / fedora)에서 사실이라고 생각합니다. 그러나 이것은 원격 서버 컴퓨터이며 항상 ssh를 통해 로그인합니다.

svn 업데이트 또는 커밋 중에 비밀번호를 여러 번 입력 할 필요가 없도록 ssh 키를 올바르게 설정하고 싶습니다. 세션 당 한 번씩 암호를 입력하게되어 기쁩니다. 팀에서 암호가없는 ssh 키를 사용하지 않는 것이 좋습니다.

잠깐 동안 빛나는 순간, .bash_profile에서 "eval`ssh-agent -s`"를 수행하는 것처럼 보였습니다. 로그 아웃했을 때 ssh-agent를 종료하는 명령과 함께 작동했습니다. 그러나 장기 실행되는 대화식 프로그램 및 개발 환경을 관리하기 위해 화면 을 많이 사용 합니다. 방금 설명한대로 ssh-agent를 시작 및 중지하면 터미널을 종료 할 때 종료되고 해당 ssh-agent 인스턴스를 참조하던 화면의 하위 세션이 중단됩니다.

그렇다면 ... 화면을 사용하고, ssh 키와 함께 암호를 사용하고, 암호를 지속적으로 입력 할 필요가없는 콘솔 사용자는 어떻게 될 수 있습니까?

답변:


4

다음 설정을 사용하면 호출을위한 래퍼가 필요하지 않습니다 screen. 또한 /tmp(보안 위험으로 인한) 사용을 피 합니다.

  1. ~ / tmp 디렉토리가 있는지 확인하십시오.

    mkdir ~/tmp
    
  2. .screenrc다음 줄에 추가하십시오 .

    setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen"
    
    • 이 것을 보장 내부 screen, ssh같은 위치에 항상 소켓보다는 변화하는 경로를 찾습니다.
    • 당신은 사용해야 setenv은 화면이 아닌 쉘 명령이기 때문에, 당신이 사용하는 쉘 중.
  3. .bash_profile다음 줄에 추가하십시오 .

    [ -n "$SSH_AUTH_SOCK" ] && [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ] && ln -sf "$SSH_AUTH_SOCK" "$HOME/tmp/ssh-agent-screen"
    
    • 이것은 고정 된 위치 ( ssh보는 곳 )에서 실제 위치로 연결되며 시작 후에 표시되어야합니다 ssh-agent.
    • 를 설정하지 않으면 [ -n "$SSH_AUTH_SOCK" ]오류가 제대로 방지 SSH_AUTH_SOCK됩니다.
    • [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ]스크린 소스가 스크린 세션이 $ HOME / tmp / ssh-agent-screen을 자신에게 링크하는 것을 방지합니다 .bash_profile.
  4. 대신에 시작하는 ssh-agent에 .bash_profile, 당신은 함께 연결 고려할 수 있습니다 ssh -A(사용에 에이전트 전달 및 원격 시스템을 사용하여 에이전트를 만들).

이 설정 후에는 표준 화면 명령 만 사용할 수 있습니다. 기존 세션을 다시 작성하거나 수동으로 세션 내부의 SSH_AUTH_SOCK를 2 단계의 고정 위치로 설정하면됩니다.

아이디어에 대한 이 웹 사이트의 크레딧 사용하지 않았습니다 /tmp. 이 답변 은 비슷하지만 추가 별칭을 사용합니다.


2

대신 initscript에서 ssh-agent를 시작할 수 있습니까 .bash_profile? 예를 들어

su -c 'ssh-agent -s > ~/.ssh_agent_env' myusername

/etc/conf.d/localRHEL / Fedora는 아마도 다른 시스템을 사용하지만 의 적절한 부분에 있습니다. 주석에서 지적했듯이 터미널 세션은 에이전트에 연결할 수 있어야하므로 해당 명령 .ssh_agent_env이 사용자의 홈 디렉토리에 파일 을 작성합니다 . 그런 다음 추가 할 수 있습니다

[ -f ~/.ssh_agent_env ] && source ~/.ssh_agent_env >/dev/null

에서 .bash_profile.

당신이 할 수있는 또 다른 일은 다음을 넣는 것입니다. .bash_profile

ps -U myusername | grep -q ssh-agent || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

ssh-agent아직 실행되고 있지 않은 경우에만 시작 됩니다. 그렇다면 당신은 그것을 죽일 필요가 없습니다.

두 번째 제안에 대한 약간 다른 대안으로 ssh-agent프로세스 의 존재를 확인하는 대신 파일의 존재를 확인할 수 있습니다 ~/.ssh_agent_env.

[ -f ~/.ssh_agent_env ] || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

모든 것이 제대로 작동하면 두 방법간에 큰 차이가 없어야합니다.


initscript 아이디어는 흥미 롭습니다. 기본적으로 아이디어를 원하는 모든 사용자를 위해 시스템을 시작할 때 시작하십시오. 작동 할 수 있습니다. 관심이있는 사용자가 많지 않습니다. 암호를 입력하지 않는 것보다 훨씬 나은지 여부는 흥미로운 질문입니다. 왜냐하면 컴퓨터를 다시 시작할 때마다 한 번만 입력하면된다는 것을 의미합니다. 흠. 두 번째 제안과 두 번째 제안은 ssh-agent가 이미 실행중인 경우 새 터미널 세션에 의존합니다. 나는 그것이 쉬운 지 완전히 확신하지는 못하지만 아직 시도하지 않았습니다. 아이디어 주셔서 감사합니다!
— Michael H.

@khedron : 그렇습니다.하지만 /etc/conf.d/local에이전트를 사용하는 각 사용자에 대해 한 줄을 입력해야합니다 ssh-agent. 당신이 말했듯이, 많은 수의 사용자가 없다면, 그렇게 나쁘지 않을 것입니다. 에이전트에 연결되는 터미널 세션에 대해 좋은 점을 제기했습니다 (내가 잊어 버렸습니다). 답변에 대한 편집 내용을 참조하십시오.
— David Z


2

더 나은 방법은 ssh 에이전트 전달 ( -A옵션)을 사용하는 것입니다. 이를 통해 ssh를 사용하는 사람은 자신이 온 머신에서 실행중인 ssh 에이전트의 키를 사용할 수 있습니다.


또한 계정을 손상시키는 공격자가 해당 에이전트가 액세스 할 수있는 다른 컴퓨터의 계정을 손상시킬 수 있습니다. 따라서 ssh 에이전트 전달을 최소한으로 유지하려고합니다.
— Paul Price

2

ssh 에이전트 전달에 대한 후속 조치를 수행하려면 기본적으로 로그 아웃 한 후 다시 로그인 한 후 세션에 다시 첨부하면 전달 된 ssh 자격 증명을 화면 세션에서 사용할 수 없습니다.

그러나 SSH_AUTH_SOCK 환경 변수를 화면에서 잘 알려진 것으로 설정하고 잘 알려진 위치를 현재 인증 소켓으로 업데이트하면이 문제를 해결할 수 있습니다.

이 쉘 기능을 사용하여 화면을 다시 입력하고 ssh 인증 양말을 수정하십시오.

function sr () { 
    if [ ${+STY} = 1 ] ;then 
            echo already in screen\!
    else
            if [ "${SSH_AUTH_SOCK}x" != "x" ]; then
                    if [ ! -d /tmp/screenssh ]; then
                            mkdir /tmp/screenssh 
                    fi
                    rm -f /tmp/screenssh/socket
                    ln -s $SSH_AUTH_SOCK /tmp/screenssh/socket
                    echo $REMIP > /tmp/screenssh/remip
            fi                
            screen -DR
    fi
}

그리고 나는 이것을 .screenrc에 가지고있다 :

setenv SSH_AUTH_SOCK /tmp/screenssh/socket

도움이 되었기를 바랍니다.


/ tmp를 사용하면 컴퓨터의 다른 사용자가 경로를 알고 있으면 파일을 클로버 할 수 있습니다.
— Blaisorblade

1

내가 당신을 올바르게 이해했다면, 당신은 때때로 분리하고 다시 연결하지만 ssh-agent의 암호 (개인 키 암호)를 다시 입력하고 싶지 않은 스크린 세션을 원합니다.

가장 쉬운 방법은 서브 쉘로 ssh-agent를 시작한 다음 해당 서브 쉘에 머무르는 것보다 화면을 시작하는 것입니다. 즉

screen
ssh-agent bash
ssh-add   # enter your password once

# some commands, some logins and logouts to remote servers via ssh public key

# <ctrl>+<a>, <ctrl>+<d> to detach screen
# you can now logout from this computer
# login again

# reattach to your screen
screen -r
# ssh-agent is still running

그것은 본질적으로 내가하는 일입니다. 화면을 사용하여 "탭"중 하나에 ssh-agent 권한이있는 것으로 레이블을 지정하고 svn 작업 등에 사용합니다. 이것은 기본적으로 내가있는 곳입니다.
— Michael H.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.