특정 사용자를 위해 RSA 키 세트를 여러 서버에 복사하려고 합니다. 명령을 내릴 때마다 ssh-copy-id
"yes"를 입력하여 확인하라는 메시지가 표시되고 비밀번호를 묻습니다. 팔과 손가락이 닳는 것을 방지하고 싶었기 때문에 이 작업을 위한 스크립트를 다음과 같이 작성하기로 결정했습니다.
#!/bin/bash
runuser -u $RMTUSER -- ssh-copy-id [email protected]
runuser -u $RMTUSER -- ssh-copy-id [email protected]
(...)
runuser -u $RMTUSER -- ssh-copy-id [email protected]
runuser -u $RMTUSER -- ssh-copy-id [email protected]
이 작업을 자동화하는 좋은 방법을 찾을 수 없는 것 같습니다. 아무것도 작동하지 않는 것 같습니다. "예"와 비밀번호를 자동으로 입력하는 방법은 무엇입니까?
내 원래 질문이 다소 지루하다는 것을 깨달았습니다. 미안해요...하지만 아직 거기 있어요.
나는 Marcus가 제안한 것과 유사한 것으로 스크립트를 개선했습니다. "for" 루프에 갇혀서 다른 서버 배열에 해당 비밀번호를 전달하는 방법이 궁금합니다.
내 호스트 세트는 모두 정적이며 그 이상이 있습니다.
#!/bin/bash
LOCUSER="$1" # USER FOR REMOTE ACCESS
RMTUSER="$2" # REMOTE USER
PASSWD="$3" # SITE PASSWORD
SITE="$4" # SERV SITE
function uras() {
for IP in "$@"; do
runuser -u "${LOCUSER}" -- sshpass "-p${PASSWD}" ssh-copy-id "${RMTUSER}@${IP}"
[ "$?" -eq "0" ] && echo "OK - $IP" || echo "FAIL! - $IP"
done
}
case $SITE in
"sa")
ARRAY_A=( $(cat ./serv_a.txt) )
uras "${ARRAY_A[@]}"
;;
"sb")
ARRAY_B=( $(cat ./serv_b.txt) )
uras "${ARRAY_B[@]}"
;;
"sc")
ARRAY_C=( $(cat ./serv_c.txt) )
uras "${ARRAY_C[@]}"
;;
*)
echo "INVALID SITE"
;;
esac
그럼에도 불구하고 스크립트는 모든 호스트에 대해 실패합니다.
# ./auto_ssh_copy.sh [user] root [pass] [site]
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/zabbix/.ssh/id_rsa.pub"
FAIL! - 172.24.168.48
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/zabbix/.ssh/id_rsa.pub"
FAIL! - 172.24.168.49
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/zabbix/.ssh/id_rsa.pub"
FAIL! - 172.24.168.50
(...)
"-f"도 사용해 보았지만 결과는 동일합니다.
나는 Ansible만큼 강력한 것을 사용하는 것이 아마도 작업에 더 나은 도구라는 점에 동의하지만 불행히도 현재 내 작업 세트에서는 사용할 수 없습니다. 지금까지 제가 생각해낸 내용은 다음과 같습니다.
마지막으로 모든 키를 성공적으로 복사했습니다. 위 스크립트에는 옵션이 누락되어 -o StrictHostKeyChecking=no
종료 sshpass
코드 6을 반환합니다. 생성된 명령은 다음과 같습니다.
runuser -u ${LOCUSER} -- sshpass -v -p${PASSWD} ssh-copy-id -o StrictHostKeyChecking=no ${RMTUSER}@${IP}
Marcus Unser는 매우 도움이 되었습니다. 다들 감사 해요.
답변1
옵션을 사용하여 검사를 비활성화할 수 있습니다 yes
.-f
ssh-copy-id
비밀번호는 아마도아니요스크립트가 다른 사람이 읽을 수 있는 어딘가에 있다고 가정하고 해당 스크립트의 일부가 되십시오. 대신 다음과 같은 스크립트를 작성하는 것이 좋습니다.
#!/bin/sh
# Usage: myscript user password
RMTUSER=$1
PASSWORD=$2
# just an example, but to highlight you can use brace expansions.
hosts=("172.24.168.47" "172.24.168.48" 172.24.168.{200..213})
for host in ${hosts[@]}; do
runuser -u "${RMTUSER}" -- sshpass "-p${PASSWORD}" ssh-copy-id -f "root@${host}"
done
답변2
-f
당신은 에 추가할 수 있습니다힘복사하거나
StrictHostKeyChecking no
~/.ssh/config
ssh-copy-id가 키가 서버에 이미 존재하는지 확인하지 않도록 파일 내에 설정하십시오 .
그러나 이러한 옵션은 주의하지 않으면 동일한 키를 여러 번 설치할 수 있음을 의미합니다.
답변3
이와 같은 질문에 대한 정직한 대답은 "모든 종류의 흥미로운 방식으로 실패하는 사용자 정의 도구 구축을 중단하고 다른 사람들이 잘 유지 관리하는 강력한 도구를 사용하십시오"입니다.
입력하다안시푸르. 관리하는 호스트 및 해당 "논리적 그룹"(ansible은 이를 "인벤토리"라고 함) 목록과 해당 호스트에 발생해야 하는 작업 목록(ansible은 "플레이북"이라고 함)을 유지하는 것이 도움이 될 수 있습니다.많은더 좋고, 더 일관되며, 관리 시간이 단축됩니다.
귀하의 경우에는 다음과 같은 인벤토리 파일이 필요합니다(라고 부르겠습니다 ~/servers.ini
).
[rootservers]
172.24.168.47
172.24.168.48
172.24.168.[200:213]
[rootservers:vars]
ansible_password=f00bar
다른 방법으로 비밀번호를 제공할 수도 있습니다.
그리고 스크립트(예 ~/playbook.yaml
: ):
hosts: rootservers
tasks:
- name: Set authorized key took from file
authorized_key:
user: root
state: present
key: "{{ lookup('file', '/home/mark/.ssh/id_rsa.pub') }}"
그게 다야. 이제 실행할 수 있습니다
ansible-playbook -i ~/servers.ini ~/playbook.yaml
rootservers
그룹의 각 호스트 에 대해 mark
rsa_id가 이미 authorized_keys
서버의 파일 에 있으면 가능한 확인을 수행하고 그렇지 않은 경우 거기에 추가하십시오.
그러나 일반적으로 완료되면 루트 비밀번호 로그인을 비활성화하도록 SSHd를 구성하고(항상 좋은 생각입니다. IMHO) 일부 패키지를 설치하거나 업데이트합니다("이 타사 저장소를 활성화하고 설치"). 버전 10.1"의 CUDA 드라이버), 일부 모니터링 소프트웨어 설정 및 설치, 일부 사용자 디렉터리 정리, 일부 파일 복사 등
authorized_key
이러한 모든 작업에 대해 ansible에는 (또는 apt
또는 또는 ...) 와 같은 간단한 명령이 내장되어 있거나 copy
누군가 작성했습니다.역할("Postfix 메일 서버 설정"과 같습니다.) 이를 위해 ansible을 사용할 수 있습니다.
개인적으로 나는안 돼요패키지를 수동으로 설치하고, 로컬 사용자를 추가하거나, 서버의 구성을 변경합니다. 내일 아침에 그렇게 했는지 기억이 나지 않습니다. 장점은 해당 서버에 수행한 작업에 대한 서면 설명을 얻을 수 있을 뿐만 아니라 올바른 그룹의 내 인벤토리에 라인을 추가하기만 하면 해당 서버를 대체하거나 보완할 새 서버를 설정할 수도 있다는 것입니다.
따라서 내 작업 흐름은 일반적으로 다음과 같습니다.
- 실제 머신에 Linux를 설치하거나 가상 머신을 시작하려면 인증 키를 추가하고 SSH 서버만 설치하면 됩니다.
- 필요한 경우 루트의 인증 키를 추가하세요.
- 해당 그룹 아래의 인벤토리에 머신을 추가합니다.
- 해당 머신에서 발생하려는 작업이 포함된 플레이북을 실행하세요.
``실제로해야합니다아니요비밀번호를 인벤토리에 저장하려면 다음을 사용하세요.둥근 천장그와 반대로, 예시를 위해서는 이것으로 충분할 수 있습니다.