답변:
아마도 /etc/sudoers
파일 (또는 포함 된 모든 파일)에 다음이 있기 때문일 수 있습니다.
Defaults requiretty
... sudo
TTY 가 필요합니다. Red Hat 시스템 (RHEL, Fedora ...)은 기본 sudoers
파일에 TTY가 필요한 것으로 알려져 있습니다. 이는 실질적인 보안 이점을 제공하지 않으며 안전하게 제거 할 수 있습니다.
Red Hat은이 문제를 인정 했으며 향후 릴리스에서 제거 될 것입니다.
서버 구성을 변경하는 것이 옵션이 아닌 경우 잘못된 구성 의 해결 방법으로 원격 측에 의사 터미널을 생성하는 -t
또는 -tt
옵션을 사용할 수 ssh
있지만 서버 측에 여러 측면이 있음을주의하십시오 효과.
-tt
대화식 사용을위한 것입니다. raw
원격 터미널과 상호 작용할 수 있도록 로컬 터미널을 모드로 설정합니다. 즉, ssh
I / O가 터미널을 오가지 않으면 부작용이 발생합니다. 예를 들면, 모든 입력이 다시 반향 될 특수 문자 단말기 ( ^?
, ^C
, ^U
) 특수 가공 발생할; 출력시 LF
s는 s로 변환됩니다 CRLF
... 자세한 내용 은이 바이너리 파일이 왜 변경됩니까?에 대한 답변을 참조하십시오.
영향을 최소화하기 위해 다음과 같이 호출 할 수 있습니다.
ssh -tt host 'stty raw -echo; sudo ...' < <(cat)
가 < <(cat)
있는 로컬 단말 설정 (존재하는 경우) 피할 raw
모드. 그리고 우리는 stty raw -echo
원격 터미널의 회선 규율을 통과로 설정하는 데 사용 하고 있습니다 (효과적으로 의사 터미널 대신 의사 파이프 대신 사용되는 파이프처럼 작동 -tt
하지만 명령이 실행 된 후에 만 적용됩니다. 입력 될 때까지 무언가를 보내는 것을 지연시키기 위해).
원격 명령의 출력은 터미널로 이동하기 때문에 버퍼링 (많은 응용 프로그램에 대한 라인 기반)과 계속 TCP_NODELAY
켜져있는 대역폭 효율성에 영향을 미칩니다 . 또한으로 -tt
, ssh
에은 IPQoS 설정 lowdelay
에 반대를 throughput
. 다음을 사용하여 둘 다 해결할 수 있습니다.
ssh -o IPQoS=throughput -tt host 'stty raw -echo; sudo cmd | cat' < <(cat)
또한 이는 원격 명령이 stdin에서 파일 끝을 감지 할 수 없으며 원격 명령의 stdout 및 stderr이 단일 스트림으로 병합됨을 의미합니다.
그래서 결국 좋은 일이 아닙니다.
당신이 원격 호스트에 가상 단말기를 생성하는 방법을 가지고있는 경우에 (와 같은을 expect
, zsh
, socat
, perl
의 IO::Pty
...), 다음은 의사 터미널 부착 만들 것을 사용하는 것이 더 좋을 것이다 sudo
(에를하지만, I / O 용이 아님) ssh
없이 사용하십시오 -t
.
예를 들면 다음과 expect
같습니다.
ssh host 'expect -c "spawn -noecho sh -c {
exec sudo cmd >&4 2>&5 <&6 4>&- 5>&- 6<&-}
exit [lindex [wait] 3]" 4>&1 5>&2 6<&0'
또는 script
(여기서 구현을 가정 util-linux
) :
ssh host 'SHELL=/bin/sh script -qec "
sudo cmd <&3 >&4 2>&5 3<&- 4>&- 5>&-
" /dev/null 3<&0 4>&1 5>&2'
(원격 사용자의 로그인 쉘이 Bourne과 같다고 가정).
기본적으로 SUDO는 TTY를 요구하도록 구성되어 있습니다. 즉, SUDO는 로그인 쉘에서 실행될 것으로 예상됩니다. -t
SSH 호출에 스위치를 추가하여이 요구 사항을 무시할 수 있습니다 .
ssh -t someserver sudo somecommand
-t
의사 -tty 의 강제 할당.
이 작업을 전체적으로 수행 /etc/sudoers
하려면을 지정하여 수정하십시오 !requiretty
. 이것은 사용자, 그룹 또는 모든 포괄 수준에서 수행 될 수 있습니다.
Docker와 Centos 7을 사용 하여이 문제에 부딪 쳤습니다.
yum install -y sudo
sed -i -e 's/Defaults requiretty.*/ #Defaults requiretty/g' /etc/sudoers
https://hub.docker.com/r/liubin/fluentd-agent/~/dockerfile 에서이 핵을 발견했습니다.
requiretty
기본 sudoers에있는 sudo의 redhat 배포판 만 입니다. 새로운 릴리즈에서 수정 될 예정입니다