Làm cách nào tôi có thể tạo kết nối SSH liên tục với các lệnh của Stream Stream trong một khoảng thời gian?


9

Giả sử tôi có một ứng dụng chạy trên một PC đang gửi lệnh qua SSH đến một PC khác trên mạng (cả hai máy chạy Linux).

Ví dụ, mỗi khi có điều gì đó xảy ra ở # 1, tôi muốn chạy một nhiệm vụ trên # 2. Trong thiết lập này, tôi phải tạo kết nối SSH trên mỗi lệnh.

Có cách nào đơn giản để làm điều này với các công cụ unix cơ bản mà không cần lập trình ứng dụng máy khách / máy chủ tùy chỉnh không? Về cơ bản, tất cả những gì tôi muốn là thiết lập kết nối qua SSH và sau đó gửi một lệnh khác.


Câu trả lời:


12

Không chắc chắn nếu nó có thể được sử dụng trong sản xuất nhưng bạn có thể làm một cái gì đó như thế này:

tạo tập tin trên # 1

1> touch /tmp/commands

Sau đó chạy lệnh:

1> tail -f /tmp/commands | ssh username@x.x.x.x

Điều đó sẽ mở tệp / tmp / lệnh và bắt đầu gửi nội dung của nó đến máy chủ xxxx (# 2) và chạy nó ở đó theo từng dòng

Bây giờ, mỗi khi có điều gì đó xảy ra trên # 1 hãy làm:

1> echo "ls -l" >> /tmp/commands

hoặc là

1> echo "reboot" >> /tmp/commands

bất cứ điều gì bạn thêm vào tập tin / tmp / lệnh sẽ được gửi đến # 2 và được thực thi. Chỉ cần đảm bảo rằng bạn không chạy bất cứ thứ gì tương tác, hoặc đối phó với nó bằng cách nào đó.


Đây chính xác là những gì tôi đang tìm kiếm, giải pháp rất sáng tạo :)
Jakub Arnold

5
Tôi muốn thêm rằng bạn nên sử dụng tail -F, nó sẽ phát hiện ra rằng tệp đã được thay thế, vì vậy khi nó trở nên khổng lồ, bạn có thể xóa nó và bắt đầu lại với một tệp mới.
DerfK

3
@DerfK, thay vào đó, mkfifo /tmp/commandsnên là một giải pháp tốt hơn
solotim


18

Tự động kiên trì sử dụng OpenSSH

Bạn cũng có thể sử dụng ControlMastertính năng của OpenSSH, mở ổ cắm miền unix cho kết nối đầu tiên và sử dụng lại kết nối này trong tất cả các cuộc gọi tiếp theo.

Để bật tính năng này, bạn có thể sử dụng -Mlàm công tắc dòng lệnh hoặc bật ControlMastertùy chọn trong ~/.ssh/ssh_config, ví dụ:

ControlMaster auto

Ngoài ra, bạn nên đặt ControlPathsử dụng các dòng sau trong ~/.ssh/ssh_config:

Host *
   ControlPath ~/.ssh/master-%r@%h:%p

Để duy trì kết nối liên tục đến máy chủ, ví dụ: nếu bạn muốn chạy tập lệnh cần thiết lập nhiều kết nối ssh với máy chủ, không có kết nối nào trong suốt thời gian tồn tại của tập lệnh, bạn có thể bắt đầu kết nối im lặng trước bằng cách sử dụng:

ssh -MNf remotehost

Cheerio, nesono


Tôi đã đăng nhập vào lỗi máy chủ chỉ để +1 bình chọn câu trả lời của bạn. Bạn đã làm việc!
Karma

ssh -Nbắt đầu một phiên không có lệnh từ xa, dường như không có tùy chọn tương ứng trong ssh_config.
Jokester

2

trong /etc/ssh/ssh_configadd

# Send keep alive signal to remote sshd
ServerAliveInterval 60

2

Nếu bạn gặp phải điều này rất nhiều, hãy thử Parallel . Nó giống như dsh (vỏ phân tán) nhưng có một số tính năng gọn gàng như đếm semaphores và nó được duy trì tích cực.

Từ tài liệu:

VÍ DỤ: GNU Song song là hệ thống xếp hàng / quản lý lô

GNU Parallel có thể hoạt động như một hệ thống hàng đợi công việc đơn giản hoặc trình quản lý hàng loạt. Ý tưởng là đặt các công việc vào một tệp và đọc GNU Parallel liên tục. Vì GNU Parallel sẽ dừng ở cuối tệp, chúng tôi sử dụng đuôi để tiếp tục đọc:

echo >jobqueue; tail -f jobqueue | parallel

Để gửi công việc của bạn đến hàng đợi:

echo my_command my_arg >> jobqueue

Tất nhiên bạn có thể sử dụng -S để phân phối công việc cho các máy tính từ xa:

echo >jobqueue; tail -f jobqueue | parallel -S ..

Có rất nhiều ví dụ tuyệt vời chỉ làm trầy xước bề mặt. Đây là một trong những mát mẻ.

VÍ DỤ: Phân phối công việc cho các máy tính cục bộ và từ xa

Chuyển đổi * .mp3 thành * .ogg chạy một tiến trình trên mỗi lõi CPU trên máy tính cục bộ và máy chủ2:

  parallel --trc {.}.ogg -j+0 -S server2,: \
  'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3

0

vâng, điều đó là có thể với một đường ống:

echo 'echo "hi"' | ssh -i my_private_key tester@host2

điều này sẽ thực thi lệnh echo "hi" trên host2

bạn chỉ cần viết một chương trình, chỉ cần đưa ra các lệnh (đừng quên;) và sau đó chuyển đầu ra sang ssh


0

Bạn có thể muốn sử dụng chương trình như dsh (Phân phối SHell) được tạo để làm việc đó :), Sau khi định cấu hình nó với tên máy chủ và thiết lập công khai autkey, bạn có thể sử dụng nó để chạy các lệnh trên nhiều máy trong chuỗi ("chạy trên máy a sau đó chạy trên máy b ") hoặc trong pararell (" chạy trên tất cả các máy cùng một lúc "). Hoặc chỉ làm kịch bản

#!/bin/sh
ssh machine -- $@
exec $@

0

TUYÊN BỐ TỪ CHỐI: Tôi không thể kiểm tra điều này ngay bây giờ, vì tôi đang sử dụng máy windows nhưng không có ssh.

Trong một tập lệnh bash, bạn có thể làm một cái gì đó như thế này:

exec 4> >(ssh --ssh-options-here user@host)

Và sau đó để gửi lệnh, viết chúng cho FD 4.

echo 'echo hi' >&4

Nếu bạn làm theo cách này, bạn không thể dễ dàng truy cập vào kết quả của các lệnh, nhưng dựa trên câu hỏi của bạn, có vẻ như bạn không cần phải làm vậy.

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.