제가 관리하는 일련의 계정에 대한 로그인 비밀번호를 원격으로 업데이트하기 위해 Python 스크립트를 작성하려고 합니다. Python을 사용하여 SSH 프로세스의 stdin을 통해 원격 명령을 성공적으로 전송할 수 있었습니다. 그런데 원격 비밀번호가 제대로 설정되었는지 테스트하고 싶습니다. 이 작업을 원격으로 수행할 수 있습니다. 다음과 같이 원격으로 수행할 수 있습니다.
[localhost]% ssh -t -o RequestTTY=true user@host
[host]% su user -c true
그리고 메시지가 나타나면 비밀번호를 입력하세요. 이것은 작동하지만 원격으로 다음을 시도하는 경우:
[localhost]% echo "su user -c true" | ssh -t -o RequestTTY=true user@host
나는 얻다:
su: must be run from a terminal
su에는 비밀번호(결국 파이썬을 통해 제공할 예정)가 필요하기 때문에 이것이 실패하는 것이 아니라는 점에 유의하세요. 그 전에는 실패합니다. su는 이런 식으로 파이프를 통과하는 것을 좋아하지 않습니다.
무슨 일이 일어나고 있는 걸까요? 입력을 원격 su 명령으로 어떻게 파이프합니까? (또는 특정 사용자의 비밀번호가 올바른지 원격으로 테스트합니다.)
답변1
비밀번호를 로 파이프하고 su
, 파이프로 파이프하십시오 ssh
.
아래 예. foopass는 사용자 foo의 올바른 비밀번호이므로 id
명령을 실행할 것입니다. badpass는 사용자 foo에 대한 잘못된 비밀번호이므로 인증 실패가 발생합니다.
$ echo "echo foopass | su foo -c id" | ssh -t -o RequestTTY=yes steve@localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
Password: uid=1001(foo) gid=1003(foo) groups=1003(foo) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ echo "echo badpass | su foo -c id" | ssh -t -o RequestTTY=yes steve@localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
Password: su: Authentication failure
$