Làm thế nào để tạo kết nối máy khách vĩnh viễn với netcat?


7

Tôi đang viết một tập lệnh bash liên tục đọc một thư mục trong một vòng lặp để gửi dữ liệu đến máy chủ theo một khoảng thời gian xác định. Tôi đang sử dụng netcat làm công cụ kết nối với máy chủ và gửi dữ liệu. Mã giả của tôi sẽ trông như sau:

while true
do
    read_folder()
    process_data() > result.txt
    cat result.txt > netcat ip port
    wait 10 sec
done

Vấn đề duy nhất của tôi là trong kịch bản máy khách kết nối và ngắt kết nối TCP / IP với máy chủ mỗi lần. Tôi muốn thiết lập kết nối khi bắt đầu tập lệnh và đóng nó ở cuối.

Có cách nào có thể được thực hiện với các công cụ dòng lệnh trong tập lệnh bash không?


Trên thực tế, tôi thích thiết lập hiện tại của bạn. Trong trường hợp kết nối dài, có khả năng mất kết nối lớn hơn. Bằng cách này, trong trường hợp mất kết nối, sẽ tự động thử lại sau 10 giây
bbaja42

Hãy xem socat, đó là một sự thay thế netcat có chức năng tích hợp để hồi sinh các đường ống sau khi chúng đã hoàn thành.
Marcin

Câu trả lời:


3

Hai quy trình riêng biệt: Một quy trình sao chép result.txt sang netcat. Result.txt được cung cấp thông qua một quá trình khác.

echo -n >result.txt
tail -f result.txt | nc ip port &
while true
do
    read_folder()
    process_data() > result.txt
    wait 10 sec
done

Tôi đã nghĩ về một cái gì đó như thế nhưng quá trình đầu tiên sẽ trở lại khi đến cuối tập tin, nó sẽ không chờ quá trình khác để ghi vào nó.
jmbouffard

@jmbouffard: đã sửa. tail -fsẽ tiếp tục đọc tệp ngay cả khi nó đạt EOF.
Kevin M

Cảm ơn nó hoạt động rất tốt với đuôi -f. Tôi thậm chí có thể sử dụng một ống fifo thay vì tệp result.txt "đang phát triển" để chuyển. Trả lời chấp nhận.
jmbouffard

@Kevim: Chỉnh sửa @Gilles được thực hiện bằng cách sử dụng : >result.txttốt, nó không để lại một dòng mới trong tệp. Tự kiểm tra nó.
Caleb

echo -ncũng tốt, miễn là vỏ của bạn hỗ trợ nó (một số in vỏ -n) - vì vậy :tốt hơn (nó hoạt động ở mọi nơi). Và bạn cần tail -c +1; không có nó, nếu tailkhởi động chậm, nó sẽ bỏ qua tất cả trừ 10 dòng những gì đã có trong tệp.
Gilles 'SO- ngừng trở nên xấu xa'

4

Chỉ cần đặt chuyển hướng bên ngoài vòng lặp.

while true; do
    read_folder
    process_data
    sleep 10
done | netcat $ip $port

Nếu bạn cần xuất ra đầu ra tiêu chuẩn của vòng lặp từ bên trong vòng lặp, hãy chuyển hướng nó qua một bộ mô tả tệp khác.

{
  while true; do
      read_folder
      echo tick >&3
      process_data
      sleep 10
  done | netcat $ip $port
} 3>&1
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.