여러 원격 서버에서 서비스를 안전하게 다시 시작

여러 원격 서버에서 서비스를 안전하게 다시 시작

동료들과 제가 여러 서버에서 서로 다른 서비스를 다시 시작할 수 있도록 스크립트를 작성해야 합니다. 우리는 모두 LDAP를 사용하여 서버에 연결하므로 LDAP 사용자를 서버에 연결한 다음 sudo를 사용하여 서비스를 다시 시작하는 스크립트를 원합니다. 각 서버에 스크립트를 작성하여 필요한 모든 서비스를 다시 시작할 수 있습니다. 현재 스크립트는 다음과 같은 명령을 실행합니다.

ssh -t user@host "sudo service XXX restart" 

문제는 각 서버에 대해 스크립트가 사용자 비밀번호를 두 번(ssh 연결용으로 하나, sudo 명령용으로 두 번) 요청한다는 것입니다. 내 첫 번째 추측은 read -s -p를 사용하여 사용자에게 로그인과 비밀번호를 묻는 메시지를 표시한 다음 변수를 사용하여 ssh로 자동 로그인하는 것이었습니다. 분명히 Expect가 이 작업을 수행하는 방법이지만 Expect 스크립트에서 비밀번호를 안전하게 프롬프트하거나 bash 스크립트에서 비밀번호를 프롬프트하고 Expect 스크립트에서 변수를 안전하게 전달하는 방법을 찾지 못했습니다.

나는 작동하는 것처럼 보이지만 sudo에서는 작동하지 않는 pssh, 클러스터 ssh와 같은 솔루션을 찾았습니다. 이를 수행하는 가장 좋은 방법은 SSH 키를 사용하는 것임을 이해하지만 여러 사용자가 스크립트를 사용해야 하기 때문에 LDAP 로그인/비밀번호를 사용하고 싶습니다.

답변1

Glenn이 의견에서 제안한 것처럼 이를 수행하는 올바른 방법은 stty를 사용하는 것입니다.

# grab the password
stty -echo
send_user -- "Password for $user@$host: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set pass $expect_out(1,string)

#... later
send -- "$pass\r"

관련 정보