비밀번호를 반복해서 입력하지 않고도 SSH 공개 키를 서버 목록에 전파하려면 어떻게 해야 합니까?

비밀번호를 반복해서 입력하지 않고도 SSH 공개 키를 서버 목록에 전파하려면 어떻게 해야 합니까?

최근에 서버 목록에 대한 사용자 이름/비밀번호 액세스 권한을 얻었으며 더 쉽게 로그인할 수 있도록 내 SSH 공개 키를 이러한 서버에 전파하고 싶습니다.

그래서 분명합니다:

  • 원격 서버에는 이를 자동화하기 위해 활용할 수 있는 기존 공개 키가 없습니다.
  • 이 서버에 처음 로그인하는 것이므로 해당 서버에 액세스하기 위해 계속해서 자격 증명을 입력할 필요가 없기를 바랍니다.
  • ssh-copy-id또한 for 루프에서 비밀번호를 반복해서 입력하고 싶지 않습니다.

답변1

비밀번호를 여러 번 입력하는 대신 스위치를 사용하여 pssh비밀번호 -A를 한 번 입력한 다음 목록에 있는 모든 서버에 비밀번호를 제공할 수 있습니다.

노트:그러나 이 방법을 사용하면 허용되지 않으므로 ssh-copy-idSSH 공개 키 파일을 원격 계정의 파일에 추가하는 고유한 방법을 찾아야 합니다 ~/.ssh/authorized_keys.

다음은 작업을 수행하는 예입니다.

$ cat ~/.ssh/my_id_rsa.pub                    \
    | pssh -h ips.txt -l remoteuser -A -I -i  \
    '                                         \
      umask 077;                              \
      mkdir -p ~/.ssh;                        \
      afile=~/.ssh/authorized_keys;           \
      cat - >> $afile;                        \
      sort -u $afile -o $afile                \
    '
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7

위 스크립트의 일반적인 구조는 다음과 같습니다.

$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'

높은 수준 pssh의 세부 사항

  • cat <pubkey>공개 키 파일을 다음으로 내보냅니다.pssh
  • pssh-I스위치를 사용하여 STDIN을 통해 데이터 수집
  • -l <remote user>원격 서버의 계정입니다(IP 파일의 서버에 동일한 사용자 이름이 있다고 가정합니다).
  • -Apssh비밀번호를 요청한 다음 연결되는 모든 서버에 비밀번호를 재사용하라고 지시합니다 .
  • -ipssh출력을 파일에 저장하는 대신 STDOUT으로 보내도록 지시합니다 (기본 동작).
  • '...cmds to add pubkey...'- 이 부분이 가장 까다로운 부분이므로 별도로 분석하겠습니다.(아래 참조)

원격 서버에서 실행할 명령

pssh각 서버에서 실행되는 명령은 다음과 같습니다.

'                                         \
  umask 077;                              \
  mkdir -p ~/.ssh;                        \
  afile=~/.ssh/authorized_keys;           \
  cat - >> $afile;                        \
  sort -u $afile -o $afile                \
'
을 위한:
  • 원격 사용자의 umask를 077로 설정하여 생성하려는 모든 디렉터리나 파일에 다음과 같이 권한이 적절하게 설정되도록 합니다.

    $ ls -ld ~/.ssh ~/.ssh/authorized_keys
    drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
    -rw------- 1 remoteuser remoteuser  771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
    
  • 디렉토리를 생성 ~/.ssh하고 이미 존재하는 경우 경고를 무시합니다.

  • $afile경로가 Authorized_keys 파일인 변수를 설정합니다.
  • cat - >> $afile- STDIN에서 입력을 받아 Authorized_keys 파일에 추가
  • sort -u $afile -o $afile- Authorized_keys 파일을 고유하게 정렬하고 저장합니다.

노트:마지막 요점은 동일한 서버에 대해 위 명령을 여러 번 실행하는 것을 처리하는 것입니다. 이렇게 하면 공개 키가 여러 번 연결되는 상황이 제거됩니다.

개별 진드기에 주의하세요!

또한 이러한 모든 명령이 작은따옴표 안에 중첩되어 있다는 사실에 특히 주의하세요. 이는 $afile원격 서버에서 실행하기 전에 평가 하고 싶지 않기 때문에 중요합니다 .

'               \
   ..cmds...    \
'

여기에서 읽기 쉽도록 위의 내용을 확장했지만 일반적으로 다음과 같이 한 줄로 모두 실행합니다.

$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'

보너스 자료

를 사용하면 pssh파일을 빌드하고 를 사용하여 동적 콘텐츠를 제공할 필요가 없습니다. 또는 다른 스위치를 사용하여 -h <(...some command...)IP 목록을 생성할 수 있습니다.pssh-H "ip1 ip2 ip3"

예를 들어:

$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...

~/.ssh/config위의 내용을 사용하여 내 파일에서 IP 목록을 추출할 수 있습니다. 물론 이를 사용하여 printf동적 콘텐츠를 생성할 수도 있습니다.

$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....

예를 들어:

$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09

또한 seq이를 사용하여 형식화된 숫자 시퀀스를 생성할 수도 있습니다!

참고 자료 및 유사한 도구pssh

pssh위에서 했던 것처럼 사용 하고 싶지 않다면 몇 가지 다른 옵션을 사용할 수 있습니다.

답변2

대체 용도 xargssshpass:ssh-copy-id

당신이 살고 있다고 가정하면자격 증명.txt형식 user:password@server:

$ cat credentials.txt
root:[email protected]
foo:[email protected]
bar:[email protected]

다음을 수행할 수 있습니다.

tr ':@' '\n' < credentials.txt \
| xargs -L3 sh -c 'sshpass -p $1 ssh-copy-id $0@$2'

참고: 삭제하는 것을 잊지 마세요.자격 증명.txt사용 후!

답변3

사용안시푸르아주 간단합니다. <USER>실제 로그인 이름으로 바꾸세요 .

$ cd /path/to/public/key

$ cat<<END > hosts
  host1.example.com
  10.10.10.10
  END

$ ansible -i hosts all --ask-pass -u <USER> -m authorized_key \
      -a "user=<USER> key='$(cat id_rsa.pub)'"        

답변4

몇 가지 사항이 해당 청구서에 적합할 수 있습니다.

다른 답변에서 언급했듯이 sshpass이것이 아마도 가장 간단한 해결책일 것입니다.

관련 정보