Câu trả lời:
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.com
lệ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"'
Có một cách tốt hơn để sử dụng SSH làm chuyển tiếp: sử dụng ProxyCommand
tù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/config
và 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
nc
là netcat . Bất kỳ một số phiên bản có sẵn sẽ làm.
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 ~]$
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" 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.
ssh
!