나는 온라인의 수많은 소스에서 (대략) 비밀번호 없이 원격 서버에 로그인하려면 SSH 키를 생성하고 원격 시스템의 Authorized_keys에 pub 버전을 넣는다는 것을 배웠습니다. 비공개 버전을 로컬 ~/.ssh/ 디렉터리에 넣으세요. 0600으로 chmod를 실행하고 휙, 들어갑니다. 대부분 정확하지만 SSH가 키(쌍)를 원격에 제공하려면 키(쌍)의 이름을 id_rsa(id_rsa.pub) 또는 id_dsa(id_dsa.pub)로 지정해야 한다는 것을 알았습니다. 서버.
조금 다시 이야기하겠습니다. SurnameG
내 로컬 Mac에 로그인이 있습니다 . 원격 시스템인 otherserver에 SurnameG 계정이 있습니다.
~/.ssh/surnameg.pub
해당 시스템의 /home/surnameg/.ssh/authorized_keys에 내용을 복사했습니다 . -i
Mac에서 SSH 연결 옵션을 테스트했는데 제대로 작동합니다.
나는 ~/.ssh/id_rsa
(내가 사용하기 위해 생성한)github.com).
물론, ~/.ssh/surnameg
다음 방법으로 로그인하려고 할 때 "시도"되지 않는 다른 키도 있습니다.otherserver.com:
ssh 1.2.3.4
SurnameG
여기서는 (현재 로컬로 로그인한 사용자)를 사용하여 내 SurnameG
계정 에 로그인하려고 합니다.다른 서버. 연결을 시도할 때 openssh가 제공되기를 원 ~/.ssh/surnameg
하지만 그렇지 않습니다. verbose 옵션을 자세히 살펴보겠습니다.
BOX:~ SurnameG$ ssh -v 1.2.3.4
OpenSSH_5.9p1, OpenSSL 0.9.8y 5 Feb 2013
debug1: Reading configuration data /Users/SurnameG/.ssh/config
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: Connecting to 1.2.3.4 [50.112.132.124] port 22.
debug1: Connection established.
debug1: identity file /Users/SurnameG/.ssh/id_rsa type 1
debug1: identity file /Users/SurnameG/.ssh/id_rsa-cert type -1
debug1: identity file /Users/SurnameG/.ssh/id_dsa type -1
debug1: identity file /Users/SurnameG/.ssh/id_dsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA ax:64:3e:4a:e3:2c:e4:30:dd:36:a4:a0:9x:fa:ba:6b
debug1: Host '1.2.3.4' is known and matches the RSA host key.
debug1: Found key in /Users/SurnameG/.ssh/known_hosts:88
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/SurnameG/.ssh/id_rsa
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Trying private key: /Users/SurnameG/.ssh/id_dsa
debug1: No more authentication methods to try.
흥미롭게도 openssh는 ~/.ssh/id_rsa만 제공하지만 그게 다가 아닙니다. ~/.ssh/id_dsa 도 "시도"합니까? 둘 사이의 차이점(제안과 시도)이 확실하지 않습니다. 어쨌든, 내가 올바르게 읽고 있다면 openssh는 ~/.ssh/*
.
~/.ssh/config
좋습니다. 각 서버를 다음과 같이 명시적으로 설명할 수 있다는 것을 알고 있습니다.
Host otherserver
HostName 1.2.3.4
User surnameg
IdentityFile ~/.ssh/surnameg
그런 다음 다음으로 로그인하십시오.
ssh otherserver
그건 괜찮고 멋지고 훌륭하게 작동해요. 하지만 실제로는 ~/.ssh/config가 다루기 힘들어지고 있습니다. 안타깝게도 저는 cd ~/.ssh && git init
오래 전에는 그러지 못했습니다 . 그러나 나는 빗나갔다.
내 질문은 이것입니다: 로그인을 시도할 때 ssh가 ~/.ssh 디렉토리에서 더 많은 키를 동적으로 시도하도록 하는 더 간단하고 빠르며 자동화된 방법이 있습니까? 아니면 필요한 모든 서버에 대해 ~/.ssh/config를 편집하고 있습니까? SSH를 구성하는 유일한 방법에 연결하시겠습니까? SSH가 어떻게 작동해야 하는지에 대해 위의 내용을 오해한 적이 있습니까?
답변1
모든 호스트에 동일한 키를 제공하려면 를 사용하여 SSH 에이전트에 로드하세요 ssh-add
. 많은 Linux 배포판은 자동으로 시작합니다. ssh-add -l
실행 중인지 확인한 다음 키를 로드합니다.
ssh-add ~/.ssh/id_rsa ~/.ssh/surnameg etc.
에이전트가 자동으로 시작되지 않으면 다음을 입력하십시오 ~/.profile
.
agent_running() {
[ "$SSH_AUTH_SOCK" ] && { ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]; }
}
env=~/.ssh/agent.env
if ! agent_running && [ -s "$env" ]; then
. "$env" >/dev/null
fi
if ! agent_running; then
ssh-agent >"$env"
. "$env" >/dev/null
ssh-add ~/.ssh/id_*
fi
unset env
답변2
또 다른 가능한 접근 방식이 있습니다. IdentityFile
의 옵션 에서 자리 표시자를 사용할 수 있습니다 ssh_config
. 에 따라man ssh_config
:
%d
—로컬 사용자의 홈 디렉토리%u
—로컬 사용자 이름%l
—로컬 호스트 이름%h
—원격 호스트 이름%r
—원격 사용자 이름
나는 이것을 다음과 같이 사용합니다(전역 ssh_config
파일에서):
IdentityFile ~/.ssh/%r@%h
이는 내 개인 키 파일의 이름이 [email protected]
.