스택 오버플로에서 답변을 얻지 못했기 때문에 이 질문이 반복적으로 발생합니다.
공개 키를 다른 서버로 가져오는 간단한 스크립트를 만들려고 합니다.
선택할 수 있는 옵션을 2개 만들었습니다. 하나는 ssh-copy-id를 사용하는 것이고, 다른 하나는 단순히 공개 키를 다른 서버의 파일에 복사하는 것입니다. 두 번째는 잘 작동하지만 ssh-copy-id에서는 작동하지 않습니다. 이것이 내가 지금 가지고 있는 것입니다:
ssh-copy-id -i $var1 $i
$var1은 "/path/to/the/public_key.pub"이고 $i는 txt 파일을 작성하는 서버입니다. 전체적인 아이디어는 내 공개 키가 어디에나 있고 새 관리자의 공개 키를 어디에나 입력하는 것을 좋아한다는 것입니다. 잘 작동하지만 실행할 때 비밀번호를 입력해야 합니다. 모든 솔루션은 비밀번호를 한 번만 입력하면 이를 수행할 수 있습니다. 또한 키를 추가하기 전에 새 줄을 입력하고 싶습니다. 하지만 ssh-copy-id를 사용하여 이를 수행하는 방법에 대한 해결책을 찾을 수 없습니다.
답변1
해결책은 이것입니다.
1) 터미널에서 id_rsa.pub를 복사하려는 모든 호스트/IP 주소가 포함된 배열을 만듭니다. 예를 들어
hosts=( host1 host2 192.168.100.200 host4 )
2) 예상 파일을 생성하고 저장한 후 실행 가능하게 만듭니다.chmod +x filename
#!/usr/bin/expect -f
if { $argc != 4 } {
puts stderr "usage: ./expt host pass user keyfile"
exit 2
}
set host [lindex $argv 0]
set pass [lindex $argv 1]
set user [lindex $argv 2]
set keyfile [lindex $argv 3]
spawn ssh-copy-id -i $keyfile $user@$host
expect "assword:"
send "$pass\n"
expect eof
3) 이제 호스트를 보유하고 있는 어레이를 반복하여 전송합니다.id_rsa.pub
for host in "${hosts[@]}" ; do ./expt "$host" Y0urPassword username ~/.ssh/id_rsa.pub ; done
공개 키가 모든 호스트에 복사될 때까지 기다립니다.
답변2
자, 드디어 이걸 얻었습니다. 이제 완벽하게 작동합니다. for 루프 뒤의 스크립트에서 다음 줄을 추가합니까?
/usr/bin/expect <<EOD
원하는 프로세스의 조건은 다음과 같습니다. 예를 들면 다음과 같습니다.
spawn ssh-copy-id -i test.pub root@<name_host>
expect "Enter passphrase for key"
send "$pass\n"
expect eof
EOD
그리고 그것은 완벽하게 작동합니다!
설명과 도움에 다시 한번 감사드립니다.
;)