SSH di dalam SSH gagal dengan "stdin: is not a tty"

58

Saya mencoba untuk terhubung ke mesin satu dengan ssh dan kemudian terhubung ke mesin dua lainnya dengan ssh, tapi saya mendapatkan kesalahan ini.

ssh [email protected] 'ssh [email protected]'

stdin: is not a tty

Mengapa?

Jhonathan
sumber
1
Saya tidak berpikir Anda membutuhkan tanda kutip tunggal sekitar detik ssh!
coffeMug

Jawaban:

70

Secara default, ketika Anda menjalankan perintah pada mesin jarak jauh menggunakan ssh, TTY tidak dialokasikan untuk sesi jarak jauh. Ini memungkinkan Anda mentransfer data biner, dll. Tanpa harus berurusan dengan kebiasaan TTY. Ini adalah lingkungan yang disediakan untuk perintah yang dieksekusi pada computerone.

Namun, ketika Anda menjalankan ssh tanpa perintah jarak jauh, itu TIDAK mengalokasikan TTY, karena Anda cenderung menjalankan sesi shell. Ini diharapkan oleh ssh [email protected]perintah, tetapi karena penjelasan sebelumnya, tidak ada TTY tersedia untuk perintah itu.

Jika Anda ingin shell aktif computertwo, gunakan ini, yang akan memaksa alokasi TTY selama eksekusi jarak jauh:

ssh -t [email protected] 'ssh [email protected]'

Ini biasanya sesuai ketika Anda akhirnya menjalankan shell atau proses interaktif lainnya di akhir rantai ssh. Jika Anda akan mentransfer data, itu tidak tepat atau diperlukan untuk menambahkan -t, tetapi kemudian setiap perintah ssh akan berisi perintah penghasil data atau -konsumen, seperti:

ssh [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'
mrb
sumber
9

Ada cara yang lebih baik untuk menggunakan SSH sebagai relay: gunakan ProxyCommandopsi. Anda harus memiliki kunci pada mesin klien yang memungkinkan Anda masuk ke komputer kedua (kunci publik adalah cara yang disarankan untuk menggunakan SSH dalam sebagian besar keadaan). Masukkan ini ke dalam ~/.ssh/configdan jalankan ssh computertwo.

Host computerone
HostName computerone.com
UserName user

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

ncadalah netcat . Salah satu dari beberapa versi yang tersedia akan dilakukan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Bukankah kita diharuskan untuk menambahkan "proxy" yang berhubungan dengan baris ke 'berwenang_kunci' di computerone? Saya tetap bermaksud untuk melihat kekuatan 'proxy' dari openSSH, tetapi belum sampai sekarang.
Felipe Alvarez
7

Itu mengharapkan terminal interaktif pada perangkat tty di server perantara.

Jika Anda mencoba perintah ini, itu akan berfungsi:

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

Lihat man sshuntuk -tpilihan.

roknir
sumber
2

Saya memecahkan ini dengan menambahkan RequestTTY Ya ke file konfigurasi ssh saya yang terletak di ~ / .ssh / config seperti ini ...

Host myserver.com
  User my-ssh-username
  RequestTTY Yes
John
sumber
1

Anda dapat menggunakan opsi PROXY Jump di 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.

Jadi jika saya perlu terhubung ke hostB tapi saya harus melalui hostA dulu untuk sampai ke sana. Biasanya saya mau

 ssh hostA
 [user@hostA ~]$ ssh hostB

Saya sekarang melakukan ini

ssh -J hostA hostB
[user@hostB ~]$
nelaaro
sumber
0

Anda dapat mengganti opsi konfigurasi SSH "RequestTTY" dari baris perintah.

Contoh kerja saya cd-serv-one.shmulai /bin/bashdalam sesi SSH setelah menjalankan beberapa perintah:

#!/bin/bash

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

Dan sekarang saya hanya menjalankan ./cd-serv-one.shuntuk memulai sesi SSH yang dibutuhkan.

xorDiv
sumber