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 user@computerone.com 'ssh otheruser@computertwo.com'

stdin: is not a tty

Mengapa?


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 otheruser@computertwo.comperintah, 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 user@computerone.com 'ssh otheruser@computertwo.com'

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 user@computerone.com 'ssh otheruser@computertwo.com "cat /boot/vmlinuz"'

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.


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.


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

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 ~]$

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.