tra-loi-cau-hoi-phat-trien-web.com

SSH bên trong SSH thất bại với "stdin: không phải là một tty"

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

stdin: is not a tty

Tại sao?

62
Jhonathan

Theo mặc định, khi bạn chạy một lệnh trên máy từ xa bằng ssh, một TTY không được phân bổ 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 lệnh ssh [email protected], Nhưng vì giải thích trước đó, không có TTY cho lệnh đó.

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

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

Đ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, việc thêm -t Không thích hợp cũng không bắt buộc, nhưng sau đó mọi lệnh ssh sẽ chứa lệnh tạo dữ liệu hoặc tạo ra dữ liệu, như:

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

Có một cách tốt hơn để sử dụng SSH làm chuyển tiếp: sử dụng tùy chọn ProxyCommand. 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 vào ~/.ssh/config Và chạy ssh computertwo.

Host computerone
HostName computerone.com
User user

Host computertwo
HostName computertwo.com
User 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.

Nó đang 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 [email protected] -t "ssh [email protected]"

Xem man ssh cho -t Lựa chọn.

7
roknir

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
3
John

Bạn có thể sử dụng tùy chọn PROXY Jump trong ssh

-J [[email protected]]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
 [[email protected] ~]$ ssh hostB

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

ssh -J hostA hostB
[[email protected] ~]$

Bạn thậm chí có thể , tách nhiều máy chủ

ssh -J hostA,hostB hostC
[[email protected]]

Đơn giản hơn nhiều so với thử -t để chạy lại lệnh ssh.

2
nelaaro

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.sh bắt đầu /bin/bash trong phiên SSH sau khi chạy nhiều lệnh:

#!/bin/bash

ssh -o "requestTTY=yes" [email protected] "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.

0
xorDiv