ssh -t를 통해 원격으로 sudo 명령을 실행하는 방법은 무엇입니까?

ssh -t를 통해 원격으로 sudo 명령을 실행하는 방법은 무엇입니까?

ssh -t을 통해 원격 호스트에 로그인하는 스크립트가 있습니다 sudo service foo restart.

요구 사항은 원격 호스트에서 비밀번호를 묻는 메시지가 표시되지 않도록 하는 것입니다. 원격 호스트는 SSH 인증서를 통해 인증됩니다. 이 사용자에게는 원격 호스트의 파일이 sudoers허용됩니다 NOPASSWD.

그러나 테스트 중에 비밀번호를 입력하라는 메시지가 표시되었는데 이는 허용되지 않습니다. -t플래그 없이 수동으로 실행 하면 작동합니다. 그러나 -t플래그는 모든 것을 덜 중요하게 만듭니다.

해결책이 있나요?

답변1

requiretty옵션 을 비활성화하고 실행할 수도 있습니다.sudoersssh 아니요플래그 -t(또는 및 -T)가 유효합니다.

다음과 같은 것을 추가하십시오 sudoers(테스트되지 않음).

Defaults:{your ssh user} !requiretty

이를 NOPASSWD이미 사용 중인 명령과 결합하면 pseudo-tty를 할당하지 않고도 sudo 명령을 실행할 수 있습니다.

requiretty사용자 대신 명령을 변경할 수도 있습니다 .

답변2

SSH 키를 생성하여 원격 호스트로 전송합니다.

  1. 다음 명령을 사용하여 RSA SSH 키를 생성합니다.

    [root@localhost ~] ssh-keygen
    
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):  Hit ENTER
    Enter passphrase (empty for no passphrase): Hit ENTER
    Enter same passphrase again: Hit ENTER
    
  2. /root/.ssh/id_rsa.pub키를 찾아 리모컨으로 전송하려면 다음 명령을 사용하세요.

    ssh-copy-id -i /root/.ssh/id_rsa.pub root@remote:/root
    

지금 로그인해 보세요. 원격 비밀번호를 묻지 않습니다.

답변3

나에게는 이것이 잘 작동하지만 다음과 같이 경고하십시오. stdin이 터미널이 아니기 때문에 의사 터미널이 할당되지 않습니다.

ssh -t username@hostname1 << 'EOS'
sudo sh
hostname
EOS

Pseudo-terminal will not be allocated because stdin is not a terminal.
hostname1

관련 정보