SSH içindeki SSH “stdin: tty değil” ile başarısız oluyor


58

Makineye ssh ile bağlanmaya çalışıyorum ve ardından ssh ile başka bir makineye bağlanıyorum, ancak bu hatayı alıyorum.

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

stdin: is not a tty

Neden?


1
Sanırım bu tek tırnaktan ikincisine ihtiyacın yok ssh!
coffeMug

Yanıtlar:


70

Varsayılan olarak, uzak makinede ssh kullanarak bir komut çalıştırdığınızda , uzak oturum için bir TTY ayrılmaz . Bu, TTY tuhaflıklarıyla uğraşmak zorunda kalmadan ikili verileri vb. Aktarmanıza olanak tanır. Bu, üzerinde yürütülen komut için sağlanan ortamdır computerone.

Bununla birlikte, ssh komutunu uzak bir komut olmadan çalıştırdığınızda, bir TTY tahsis eder, çünkü bir kabuk oturumunu çalıştırıyor olabilirsiniz. Bu ssh otheruser@computertwo.comkomut tarafından bekleniyor , ancak önceki açıklama nedeniyle, bu komut için TTY yok.

Bir kabuk istiyorsanız computertwo, bunun yerine, uzaktan çalıştırma sırasında TTY tahsisatını zorlayacak:

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

Bu genellikle sonunda ssh zincirinin sonunda bir kabuk veya başka bir etkileşimli işlem gerçekleştiriyorsanız uygundur. Verileri transfer edecekseniz, ne uygun ne de eklemek zorunda değildir -t, ancak daha sonra her ssh komutu aşağıdaki gibi bir veri üreten veya tüketen komut içerecektir:

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

9

SSH'yi röle olarak kullanmanın daha iyi bir yolu var: ProxyCommandseçeneği kullanın. İstemci makinede ikinci bilgisayara oturum açmanıza izin veren bir anahtarınızın olması gerekir (genel anahtar, yine de çoğu durumda SSH kullanmanın önerilen yoludur). Bunu içine koy ~/.ssh/configve koş ssh computertwo.

Host computerone
HostName computerone.com
UserName user

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

ncolduğu netcat'in . Mevcut çeşitli sürümlerden herhangi biri yapacaktır.


"Proxy" ile ilişkili bir satırı "computerone" üzerindeki "yetkili_ anahtarlar" a eklememiz gerekmiyor mu? OpenSSH'nin 'vekili' gücüne bakmak için anlam taşıyorum, ancak henüz tam anlamıyla anlaşamadım.
Felipe Alvarez

7

Ara sunucudaki bir tty cihazında etkileşimli bir terminal bekliyor.

Bu komutu denerseniz, çalışması gerekir:

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

Seçenek man sshiçin bakınız -t.


2

Bunu ~ / .ssh / config dizininde bulunan ssh config dosyama RequestTTY Yes ekleyerek çözdüm ...

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

1

Ssh içindeki PROXY Jump seçeneğini kullanabilirsiniz.

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

Eğer hostB'ye bağlanmam gerekiyorsa, oraya ulaşmak için önce hostA'dan geçmem gerekiyor. Normalde

 ssh hostA
 [user@hostA ~]$ ssh hostB

Şimdi bunu yapıyorum

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

0

Bir SSH yapılandırma seçeneğini "RequestTTY" komut satırından geçersiz kılabilirsiniz.

Çalışma örneğim birden çok komut çalıştırdıktan sonra SSH oturumunda cd-serv-one.shbaşlar /bin/bash:

#!/bin/bash

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

Ve şimdi sadece ./cd-serv-one.shgerekli bir SSH oturumu başlatmak için koşuyorum .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.