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.