Sử dụng kênh SSH đã được thiết lập


50

Tôi có một kết nối ssh đã được thiết lập giữa hai máy.

Có cách nào để gửi lệnh đến máy từ xa từ tập lệnh shell được chạy trên máy cục bộ, sử dụng kết nối đã mở và không bắt đầu phiên ssh khác không?

Câu trả lời:


56

Rất đơn giản với các phiên bản OpenSSH đủ gần đây nếu bạn lên kế hoạch trước.

Mở kết nối chính lần đầu tiên. Đối với các kết nối tiếp theo, định tuyến các kết nối nô lệ thông qua kết nối chính hiện có. Trong của bạn ~/.ssh/config, thiết lập chia sẻ kết nối sẽ tự động xảy ra:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Nếu bạn bắt đầu một phiên ssh đến cùng (người dùng, cổng, máy) như một kết nối hiện có, phiên thứ hai sẽ được chuyển qua phiên thứ nhất. Thiết lập kết nối thứ hai không yêu cầu xác thực mới và rất nhanh.


Có vẻ như cái thứ hai sẽ không được đăng ký trong / var / log / safe hoặc /var/log/auth.log. Tuy nhiên, cái thứ hai sẽ được đăng ký trong / var / log / wtmp chứ?
SOUser

@XichenLi /var/log/secure/var/log/auth.logđăng nhập kết nối SSH; một kết nối nô lệ không xuất hiện ở đó vì nó cõng trên một kết nối hiện có. Nếu phiên ssh của bạn phân bổ một thiết bị đầu cuối (nghĩa là ssh somehostkhông có lệnh được cung cấp, hoặc ssh -t), nghĩa là (thông thường) đã đăng nhập wtmp, bất kể thiết bị đầu cuối đó xuất hiện như thế nào (sshd, bất kỳ phương thức nào đã được sử dụng để thiết lập kết nối, ứng dụng trình giả lập thiết bị đầu cuối, bù).
Gilles 'SO- ngừng trở nên xấu xa'

2
Bạn cũng có thể sử dụng ControlPersist 600độ trễ trong vài giây của ổ cắm ở chế độ chờ trước khi nó tự động bị xóa. Nếu không, nó sẽ tự động đóng lại khi kết nối chính kết thúc. Điều đó không tốt cho việc thực thi một loạt các lệnh từ xa (ví dụ: một loạt các lệnh rsync đến các thư mục khác nhau)

2
Nếu bạn không muốn chỉnh sửa cấu hình toàn cầu, bạn cũng có thể sử dụng các tùy chọn -S(chỉ định ổ cắm) và -M(tạo kết nối chính) của máy khách SSH.
yankee

22

Điều đó khá dễ dàng để đạt được bằng cách sử dụng công cụ nc và đường hầm ssh.

1. Mở đường hầm ssh

Trong phiên ssh của bạn, gõ ~Cvào một dòng mới. Bạn sẽ nhận được lời nhắc "bảng điều khiển dịch vụ" ssh trông như thế này:

ssh> 

Nhập lệnh chuyển tiếp cục bộ để mở đường hầm ssh:

ssh> -L22000:targethost:22001
Forwarding port.

Tên targethostmáy chủ hoặc địa chỉ IP của máy bạn được kết nối ở đâu.

Bây giờ, giả sử máy chủ ssh trên máy đích không được cấu hình để cấm các đường hầm, bạn có chuyển tiếp kết nối mong muốn: sshmáy khách trên máy của bạn lắng nghe cổng 22000 và nó sẽ chuyển tiếp bất kỳ lưu lượng nào được gửi đến cổng 22001 trên targethost.

2. Khởi động máy chủ mạng trên máy từ xa

Điều này đơn giản như việc nhập vào phiên ssh đã mở của bạn bằng lệnh sau:

remote$ nc -l localhost 22001 | sh

Điều này sẽ khởi động máy chủ TCP lắng nghe trên cổng 22001 - là cổng đích của đường hầm ssh của chúng tôi - và định tuyến dữ liệu nhận được (có lẽ là các lệnh shell) đến một targethostthể hiện shell.

3. Gửi tập lệnh của bạn qua đường hầm

local$ cat yourscript.sh | nc localhost 22000

Điều này sẽ gửi phần thân của tập lệnh đến đường hầm ssh của bạn và cuối cùng sẽ được thực thi trong một trình bao trên targethost. Bạn sẽ thấy đầu ra của tập lệnh trong thiết bị đầu cuối của bạn với phiên ssh.


Tôi cũng sẽ lưu ý rằng đường hầm ssh (bước 1.) trong kịch bản này không bắt buộc; bạn cũng có thể khởi động máy chủ mở và kết nối trực tiếp với nó qua internet. Tuy nhiên, bạn sẽ cần sử dụng đường hầm nếu máy chủ đích không thể truy cập trực tiếp (ví dụ: phía sau NAT) hoặc mã hóa ssh là mong muốn.


3
Câu trả lời chính xác. Về mặt kỹ thuật, để đến bảng điều khiển dịch vụ, ~nhân vật phải đến sau một dòng mới, vì vậy LF ~ Ccó lẽ là một chuỗi tốt hơn.
Alexios

@Alexios, đúng rồi.
ulidtko

Thủ thuật tuyệt vời! Đối với bản ghi, trang ssh man hiển thị thêm một số thông tin về nó (cuộn xuống phần có tên "ĐẶC ĐIỂM ESCAPE")
Carles Sala

@CarlesSala cũng tốt để biết rằng less, máy nhắn tin mặc định phổ biến, hỗ trợ tìm kiếm có thể giúp bạn tiết kiệm một số cuộn nếu bạn biết từ khóa của mình: chỉ cần gõ man ssh /ESCAPEvà bạn đang ở đó.
ulidtko

@ulidtko chắc chắn, nhưng theo tôi biết, người ta không thể liên kết một lệnh CLI với một bình luận SO, vì vậy tôi thấy trang man html là một lựa chọn tốt hơn ;-)
Carles Sala
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.