로그인시 ssh-agent 시작
SSH 별칭을 사용하여 Bitbucket.com에서 원격 Git 저장소로 사이트를 가져 왔습니다. 서버에서 ssh-agent를 수동으로 시작할 수 있지만 SSH를 통해 로그인 할 때마다이 작업을 수행해야합니다.
ssh-agent를 수동으로 시작합니다.
eval ssh-agent $SHELL
그런 다음 에이전트를 추가합니다.
ssh-add ~/.ssh/bitbucket_id
그런 다음 내가 할 때 나타납니다.
ssh-add -l
그리고 나는 잘 지냅니다. 로그인 할 때마다이 프로세스를 자동화 할 수있는 방법이 있습니까? 서버가 RedHat 6.2 (Santiago)를 실행 중입니다.
이 기사를 살펴보십시오. 이것이 매우 유용하다는 것을 알 수 있습니다.
http://mah.everybody.org/docs/ssh
위의 링크가 언젠가 사라지는 경우를 대비하여 아래 솔루션의 주요 부분을 캡처하고 있습니다.
Daniel Starin을 통해 Joseph M. Reagle의 솔루션 :
이 다음을 귀하의
.bash_profile
SSH_ENV="$HOME/.ssh/environment" function start_agent { echo "Initialising new SSH agent..." /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}" echo succeeded chmod 600 "${SSH_ENV}" . "${SSH_ENV}" > /dev/null /usr/bin/ssh-add; } # Source SSH settings, if applicable if [ -f "${SSH_ENV}" ]; then . "${SSH_ENV}" > /dev/null #ps ${SSH_AGENT_PID} doesn't work under cywgin ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { start_agent; } else start_agent; fi
이 버전은 이미 ssh-agent를 시작했는지 확인하고 찾을 수없는 경우 시작하여 다음에 시작할 때 사용할 수 있도록 설정을 저장하기 때문에 특히 좋습니다. 껍질.
Arch Linux에서 다음은 실제로 훌륭하게 작동합니다 (모든 시스템 기반 배포판에서 작동해야 함).
다음을 넣어 시스템 사용자 서비스를 작성하십시오 ~/.config/systemd/user/ssh-agent.service
.
[Unit]
Description=SSH key agent
[Service]
Type=forking
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -a $SSH_AUTH_SOCK
[Install]
WantedBy=default.target
소켓 ( .bash_profile, .zshrc, ...
)에 대한 환경 변수를 갖도록 설정 쉘 :
export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"
서비스를 활성화하면 로그인시 자동으로 시작되고 시작됩니다.
systemctl --user enable ssh-agent
systemctl --user start ssh-agent
ssh 구성 파일에 다음 구성 설정을 추가하십시오 ~/.ssh/config
(SSH 7.2부터 작동 함).
AddKeysToAgent yes
이렇게하면 ssh 클라이언트가 항상 실행중인 에이전트에 키를 추가하도록 지시하므로 미리 ssh-add 할 필요가 없습니다.
오래된 질문이지만 비슷한 상황을 겪었습니다. 위의 답변이 필요한 것을 완전히 달성했다고 생각하지 마십시오. 빠진 조각은 keychain
; 아직 설치하지 않은 경우 설치하십시오.
sudo apt-get install keychain
그런 다음 다음 줄을 ~/.bashrc
eval $(keychain --eval id_rsa)
이것은 ssh-agent
실행 중이 아닌 경우 시작하고 , 실행 중이면 연결하고, ssh-agent
환경 변수를 쉘에로드하고 ssh 키를로드합니다.
로드하려는 id_rsa
개인 키로 변경하십시오 ~/.ssh
.
참고
허용되는 솔루션에는 다음과 같은 단점이 있습니다.
- 유지하기가 복잡합니다.
- 오류 또는 보안 위반으로 이어질 수있는 저장 파일을 평가합니다.
- 에이전트를 시작하지만 키를 점화 상태로 두는 것과 거의 비슷한 에이전트를 중지하지 않습니다.
키에 암호를 입력하지 않아도되는 경우 다음 해결 방법을 제안합니다. .bash_profile
맨 끝에 다음을 추가 하십시오 (필요에 따라 키 목록 편집).
exec ssh-agent $BASH -s 10<&0 << EOF
ssh-add ~/.ssh/your_key1.rsa \
~/.ssh/your_key2.rsa &> /dev/null
exec $BASH <&10-
EOF
다음과 같은 장점이 있습니다.
- 훨씬 간단한 해결책;
- bash 세션이 종료되면 에이전트 세션이 종료됩니다.
가능한 단점이 있습니다.
- 대화식
ssh-add
명령은 하나의 세션에만 영향을 미치며 실제로는 매우 비정형적인 상황에서만 문제가됩니다. - 암호를 입력해야하는 경우 사용할 수 없습니다.
- 시작된 셸은 비 로그인이됩니다 (AFAIK에 영향을 미치지 않음).
ssh-agent
메모리 나 CPU 시간이 더 걸리지 않기 때문에 여러 프로세스가 단점이 아닙니다.
이것을에 추가 ~/.bashrc
한 다음 로그 아웃했다가 다시 적용하십시오.
if [ ! -S ~/.ssh/ssh_auth_sock ]; then
eval `ssh-agent`
ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add
재부팅 할 때마다 처음 로그인 할 때만 암호를 묻는 메시지가 표시됩니다. ssh-agent
계속 실행되는 한 계속 재사용 됩니다.
그래서 위에서 설명한 접근 방식을 사용했지만 마지막 bash 세션이 끝나면 에이전트가 죽는 것을 선호합니다. 이것은 다른 솔루션보다 약간 길지만 선호하는 방법입니다. 기본 아이디어는 첫 번째 bash 세션이 ssh-agent를 시작한다는 것입니다. 그런 다음 각 추가 bash 세션은 구성 파일 ( ~/.ssh/.agent_env
)을 확인합니다. 그것이 있고 세션이 실행 중이면 환경을 소싱하고 소켓 파일에 대한 하드 링크를 만듭니다 /tmp
(원래 소켓 파일과 동일한 파일 시스템에 있어야 함). bash 세션이 종료되면 각각 자체 하드 링크가 삭제됩니다. 마지막 세션을 종료하면 하드 링크에 2 개의 링크 (하드 링크 및 원본)가 있고 프로세스 자체 소켓이 제거되고 프로세스가 종료되면 0이 발생하여 마지막 bash 세션이 종료 된 후 깨끗한 환경이 유지됩니다.
# Start ssh-agent to keep you logged in with keys, use `ssh-add` to log in
agent=`pgrep ssh-agent -u $USER` # get only your agents
if [[ "$agent" == "" || ! -e ~/.ssh/.agent_env ]]; then
# if no agents or environment file is missing create a new one
# remove old agents / environment variable files
kill $agent running
rm ~/.ssh/.agent_env
# restart
eval `ssh-agent`
echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ~/.ssh/.agent_env
echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ~/.ssh/.agent_env
fi
# create our own hardlink to the socket (with random name)
source ~/.ssh/.agent_env
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock
ln -T $SSH_AUTH_SOCK $MYSOCK
export SSH_AUTH_SOCK=$MYSOCK
end_agent()
{
# if we are the last holder of a hardlink, then kill the agent
nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`
if [[ "$nhard" -eq 2 ]]; then
rm ~/.ssh/.agent_env
ssh-agent -k
fi
rm $SSH_AUTH_SOCK
}
trap end_agent EXIT
set +x
또 다른 솔루션을 추가하기 위해 : P, @spheenik과 @ collin-anderson의 솔루션을 함께 사용했습니다.
# Ensure that we have an ssh config with AddKeysToAgent set to true
if [ ! -f ~/.ssh/config ] || ! cat ~/.ssh/config | grep AddKeysToAgent | grep yes > /dev/null; then
echo "AddKeysToAgent yes" >> ~/.ssh/config
fi
# Ensure a ssh-agent is running so you only have to enter keys once
if [ ! -S ~/.ssh/ssh_auth_sock ]; then
eval `ssh-agent`
ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
좀 더 우아하지만 간단하고 읽기 쉬울 수 있습니다. 이 솔루션 :
- 보장하지만은
AddKeysToAgent yes
키가 자동으로 사용에 추가됩니다 귀하의 ssh 설정에 - 로그인시 비밀번호 문구를 입력하라는 메시지가 표시되지 않습니다 (다시 한번 비밀번호 문구 입력은 처음 사용할 때 발생 함)
- ssh 에이전트가 아직 시작되지 않은 경우 자동으로 시작합니다.
댓글 환영합니다 :)
이것을 / etc / profile-시스템 전체 (또는 사용자 로컬 .profile 또는 .bash_profile)에 추가하여 해결했습니다.
# SSH-AGENT
#!/usr/bin/env bash
SERVICE='ssh-agent'
WHOAMI=`who am i |awk '{print $1}'`
if pgrep -u $WHOAMI $SERVICE >/dev/null
then
echo $SERVICE running.
else
echo $SERVICE not running.
echo starting
ssh-agent > ~/.ssh/agent_env
fi
. ~/.ssh/agent_env
사용자를 위해 실행되지 않으면 새 ssh-agent를 시작하거나 실행중인 경우 ssh-agent env 매개 변수를 재설정합니다.
너무 늦어서 죄송합니다.
피쉬 쉘 사용자는 이 스크립트 를 사용 하여 동일한 작업을 수행 할 수 있습니다 .
# content has to be in .config/fish/config.fish
# if it does not exist, create the file
setenv SSH_ENV $HOME/.ssh/environment
function start_agent
echo "Initializing new SSH agent ..."
ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
echo "succeeded"
chmod 600 $SSH_ENV
. $SSH_ENV > /dev/null
ssh-add
end
function test_identities
ssh-add -l | grep "The agent has no identities" > /dev/null
if [ $status -eq 0 ]
ssh-add
if [ $status -eq 2 ]
start_agent
end
end
end
if [ -n "$SSH_AGENT_PID" ]
ps -ef | grep $SSH_AGENT_PID | grep ssh-agent > /dev/null
if [ $status -eq 0 ]
test_identities
end
else
if [ -f $SSH_ENV ]
. $SSH_ENV > /dev/null
end
ps -ef | grep $SSH_AGENT_PID | grep -v grep | grep ssh-agent > /dev/null
if [ $status -eq 0 ]
test_identities
else
start_agent
end
end
당신의 대답처럼 많이. cygwin / linux
호스트 작업 이 훨씬 쉬워졌습니다. 시작 기능과 끝 기능을 결합하여 안전하게 만들었습니다.
SSH_ENV="$HOME/.ssh/.agent_env"
function start_agent {
echo "Initialising new SSH agent..."
eval `/usr/bin/ssh-agent`
echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ${SSH_ENV}
echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ${SSH_ENV}
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
/usr/bin/ssh-add;
}
# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
#ps ${SSH_AGENT_PID} doesn't work under cywgin
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
# create our own hardlink to the socket (with random name)
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock
ln -T $SSH_AUTH_SOCK $MYSOCK
export SSH_AUTH_SOCK=$MYSOCK
end_agent()
{
# if we are the last holder of a hardlink, then kill the agent
nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`
if [[ "$nhard" -eq 2 ]]; then
rm ${SSH_ENV}
/usr/bin/ssh-agent -k
fi
rm $SSH_AUTH_SOCK
}
trap end_agent EXIT
set +x
다시 감사합니다
참고 URL : https://stackoverflow.com/questions/18880024/start-ssh-agent-on-login
'Programing' 카테고리의 다른 글
IntelliJ 10.5에서 테스트를 실행할 때“NoSuchMethodError : org.hamcrest.Matcher.describeMismatch”가 표시됨 (0) | 2020.04.21 |
---|---|
힘내 : 지점에서 모든 커밋을 스쿼시하는 방법 (0) | 2020.04.21 |
높이가 100 % 인 전체 화면 iframe (0) | 2020.04.21 |
Android Studio에서 사용하지 않는 가져 오기 제거 (0) | 2020.04.21 |
자바 객체 대 객체 매핑을위한 도구? (0) | 2020.04.21 |