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 [email protected] 'ssh [email protected]'

stdin: is not a tty

Dlaczego?

Jhonathan
źródło
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 [email protected]polecenie, 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 [email protected] 'ssh [email protected]'

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 [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'
mrb
źródło
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.

Gilles „SO- przestań być zły”
źródło
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ę.

roknir
źródło
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
Jan
źródło
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 ~]$
nelaaro
źródło
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.

xorDiv
źródło