ssh 공개 키를 여러 Linux 호스트에 복사


14

중앙 서버에서 여러 서버로 .ssh / id_rsa.pub를 복사하려고합니다. 일반적으로 변경 사항을 다른 서버로 푸시하는 데 사용하는 다음 스크립트가 있습니다.

#!/bin/bash


for ip in $(<IPs); do
    # Tell the remote server to start bash, but since its
    # standard input is not a TTY it will start bash in
    # noninteractive mode.
    ssh -q "$ip" bash <<-'EOF'



EOF

done

그러나이 경우 로컬 서버에 공개 키를 배치 한 다음 여러 서버에 추가해야합니다. 위의 here 문서 스크립트를 사용하여 다음을 실행하는 방법이 있습니까?

cat .ssh/id_rsa.pub |ssh tony@0.0.0.0 'cat > .ssh/authorized_keys'

하나의 중앙 위치에서 리모컨으로 복사 되었기 때문에 왜 로컬에서 고양이를 사용해야합니까?
klerk

중앙 서버의 공개 키를 추가해야하므로 로컬 서버가 필요합니다. 혼란을 드려 죄송합니다.
user67186

답변:


20

이 간단한 루프를 사용하면이를 자동화하고 모든 원격 서버로 확산시킬 수 있습니다.

#!/bin/bash
for ip in `cat /home/list_of_servers`; do
    ssh-copy-id -i ~/.ssh/id_rsa.pub $ip
done

안녕하세요, 당신의 답변을 받아 들였습니다. 감사합니다
user67186

+1. 나는 일을 끝내는 매우 쉬운 스크립팅 스타일의 팬입니다!
Laith Leo Alobaidy

4

다음은 매번 암호를 묻지 않고 ssh-keygen을 여러 서버에 복사하는 간단한 스크립트입니다.

for server in `cat server.txt`;  
do  
    sshpass -p "password" ssh-copy-id -i ~/.ssh/id_rsa.pub user@$server  
done

3

다른 사람의 공개 키를 여러 컴퓨터에 배치해야하는 경우 허용되는 답변이 작동하지 않습니다. 그래서 나는 다음 해결책을 생각해 냈습니다.

cat add-vassal-tc-agents.sh

#!/bin/bash
set -x # enable bash debug mode
if [ -s vassal-public-key.pub ]; then # if file exists and not empty
    for ip in `cat tc-agents-list.txt`; do # for each line from the file
        # add EOL to the end of the file and echo it into ssh, where it is added to the authorized_keys
        sed -e '$s/$/\n/' -s vassal-public-key.pub | ssh $ip 'cat >> ~/.ssh/authorized_keys'
    done
else
    echo "Put new vassal public key into ./vassal-public-key.pub to add it to tc-agents-list.txt hosts"
fi

이 스크립트는 실행되는 환경에 액세스 권한이있는 경우 머신 목록의 사용자에게 새 키를 추가합니다.

tc-agents-list.txt:

root@10.10.0.1
root@10.10.0.2
root@10.10.0.3
root@10.10.0.4

2

공개 키를 복사하기 위해 openssh 자체에 무언가가 내장되어 있습니다. 그래서 대신 cat하고 ssh이것을 사용 : -

ssh-copy-id -i ~/.ssh/id_rsa.pub YOUR-REMOTE-HOST

중앙 서버의 공용을 IP 파일에 존재하는 원격 서버로 복사하는 명령을 실행하고 싶습니다. 스크립트는 그것들을 반복합니다. 따라서 귀하의 예는 여기서 유용하지 않을 수 있습니다. 감사합니다
user67186

공개 키의 기본 위치를 사용하는 경우 -i 옵션을 사용할 필요가 없습니다.
Laith Leo Alobaidy

0

다음과 같이 간단한 while 루프 및 내장 서버 목록을 사용하여이 작업을 수행 할 수 있습니다.

while read SERVER
do
    ssh-copy-id user@"${SERVER}"
done <<\EOF
server1
server2
server3
EOF

스크립트 내부에 목록이 있으면 잘못 배치 될 수있는 별도의 데이터 파일이 없어집니다.


ssh-copy-id다른 답변에서 이미 제안되었습니다.
RalfFriedl

0

서버 IP 목록, 이름 SERVER 및 서버의 IP 주소 만있는 파일이 정의되었다고 가정하십시오.

for 루프도 작동합니다.

for user in $(awk '{print $1}' SERVER | awk '{printf "user1@""%s"(NR==0?RS:"\n"), $1}' ) ;
do
        ssh-copy-id -f -i id_rsa_k2.pub $user
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.