최근에 서버 목록에 대한 사용자 이름/비밀번호 액세스 권한을 얻었으며 더 쉽게 로그인할 수 있도록 내 SSH 공개 키를 이러한 서버에 전파하고 싶습니다.
그래서 분명합니다:
- 원격 서버에는 이를 자동화하기 위해 활용할 수 있는 기존 공개 키가 없습니다.
- 이 서버에 처음 로그인하는 것이므로 해당 서버에 액세스하기 위해 계속해서 자격 증명을 입력할 필요가 없기를 바랍니다.
ssh-copy-id
또한 for 루프에서 비밀번호를 반복해서 입력하고 싶지 않습니다.
답변1
비밀번호를 여러 번 입력하는 대신 스위치를 사용하여 pssh
비밀번호 -A
를 한 번 입력한 다음 목록에 있는 모든 서버에 비밀번호를 제공할 수 있습니다.
노트:그러나 이 방법을 사용하면 허용되지 않으므로 ssh-copy-id
SSH 공개 키 파일을 원격 계정의 파일에 추가하는 고유한 방법을 찾아야 합니다 ~/.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 파일의 서버에 동일한 사용자 이름이 있다고 가정합니다).-A
pssh
비밀번호를 요청한 다음 연결되는 모든 서버에 비밀번호를 재사용하라고 지시합니다 .-i
pssh
출력을 파일에 저장하는 대신 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
대체 용도 xargs
및 sshpass
: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
몇 가지 사항이 해당 청구서에 적합할 수 있습니다.
- 기능적으로 ServerFault는 동일한 질문을 제기합니다.SSH-복사 ID 자동화.
- Perl 모듈이 있지만 많이 유지 관리되지 않는 것 같습니다.https://github.com/Ruyk/pssh-copy-id.
다른 답변에서 언급했듯이 sshpass
이것이 아마도 가장 간단한 해결책일 것입니다.