Có một lệnh trong Linux chờ cho đến khi nó sẽ bị chấm dứt?


11

Tôi đang cố gắng xây dựng một tệp bó Windows, bắt đầu putty / plink với chuyển tiếp cổng và không có gì khác. Phần Windows đã sẵn sàng cho đến nay:

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 sampleUser@192.168.0.1

Vì tôi không muốn cho phép thực thi các lệnh khác sau khi xác thực, tôi đang sử dụng ForceCommandvới một Match Userkhai báo:

Match User sampleUser
    ForceCommand echo 'Success! Close this window to log out.'

Vấn đề là, chạy tệp bó của tôi bắt đầu putty một cách chính xác, nhưng nó sẽ đóng ngay lập tức sau khi thực hiện lặp lại văn bản được chỉ định của tôi.

Ý tưởng của tôi là sử dụng một cái gì đó như thế này:

ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC

Bằng cách này, putty / SSH sẽ duy trì kết nối và không thoát khỏi chuyển tiếp cổng của tôi.

Tôi đã nghĩ về các lệnh như yes, pinghoặc read, nhưng chúng

  • đang spam cửa sổ thiết bị đầu cuối của tôi
  • đang thực sự làm công cụ / tạo tải CPU không cần thiết
  • có thể đóng bất ngờ, nếu ai đó nhấn enter

Có một lệnh sẽ không làm gì, mãi mãi, cho đến khi ai đó chấm dứt nó bằng Ctrl + C hoặc đóng kết nối SSH bằng cách đóng cửa sổ putty?

Tôi nên sử dụng để làm waitTillControlCgì?


Tôi đã tìm thấy các câu hỏi như superuser.com/questions/587629/ , nhưng chúng sẽ khiến người dùng có vỏ sẵn sàng.
stuXnet

Câu trả lời:


13

Tôi không hiểu tại sao tất cả các câu trả lời khác muốn sử dụng một vòng lặp ở đây, giấc ngủ có thể chờ đủ lâu cho bất kỳ mục đích thực tế nào và sẽ không sử dụng chu kỳ đồng hồ để thực hiện.

Ví dụ, nó sẽ cố gắng ngủ ở đây trong một trăm năm đáng ngờ và có khả năng sẽ làm điều đó đủ để tuân thủ yêu cầu:

echo "Something"; sleep 36500d

Ngoài ra, điều này cũng sẽ chặn cho đến khi bạn nhập Enterkhóa:

echo "Something"; read foo

9

Hãy thử -Ntùy chọn thay thế. Từ plinktài liệu :

-N        don't start a shell/command (SSH-2 only)

Đây là hành vi tương tự như sshtùy chọn -N, như được mô tả trong trang man :

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).

2
Đây phải là câu trả lời được chấp nhận. Những người khác nói làm thế nào để giải quyết, nhưng điều này nói làm thế nào để làm điều đó đúng .
Moshe Katz

Cảm ơn đã chỉnh sửa; không có hộp Windows để kiểm tra, tôi không nghĩ sẽ tìm tài liệu plink trên mạng.
chepner

Câu trả lời này không phù hợp với nhu cầu của tôi, bởi vì I don't want to allow to execute other commands after authentication. -Nsẽ thực hiện điều này ở phía máy khách, vì vậy bạn chỉ cần xóa -N để thực thi các lệnh khác sau khi xác thực.
stuXnet

8

Điều này sẽ ngủ mãi mà không tiêu tốn bất kỳ lượng CPU nào (đáng chú ý).

echo "Something" && while true; do sleep 9999; done

Tôi cũng không chắc liệu bạn có thể đưa ra một lệnh như trong ForceCommandmệnh đề hay không. Bạn có thể cần phải đặt lệnh trong một kịch bản shell.

#!/usr/bin/env bash
echo "Success! Close this window to log out." && while true; do sleep 9999; done

Kịch bản này tất nhiên phải ở một nơi và có quyền sao cho không người dùng bình thường nào trên máy chủ có thể ghi vào nó.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

