지문이 알려진 경우 SSH 호스트 키를 프로그래밍 방식으로 수락하려면 어떻게 해야 합니까?

지문이 알려진 경우 SSH 호스트 키를 프로그래밍 방식으로 수락하려면 어떻게 해야 합니까?

옵션을 사용하고 싶지는 않지만 -o StrictHostKeyChecking=no서버의 공개 키를 파일에 저장하고 IP 주소나 포트가 변경되더라도 모든 연결에서 이를 사용하고 싶습니다.

이 옵션을 사용할 때 -o UserKnownHostsFile=myfile다른 IP를 통해 동일한 시스템에 연결하면 ssh는 계속 인증을 요청합니다.

ssh공개 키를 다른 위치에 저장하고 현재 연결에서 해당 공개 키를 사용하도록 어떻게 알 수 있습니까 ? 사용 예:

# there is no 'foo-public.key' file at this moment
ssh -o TheMagicalOption=foo-public.key [email protected] -p 1234

The authenticity of host 'xxxxxxxx' can't be established.
ECDSA key fingerprint is SHA256:LR5wDKrEmHD0QhRcAmxTxBnzWIRmNUfJyeawhKw+W38.
Are you sure you want to continue connecting (yes/no)? [YES]

# 'foo-public.key' is created at this point 
on-target $ exit 

# another port forward is made, so the same server is on port 5678
ssh -o TheMagicalOption=foo-public.key [email protected] -p 5678
# not asking the same verification question
on-target $     

답변1

당신은 그것을 사용할 수 있습니다

ssh -o StrictHostKeyChecking=ask \
    -o HashKnownHosts=no \
    -o CheckHostIP=no \
    -o UserKnownHostsFile=example_fp \
    -p 1234 [email protected]

열쇠를 얻으세요.

  • HashKnownHosts=no호스트 이름이 일반 텍스트로 저장되는지 확인하세요.
  • CheckHostIP=no이름으로 호스트를 식별하는 데에만 사용됩니다.

결과는 example_fp다음으로 시작하는 줄이 됩니다.

[example.com]:1234 ecdsa-sha2-nistp521 AAAA...

첫 번째 연결에서 표준 포트 22를 사용하면 다음과 같은 내용이 표시됩니다.

example.com ecdsa-sha2-nistp521 AAAA...

따라서 처음 연결할 때 포트 22를 사용하거나 나중에 파일을 편집하여 포트 번호를 제거하십시오. 다음에 연결할 때 이 줄은 모든 포트 번호와 일치합니다.

답변2

이를 수행할 수 있는 마법의 옵션은 없습니다. 공개 키를 미리(알고 있는 경우) 수동으로 저장하거나 지문이 "올바른" 경우 "예"라고 써주는 일부 예상 스크립트를 사용할 수 있습니다.

답변3

한 가지 해결 방법은 추가 단계를 사용하여 SSH 지문을 가져온 다음 파일에 저장하기 전에 ssh-keyscan호스트 필드를 와일드카드로 바꾸는 것입니다 . *예를 들어:

$ ssh-keyscan -p 1234 example.com | $ ssh-keyscan -p 1234 example.com perl -pe 's/.*?

그런 다음 해당 서버에 연결해야 할 때마다 참조할 수 있습니다 example_fp(포트/DNS/IP에 관계없이).

$ ssh -o UserKnownHostsFile=example_fp -p 4321[이메일 보호됨]

답변4

이름에서 알 수 있듯이 서버의 공개 키 파일(사본)이 있는 경우 이를 사용하여 임시 Known_hosts 파일을 만들 수 있습니다. 예:

sshfoo() {
  # assumes first arg is always user@host, otherwise adjust
  echo ${1#*@} $(cat foo-pubkey) >temp_myhosts
  ssh -oUserKnownHostsFile=temp_myhosts "$@"
  # or if you don't have anything you need in .ssh/known_hosts,
  # just overwrite that and omit the -o 
  rm temp_myhosts # or just leave it and replace it next time
}
# can use ssh for the function name if you always want this change,
# or if in the cases you don't want it you remember to override 
# with command ssh or $(which ssh) or /bin/ssh or whatever 

실제로 기존 Known_hosts 행(공개 키 파일의 내용이 뒤에 오는 호스트 필드)이 있는 경우 유사하게 수정할 수 있습니다.

awk -vh="${1#*@}" "{$1=h;print}" <hosts_line >temp_myhosts 

또는 다음 줄이 포함된 파일이 있는 경우 일반적인 Known_hosts일 수도 있습니다.

awk -vh="${1#*@}" "$1~/oldname/{$1=h} 1" <.ssh/known_hosts >temp_myhosts 

율 브리너(Yul Brynner) 외 다수.

관련 정보