SSH 내부의 SSH가 "stdin : is a tty"로 실패


58

ssh로 컴퓨터 1에 연결 한 다음 ssh로 다른 컴퓨터 2에 연결하려고 하는데이 오류가 발생합니다.

ssh user@computerone.com 'ssh otheruser@computertwo.com'

stdin: is not a tty

왜?


1
나는 당신이 두 번째 주위에 작은 따옴표가 필요하다고 생각하지 않습니다 ssh!
coffeMug

답변:


70

기본적으로 ssh를 사용하여 원격 시스템에서 명령을 실행하면 TTY 가 원격 세션에 할당되지 않습니다. 이를 통해 TTY 문제를 처리하지 않고도 이진 데이터 등을 전송할 수 있습니다. 이것은에 실행 된 명령에 제공된 환경입니다 computerone.

그러나 원격 명령없이 ssh를 실행하면 쉘 세션이 실행 중일 가능성이 있으므로 TTY를 할당합니다. 이것은 ssh otheruser@computertwo.com명령에 의해 예상 되지만 이전 설명으로 인해 해당 명령에 사용 가능한 TTY가 없습니다.

쉘을 원한다면 computertwo이것을 대신 사용하십시오. 이는 원격 실행 중에 TTY 할당을 강제합니다.

ssh -t user@computerone.com 'ssh otheruser@computertwo.com'

이것은 일반적으로 ssh 체인 끝에서 쉘 또는 기타 대화식 프로세스를 실행할 때 적합합니다. 데이터를 전송하려는 경우 추가하거나 추가 할 필요가 -t없지만 모든 ssh 명령에는 다음과 같은 데이터 생성 또는 소비 명령이 포함됩니다.

ssh user@computerone.com 'ssh otheruser@computertwo.com "cat /boot/vmlinuz"'

9

SSH를 릴레이로 사용하는 더 좋은 방법이 있습니다 ProxyCommand. 옵션을 사용하십시오 . 클라이언트 컴퓨터에 두 번째 컴퓨터에 로그인 할 수있는 키가 있어야합니다 (공개 키는 대부분의 상황에서 SSH를 사용하는 것이 좋습니다). 이것을 ~/.ssh/config넣고 실행하십시오 ssh computertwo.

Host computerone
HostName computerone.com
UserName user

Host computertwo
HostName computertwo.com
UserName otheruser
ProxyCommand ssh computerone exec nc %h %p

nc이다 netcat을 . 사용 가능한 여러 버전이 있습니다.


computerone의 'authorized_keys'에 "proxy"관련 줄을 추가하지 않아도됩니까? 나는 openSSH의 '프록시'파워를 조사하는 것을 의미하지만 아직 그것에 도달하지 않았습니다.
Felipe Alvarez

7

중간 서버의 tty 장치에서 대화 형 터미널을 기대하고 있습니다.

이 명령을 시도하면 작동합니다.

ssh user@computer1 -t "ssh otheruser@computer2"

참조 man ssh에 대한 -t옵션을 선택합니다.


2

~ / .ssh / config에있는 내 ssh 구성 파일에 RequestTTY Yes를 추가 하여이 문제를 해결했습니다 ...

Host myserver.com
  User my-ssh-username
  RequestTTY Yes

1

ssh에서 PROXY Jump 옵션을 사용할 수 있습니다

-J [user@]host[:port]
 Connect to the target host by first making a ssh connection to the jump host and then establishing a TCP forwarding to the ultimate destination from there.  Multiple jump hops may be specified
 separated by comma characters.  This is a shortcut to specify a ProxyJump configuration directive.

따라서 hostB에 연결해야하지만 먼저 hostA를 거쳐야합니다. 일반적으로 나는

 ssh hostA
 [user@hostA ~]$ ssh hostB

나는 지금 이것을한다

ssh -J hostA hostB
[user@hostB ~]$

0

명령 행에서 SSH 구성 옵션 "RequestTTY"를 대체 할 수 있습니다.

내 작업 예제 cd-serv-one.sh/bin/bash여러 명령을 실행 한 후 SSH 세션에서 시작됩니다 .

#!/bin/bash

ssh -o "requestTTY=yes" User@ExampleHostName "cd /home/myPathFoo/myPathBar; /bin/bash"

이제 ./cd-serv-one.sh필요한 SSH 세션을 시작하기 위해 실행 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.