이 문서에서 SSH를 통해 명령을 실행할 때 TTY가 없습니다.


10

here-document에서 다음과 같이 SSH를 통해 명령을 실행하려고합니다.

ssh example.com <<END
sudo /etc/init.d/apache2 reload
END

sudo의 암호와 같이 입력이 필요한 것을 실행하려고 할 때를 제외하고는 정상적으로 작동합니다. 이 경우 다음 메시지가 나타납니다.

sudo: no tty present and no askpass program specified

-tSSH 에서 플래그를 사용하여 다음 과 같은 의사 tty를 할당 할 수 있다는 것을 알고 있습니다 .

ssh -t example.com "sudo /etc/init.d/apache2 reload"

그리고 그것은 작동하지만 here-document와 같은 것을 시도하면 작동하지 않으며 tty가 존재하지 않는다는 동일한 오류가 발생합니다.

ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END

이 작업을 어떻게 수행 할 수 있습니까?

또한 왜 동일한 줄에 전달하는 대신 here-document로 작업하고 싶은지 궁금한 경우 입력 명령 (몇 개가있을 수 있음)이 스크립트에서 읽은 구성 파일에서 가져 오기 때문입니다. 따옴표, 큰 따옴표 등의 명령을 이스케이프하는 문제를 피한다고 들었습니다.

답변:


6

visudosudoers 파일을 편집하고 아래 행을 삽입하는 데 사용하십시오 .

Defaults:<user>    !requiretty

사용이 작동하지 않는 이유는 대답 ssh -t "something" versus ssh -t <<STOP something STOP하지 않습니다. sudo를 사용하지 않고 사용자 자신을 위해 passwd를 직접 사용하고 있다고해도 여전히 heredoc을 사용하여 TTY를 얻지 못합니다.

ssh -t -tstdin이 터미널이 아닌 경우에도 의사 -tty 할당을 강제 하십시오 .


고마워, 나는 다른 곳 에서이 수정을 보았지만 sudo를 사용하는 명령의 문제 만 해결합니다. 왜 ssh -t "something"대 ssh -t << STOP STOP이 작동하지 않는지 대답하지 않습니다. sudo를 사용하지 않고 사용자 자신을 위해 passwd를 직접 사용하고 있다고해도 여전히 heredoc을 사용하여 TTY를 얻지 못합니다.
lpfavreau

내 답변을 업데이트했습니다.
quanta

1

here 문서를 ssh -t명령 인수 로 제공되는 변수에 단순히 저장하지 마십시오 .

보다 일반적 ssh -T으로, 원격 호스트의 stdin이 heredoc에서 리디렉션되는 경우 ( sshpty 할당 시도를 방지하기 위해) 원격 쉘을 명령 인수로 사용 하거나 지정하십시오 .

# store heredoc in a variable
heredoc="$(cat <<EOF
who
sudo ls -ld /
logname
EOF
)"

ssh -t localhost "$heredoc"


# avoid: Pseudo-terminal will not be allocated because stdin is not a terminal.
- ssh example.com <<END
+ ssh -T example.com <<END
+ ssh example.com /bin/sh <<END
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.