SSH bên trong SSH không thành công với Hard stdin: không phải là một tty


58

Tôi đang cố gắng kết nối với máy một bằng ssh và sau đó kết nối với máy hai khác bằng ssh, nhưng tôi gặp lỗi này.

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

stdin: is not a tty

Tại sao?


1
Tôi không nghĩ rằng bạn cần những trích dẫn duy nhất vào khoảng thứ hai ssh!
coffeMug

Câu trả lời:


70

Theo mặc định, khi bạn chạy một lệnh trên máy từ xa bằng ssh, TTY không được cấp phát cho phiên từ xa. Điều này cho phép bạn chuyển dữ liệu nhị phân, vv mà không phải đối phó với các yêu cầu TTY. Đây là môi trường được cung cấp cho lệnh được thực thi trên computerone.

Tuy nhiên, khi bạn chạy ssh mà không có lệnh từ xa, nó KHÔNG phân bổ TTY, vì bạn có thể đang chạy phiên shell. Điều này được mong đợi bởi ssh otheruser@computertwo.comlệnh, nhưng vì lời giải thích trước đó, không có TTY cho lệnh đó.

Nếu bạn muốn bật shell computertwo, sử dụng cái này thay vào đó, nó sẽ buộc phân bổ TTY trong khi thực hiện từ xa:

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

Điều này thường thích hợp khi cuối cùng bạn đang chạy shell hoặc quá trình tương tác khác ở cuối chuỗi ssh. Nếu bạn định chuyển dữ liệu, thì không cần thiết cũng không cần phải thêm -t, nhưng sau đó mọi lệnh ssh sẽ chứa lệnh tạo dữ liệu hoặc phát hiện dữ liệu, như:

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

9

Có một cách tốt hơn để sử dụng SSH làm chuyển tiếp: sử dụng ProxyCommandtùy chọn. Bạn sẽ cần phải có một khóa trên máy khách cho phép bạn đăng nhập vào máy tính thứ hai (khóa chung là cách sử dụng SSH được khuyến nghị trong hầu hết các trường hợp). Đặt cái này trong của bạn ~/.ssh/configvà chạy ssh computertwo.

Host computerone
HostName computerone.com
UserName user

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

ncnetcat . Bất kỳ một số phiên bản có sẵn sẽ làm.


Không phải chúng tôi bắt buộc phải thêm một dòng liên quan đến "proxy" vào 'ủy quyền_key' trên máy tính sao? Tôi giữ ý nghĩa để xem xét sức mạnh 'proxy' của openSSH, nhưng vẫn chưa có được nó.
Felipe Alvarez

7

Nó mong đợi một thiết bị đầu cuối tương tác trên một thiết bị tty trên máy chủ trung gian.

Nếu bạn thử lệnh này, nó sẽ hoạt động:

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

Xem man sshcho các -ttùy chọn.


2

Tôi đã giải quyết vấn đề này bằng cách thêm RequestTTY Có vào tệp cấu hình ssh của tôi nằm ở ~ / .ssh / config như thế này ...

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

1

Bạn có thể sử dụng tùy chọn PROXY Jump trong 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.

Vì vậy, nếu tôi cần kết nối với hostB nhưng trước tiên tôi phải thông qua hostA để đến đó. Thông thường tôi sẽ

 ssh hostA
 [user@hostA ~]$ ssh hostB

Bây giờ tôi làm điều này

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

0

Bạn có thể ghi đè tùy chọn cấu hình SSH "RequestTTY" từ dòng lệnh.

Ví dụ làm việc của tôi cd-serv-one.shbắt đầu /bin/bashtrong phiên SSH sau khi chạy nhiều lệnh:

#!/bin/bash

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

Và bây giờ tôi chỉ chạy ./cd-serv-one.shđể bắt đầu một phiên SSH cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.