Biên tập

Tôi đã tìm thấy một lệnh có vẻ thanh lịch hơn:

echo "Something" && tail -f /dev/null

tail -fchờ đợi một tập tin hoặc luồng để trả về byte. (Mặt khác hữu ích để xem nhật ký trong thời gian thực.) /dev/nullSẽ không bao giờ trả về byte. Và thế là mệnh lệnh sẽ ngủ mãi.


Trong lúc này, tôi đã thử một vòng lặp ngủ cho chính mình - vâng, điều này chắc chắn hoạt động! Thậm chí trực tiếp với ForceCommand:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet

tail -f /dev/nulllà kỹ thuật tồi tệ hơn so với vòng lặp 9999. Quá trình sẽ thức dậy mỗi giây thay vì cứ sau 2 giờ 56 phút.
jlliagre

Tôi đã tìm thấy nó ở đây: unix.stackexchange.com/questions/42901/ nam Người trả lời câu hỏi đó "(giả sử điều này sử dụng inotify trong nội bộ, không nên bỏ phiếu hoặc đánh thức, vì vậy ngoài việc tìm kiếm kỳ quặc, nó là đủ) "Đây là tuyên bố hay giả định rằng đuôi sử dụng inotifykhông chính xác?
nitro2k01

Giả định là chính xác, tailđược tối ưu hóa để tận dụng inotifykhi có sẵn. Đây phải là trường hợp mặc định với hầu hết nếu không phải tất cả các bản phân phối đủ gần đây. Tuy nhiên, tôi vừa thử nghiệm trên một máy tính xách tay Linux và quan sát hoạt động giả bằng cách tailtheo dõi /dev/nullđể chắc chắn rằng giấc ngủ theo chu kỳ đồng hồ sẽ tệ hơn.
jlliagre

Tôi không tin rằng tailsẽ luôn thức dậy mỗi giây. Một lý do có thể dẫn đến kết quả là bạn đang chạy nó trong một thiết bị đầu cuối có thể liên lạc với tailbất kỳ lý do gì, trong khi đó sleepthì không. Không có lý do tại sao tailnên thức dậy một cách giả tạo chỉ cần theo dõi /dev/null.
nitro2k01

0

Bạn chỉ có thể thử như sau:

echo "your commands" && while :; do sleep 1; done

1
Đối với khách truy cập trong tương lai, bạn nên cung cấp một bản tóm tắt về cách thức này hoạt động. Nhiều người có thể biết, nhưng bạn không thể giả sử tất cả sẽ.
nerdwaller

sleepThời gian dài hơn sẽ dễ dàng hơn trên CPU, mặc dù thậm chí sleep 1phải đủ an toàn cho mọi thứ được xây dựng trong hai thập kỷ qua ...
Shadur

:là một tốc ký cho true. Tôi cũng thích một sleepkhoảng thời gian dài hơn ngoài nguyên tắc.
nitro2k01

0

Bạn đang cố gắng giải quyết điều này từ kết thúc sai. Bạn không muốn shell không thoát ra, bạn muốn putty để cửa sổ mở.

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Ch Module4.html # config - closeonexit - mô tả chính xác những gì bạn cần thay đổi. Nếu bạn muốn sử dụng tùy chọn "chỉ khi thoát sạch", chỉ cần thêm exit 1vào cuối ForceCommand.

Chỉnh sửa: Tôi hiểu lầm; bạn chỉ muốn duy trì các cổng được chuyển tiếp, bạn không muốn giữ đầu ra của ForceCommand. Trong trường hợp đó, không http://tartarus.org/~simon/putty-snapshots/htmldoc/Ch CHƯƠNG4.html # config-ssh-noshell làm những gì bạn muốn?


Vấn đề không phải là cửa sổ đóng mà là đường hầm ssh bị tắt. Có phải nói với PuTTY để mở cửa sổ cũng duy trì đường hầm ssh?
Adrian Pronk
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.