SSH wewnątrz SSH kończy się niepowodzeniem z „stdin: is not tty”


58

Próbuję połączyć się z maszyną pierwszą za pomocą ssh, a następnie połączyć się z inną maszyną drugą za pomocą ssh, ale otrzymuję ten błąd.

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

stdin: is not a tty

Dlaczego?


1
Nie sądzę, żebyś potrzebował tych pojedynczych cytatów z sekundą ssh!
coffeMug

Odpowiedzi:


70

Domyślnie po uruchomieniu polecenia na zdalnym komputerze za pomocą ssh TTY nie jest przydzielany dla sesji zdalnej. Umożliwia to przesyłanie danych binarnych itp. Bez konieczności zajmowania się dziwactwami TTY. Jest to środowisko przewidziane dla polecenia wykonanego w dniu computerone.

Jednak gdy uruchomisz ssh bez polecenia zdalnego, przydziela TTY, ponieważ prawdopodobnie prowadzisz sesję powłoki. Jest to oczekiwane przez ssh otheruser@computertwo.compolecenie, ale z powodu poprzedniego wyjaśnienia nie ma dostępnego TTY dla tego polecenia.

Jeśli chcesz włączyć powłokę computertwo, użyj jej zamiast tego, co wymusi alokację TTY podczas zdalnego wykonywania:

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

Jest to zwykle odpowiednie, gdy ostatecznie uruchamiasz powłokę lub inny interaktywny proces na końcu łańcucha ssh. Jeśli miałbyś przesyłać dane, nie jest ani właściwe, ani wymagane dodawanie -t, ale wtedy każde polecenie ssh zawierałoby polecenie generujące lub zużywające dane, takie jak:

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

9

Jest lepszy sposób na użycie SSH jako przekaźnika: skorzystaj z ProxyCommandopcji. Musisz mieć klucz na komputerze klienckim, który pozwala zalogować się na drugim komputerze (klucz publiczny jest i tak zalecanym sposobem korzystania z SSH w większości przypadków). Włóż to ~/.ssh/configi biegnij ssh computertwo.

Host computerone
HostName computerone.com
UserName user

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

ncjest netcat . Wystarczy jedna z kilku dostępnych wersji.


Czy nie musimy dodawać wiersza związanego z „proxy” do „kluczy autoryzowanych” na komputerze? Wciąż zamierzam przyjrzeć się potędze openSSH w roli „proxy”, ale jeszcze się z tym nie obejrzałem.
Felipe Alvarez

7

Oczekuje interaktywnego terminala na urządzeniu tty na serwerze pośrednim.

Jeśli wypróbujesz to polecenie, powinno działać:

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

Zobacz man sshza -topcję.


2

Rozwiązałem to, dodając RequestTTY Yes do mojego pliku konfiguracyjnego ssh znajdującego się w ~ / .ssh / config w ten sposób ...

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

1

Możesz użyć opcji PROXY Jump w ssh

-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.

Więc jeśli muszę połączyć się z hostem B, ale najpierw muszę przejść przez hostA, aby się tam dostać. Normalnie bym to zrobił

 ssh hostA
 [user@hostA ~]$ ssh hostB

Teraz to robię

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

0

Możesz zastąpić opcję konfiguracji SSH „RequestTTY” z wiersza poleceń.

Mój działający przykład cd-serv-one.shzaczyna się /bin/bashw sesji SSH po uruchomieniu wielu poleceń:

#!/bin/bash

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

A teraz po prostu biegnę, ./cd-serv-one.shby rozpocząć potrzebną sesję SSH.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.