비밀번호를 계속 입력하지 않고도 SSH pub 키를 서버 목록에 어떻게 전파 할 수 있습니까?


26

최근에 서버 목록에 대한 사용자 이름 / 암호 액세스 권한이 부여되었으며 SSH 공개 키를이 서버에 전파하여 더 쉽게 로그인 할 수 있습니다.

그래서 분명합니다 :

  • 이것을 자동화하기 위해 사용할 수있는 원격 서버에는 기존 공개 키가 없습니다.
  • 이것은 내가이 서버에 처음 로그인 할 때 이루어지며, 액세스하기 위해 자격 증명을 지속적으로 입력하지 않아도됩니다.
  • 또한 ssh-copy-idfor 루프 를 사용하여 비밀번호를 반복해서 입력하고 싶지 않습니다 .

1
모든 서버에 대해 동일한 사용자 이름과 비밀번호입니까?
roaima

@roaima-p! 그 세부 사항도 저를 놀라게했지만, 이것이이 특정 데이터 센터 설정 방식과 이들이 수행하는 방식입니다.
slm

@ ott---Q를 다시 확인하십시오. ssh-copy-id비밀번호를 반복해서 펌핑 하면서 for 루프 스루를 원하지 않는다고 명시 적으로 밝힙니다 .
slm


2
이것은 구성 관리를위한 완벽한 사용 사례입니다. 꼭두각시, 요리사, 식용 또는 소금을보십시오.
spuder

답변:


31

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

참고 : 이 방법을 사용하면을 사용할 ssh-copy-id수 없으므로 SSH pub 키 파일을 원격 계정 파일에 추가하기위한 고유 한 방법을 롤링해야 ~/.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이미 존재하는 경우 경고를 무시하십시오.

  • $afileauthorized_keys 파일의 경로와 함께 변수를 설정 하십시오.
  • cat - >> $afile -STDIN에서 입력을 받고 authorization_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...)하거나 다른 pssh스위치를 사용하여 IP 목록을 작성할 수 있습니다 -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
세 가지 사소한 추가 사항 : (1) pssh은 Python 스크립트이며로 설치할 수 있습니다 pip install pssh. (2)를 통해 ssh실행하여 모든 서버에서 동시에 키를 생성 할 수도 있습니다 . (3) 키를 생성 한 후에는 모든 공개 키를 루프의 로컬 시스템에 복사 하고 공통으로 조합 한 다음 각 시스템에 복사 하여 키를 모두에게 분배 할 수 있습니다 . / 암호를 도울 수 있습니다. ssh-keygenpsshauthorized_keysssh_agentssh_add
lcd047

@ lcd047-고마워, 나는 오늘 나중에 A에 그것들을 포함시킬 것이다!
slm

1
필자는이 스크립트가 쓸모없는 cat상 (이전)을 사용할 자격이 있다고 생각합니다 . 파일의 내용으로 파이프 라인을 시작하려면 해당 파일의 입력을 리디렉션하면됩니다.
Marc van Leeuwen

1
@MarcvanLeeuwen-동의하는 경향이 있지만 향후 검색을 통해이 문제를 겪는 사람이라면 누구나 pubkey가 어떻게 전달되는지 명확하게 이해하기를 원했습니다 pssh.
slm

1
@MarcvanLeeuwen : 다음과 같이하면 더 이상 쓸모가 없습니다 : cat ~/.ssh/*.pub | .... 이 상황에서 원하는 것이거나 아닐 수도 있습니다.
lcd047

7

대체 사용 xargs, sshpassssh-copy-id:

자격 증명이 credentials.txt 에 다음 형식으로 있다고 가정합니다 user:password@server.

$ cat credentials.txt
root:insecure@192.168.0.1
foo:insecure@192.168.0.2
bar:realsecure@192.168.0.3

당신은 할 수 있습니다 :

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

참고 : 사용 후에는 credentials.txt 를 제거하십시오 !


2
모든 서버에 대해 동일한 사용자 이름과 비밀번호를 사용하는 경우 직접 하드 코딩하고 IP 주소 목록 만 읽을 수 있습니다. :-)
Falco

6

ClusterSSH는 각 시스템의 창과 모든 창을 제어하는 ​​공통 창을 제공합니다.

우리가 10 대의 기계를 말하고 있다면 이것이 효과가 있습니다. 우리가 100 대의 기계를 이야기한다면, 많은 창이있을 것입니다.

ClusterSSH의 장점은 한 시스템이 나머지 시스템과 100 %가 아닌 경우 창을 클릭하고 모든 시스템에 키 입력을 보내기 전에 해당 시스템에만 키 입력을 보낼 수 있다는 것입니다.


6

Ansible을 사용하는 것은 매우 간단합니다. 그냥 교체 <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)'"        

0

청구서에 적합 할 수있는 몇 가지 사항 :

다른 답변에서 언급했듯이 sshpass가장 쉬운 해결책 일 것입니다.


-1

여기에는 두 가지 옵션이 있습니다.

  • 모든 서버의 IP 주소로 파일을 만든 다음 아래를 수행하십시오.

    while read -r ip;do
      ssh-copy-id -i .ssh/id_rsa.pub $ip
    done < servers.txt

servers.txtIP / 호스트 이름이있는 파일 이라고 가정 합니다.

  • 모든 IP / 호스트 이름을 루프에 넣고 ssh-copy-id아래와 같이 실행할 수 있습니다.

    for i in hostname1 hostname2
      do ssh-copy-id -i .ssh/id_rsa.pub $i
    done

다음은 OP 요구 사항과 완전히 일치 ssh-copy-id합니다. "또는 for 루프에서 비밀번호를 반복해서 입력하고 싶습니까? "
OldTimer 2016

OP가 물리적으로 모든 서버에 복사하지 않는 한 다른 방법이 없다고 생각합니다.
Tolga Ozses 9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.