특정 사용자의 비밀번호를 변경하기 위해 다양한 서버에 접속하려고 합니다.
이 작업을 수행하려면 스크립트를 작성해야 합니다. 문제는 sudo를 사용하고 루트로 원격 서버에 연결하기 위해 비밀번호를 보내야 한다는 것입니다.
다음과 같이 시도하고 있지만 작동하지 않습니다.
sshpass -p pass ssh user@server << EOF
echo pass | sudo -S -u root "echo 'user2:pass2' | chpasswd"
EOF
내가 하려는 작업을 더 잘 설명하려면 다음 단계를 수행해야 합니다.
- 내 사용자를 사용하여 서버에 연결합니다.
- 루트로 연결하려면 "sudo"를 사용하세요.
- user2의 비밀번호를 변경하려면 "echo 'user2:pass2' | chpasswd"를 실행하세요.
오류는 다음과 같습니다.
stdin이 터미널이 아니기 때문에 의사 터미널은 할당되지 않습니다. stat: `pipe:[2670580091]'을 stat할 수 없습니다. 해당 파일이나 디렉터리가 없습니다. [sudo] user1의 비밀번호: sudo: echo 'user2:XXXXXXX' | chpasswd: 명령을 찾을 수 없습니다.
답변1
ansible 모듈 "user"가 문제를 해결해야 합니다. 하지만 암호화된 비밀번호 해시를 제공해야 합니다. 해시하려면 다음 명령을 사용하십시오.
mkpasswd --method=sha-512
생성된 해시 문자열을 따옴표로 묶어 다음과 같은 임시 명령을 실행합니다.
ansible -v all -i <hostname>, --become --extra-vars 'ansible_become_pass=<sudo password> ansible_password=<sudo password>' --user=<ssh user> -k -m user --args='name=root update_password=always password="$6$IZjuXoio1$zHpQQDZGDPwG8mr2R6Mrt1C8Nqstui75enT/o0oSVJ3M6rqff8993kmAaTgbc9q9HTgPD2jtZukEqgeIGKfUN0"'
전제 조건: 클라이언트 시스템에 ansible 및 sshpass가 있어야 합니다.
답변2
SSH를 통해 루트로 다음을 수행했습니다.
ssh -t you@server <<EOF
echo pass_for_you | sudo -S bash -c "commands to do as root";
EOF
답변3
이것이 도움이 됩니까? 아니면 그런 것? 당신이하고 싶은 일을 내가 이해한다고 가정합니까?
for i in server{1,2,3}; do
ssh -t user@$i 'sudo passwd user2'
done