루트 로그인이 비활성화된 SSH 서버가 있습니다. 실행 후 파일에서 입력이 필요한 권한 있는 명령을 실행하고 싶습니다. 사용자 개입 없이 oneliner 명령이나 스크립트를 통해 모든 작업을 수행하고 싶습니다.
키 인증 설정이 있으므로 명령을 실행할 때만 다음 비밀번호가 필요합니다.
내가 얻은 가장 가까운 것은 이것이었다
echo "mypass" |ssh -tt user@ip "sudo specialCommand"
출력은 다음과 같습니다.
mypass
[sudo] password for user:
specialCommand requests inputfile contents
mypass는 이전에 인쇄되었으며 비밀번호 프롬프트도 허용되었습니다.
commandInput
비밀번호가 승인된 후 파이프로 연결하려는 파일이 있습니다.
나는 단지 추측 게임에 불과한 다양한 시도를 했지만 실패했습니다. 어떻게 하면 이를 달성할 수 있습니까?
답변1
어때요?
(echo "mypass"; cat commandInput) | ssh -tt user@ip "sudo specialCommand"
또는 분명히 sudo
원격 호스트에 액세스 할 수 있으므로 visudo
이 줄을 /etc/sudoers
( using뒤쪽에sudo
비밀번호 액세스를 허용하는 기존 행 user
)?
user ALL=(root) NOPASSWD: /full/path/of/specialCommand
이 줄은 사용자 (다른 사람이 아닌)에게 비밀번호 없이 user
루트(다른 사용자는 제외)로 실행할 수 있는 권한을 부여합니다. specialCommand
이 줄을 통해 다른 명령을 실행하려면 sudo
평소와 같이 비밀번호가 필요합니다.
그 후에는 다음을 간단히 수행할 수 있습니다.
ssh -tt user@ip "sudo specialCommand" < commandInput
답변2
specialCommand
실제로 tty가 필요하지 않고 ssh
비밀번호 프롬프트용으로만 tty를 만들어야 하는 경우 다른 옵션은 다음과 같습니다.sudo
(echo "mypass" ; cat commandInput) | ssh user@ip "sudo -Sp '' specialCommand"
옵션을 사용하면 -S
표준 입력(이 경우 sudo
사용자 입력)에서 비밀번호를 읽을 수 있으며 옵션을 사용하면 비밀번호 프롬프트가 표시되지 않습니다.echo "mypass"
-p ''
그런 다음 적절한 권한으로 보호되는 별도의 파일에 비밀번호를 넣을 수 있습니다. 이는 일반적으로 스크립트에 비밀번호를 직접 연결하는 것보다 더 나은 방법입니다. 명령은 다음과 같습니다.
cat passwordFile commandInput | ssh user@ip "sudo -Sp '' specialCommand"
후자의 경우,확실하게 하다비밀번호 파일에는 한 줄만 있어야 하며, 비밀번호만 있고 다른 내용은 없어야 합니다. 그렇지 않으면 비밀번호 줄 뒤의 내용이 specialCommand
.