su를 사용하여 SSH를 통해 명령을 파이프할 수 있습니다.

su를 사용하여 SSH를 통해 명령을 파이프할 수 있습니다.

제가 관리하는 일련의 계정에 대한 로그인 비밀번호를 원격으로 업데이트하기 위해 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
$

관련 정보