Apakah ada perintah di Linux yang menunggu hingga akan diakhiri?

11

Saya mencoba untuk membangun file batch Windows, yang mulai putty / plink dengan port forwarding, dan tidak ada yang lain. Bagian Windows siap sejauh ini:

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

Karena saya tidak ingin mengizinkan untuk mengeksekusi perintah lain setelah otentikasi, saya menggunakan ForceCommanddengan Match Userdeklarasi:

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

Masalahnya, menjalankan file batch saya mulai dempul dengan benar, tetapi menutup segera setelah mengeksekusi gema teks yang saya tentukan.

Ide saya adalah menggunakan sesuatu seperti ini:

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

Dengan cara ini, putty / SSH harus menjaga koneksi tetap hidup dan tidak keluar dari port forwarding saya.

Saya sudah memikirkan perintah seperti yes, pingatau read, tetapi mereka

  • mengirim spam ke jendela terminal saya
  • sebenarnya melakukan hal-hal / menghasilkan beban CPU yang tidak perlu
  • bisa menutup secara tak terduga, jika seseorang menekan masuk

Apakah ada perintah yang tidak akan melakukan apa pun, selamanya, sampai seseorang mengakhiri dengan Ctrl + C atau menutup koneksi SSH dengan menutup jendela dempul?

Apa yang harus saya gunakan waitTillControlC?

stuXnet
sumber
Saya menemukan pertanyaan seperti superuser.com/questions/587629/… , tetapi mereka akan meninggalkan pengguna dengan shell yang siap.
stuXnet

Jawaban:

13

Saya tidak mengerti mengapa semua balasan lainnya ingin menggunakan loop di sini, tidur dapat menunggu cukup lama untuk tujuan praktis dan tidak akan menggunakan siklus clock melakukannya.

Misalnya, ia akan mencoba tidur selama 100 tahun yang meragukan dan kemungkinan akan melakukannya cukup untuk memenuhi permintaan:

echo "Something"; sleep 36500d

Atau, ini juga harus diblokir hingga Anda mengetikkan Enterkunci:

echo "Something"; read foo
Jlliagre
sumber
9

Coba -Nopsi tersebut. Dari plinkdokumentasi :

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

Ini adalah perilaku yang sama dengan sshopsi -N, seperti yang dijelaskan dalam halaman manual :

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).
chepner
sumber
2
Ini harus menjadi jawaban yang diterima. Yang lain mengatakan bagaimana membuat solusi, tetapi yang ini mengatakan bagaimana melakukannya dengan benar .
Moshe Katz
Terima kasih atas hasil editnya; tidak memiliki kotak Windows untuk memeriksa, saya tidak berpikir untuk mencari dokumen plink on-line.
chepner
Jawaban ini tidak sesuai dengan kebutuhan saya, karena I don't want to allow to execute other commands after authentication. -Nakan melakukan ini di sisi klien, jadi Anda bisa menghapus -N untuk menjalankan perintah lain setelah otentikasi.
stuXnet
8

Ini harus tidur selamanya tanpa mengkonsumsi jumlah daya CPU (nyata).

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

Saya juga tidak yakin apakah Anda dapat memberikan perintah seperti dalam ForceCommandklausa. Anda mungkin perlu memasukkan perintah ke skrip shell.

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

Skrip ini tentu saja harus ada di tempat dan memiliki izin sehingga tidak ada pengguna biasa di server yang dapat menulisnya.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

Edit

Saya telah menemukan perintah yang tampaknya lebih elegan:

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

tail -fmenunggu file atau streaming untuk mengembalikan byte. (Jika tidak berguna untuk menonton log secara realtime.) Tidak /dev/nullakan pernah mengembalikan byte. Maka perintah itu akan tidur selamanya.

nitro2k01
sumber
Pada saat ini, saya sedang mencoba lingkaran tidur untuk diri saya sendiri - ya, ini pasti bekerja! Bahkan secara langsung dengan ForceCommand:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet
tail -f /dev/nullsecara teknis lebih buruk daripada loop 9999. Prosesnya akan bangun setiap detik alih-alih setiap 2 jam dan 56 menit.
jlliagre
Saya menemukannya di sini: unix.stackexchange.com/questions/42901/... Orang yang menjawab pertanyaan itu mengklaim "(dengan anggapan ini menggunakan inotify secara internal, seharusnya tidak ada polling atau bangun, jadi selain terlihat aneh, itu harus cukup) "Apakah pernyataan ini atau asumsi yang digunakan ekor inotifysalah?
nitro2k01
Asumsinya benar, taildioptimalkan untuk memanfaatkan inotifyketika tersedia. Ini harus menjadi kasus default dengan sebagian besar atau tidak semua distribusi yang cukup baru. Namun, saya hanya menguji pada laptop Linux dan mengamati aktivitas palsu dengan tailpemantauan /dev/nullsehingga tentu saja lebih buruk dari itu dalam hal siklus clock.
jlliagre
Saya tidak percaya itu tailakan selalu bangun setiap detik. Alasan yang memungkinkan untuk hasilnya adalah Anda menjalankannya di terminal yang mungkin berkomunikasi dengan tailalasan apa pun, sedangkan sleeptidak. Tidak ada alasan mengapa tailharus bangun hanya pemantauan /dev/null.
nitro2k01
0

Anda bisa mencoba yang berikut ini:

echo "your commands" && while :; do sleep 1; done
pengguna2783132
sumber
1
Untuk pengunjung yang akan datang, Anda harus memberikan ringkasan cara kerjanya. Banyak yang mungkin tahu, tetapi Anda tidak bisa menganggap semua akan.
nerdwaller
sleepPeriode yang lebih lama akan lebih mudah pada CPU, meskipun bahkan sleep 1harus cukup aman pada apa pun yang dibangun dalam dua dekade terakhir ...
Shadur
:adalah singkatan untuk true. Saya juga lebih suka sleepperiode yang lebih lama dari prinsip.
nitro2k01
0

Anda mencoba menyelesaikan ini dari ujung yang salah. Anda tidak ingin shell tidak keluar, Anda ingin dempul membiarkan jendela terbuka.

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit - menjelaskan dengan tepat apa yang perlu Anda ubah. Jika Anda ingin menggunakan opsi "only on clean exit", tambahkan saja exit 1di akhir ForceCommand.

Sunting: Saya salah paham; Anda hanya ingin mempertahankan port yang diteruskan, Anda tidak ingin menjaga output dari ForceCommand. Dalam hal ini, apakah http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshell melakukan apa yang Anda inginkan?

Gabe
sumber
Masalahnya bukan bahwa jendela ditutup tetapi terowongan ssh dimatikan. Apakah menyuruh Putty untuk membiarkan jendela tetap terbuka juga menjaga ssh tunnel?
Adrian Pronk