Linux'ta feshedilinceye kadar bekleyen bir komut var mı?


11

Ben port iletme ile macun / plink başlar, ve başka bir şey bir Windows toplu iş dosyası oluşturmak için çalışıyorum. Windows bölümü şu ana kadar hazır:

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

Kimlik doğrulamasından sonra diğer komutların yürütülmesine izin vermek istemediğim için ForceCommand, bir Match Userbildirimle kullanıyorum :

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

Sorun, toplu iş dosyası çalıştırmak macun doğru başlar, ancak belirtilen metni yankılama yürütüldükten hemen sonra kapanır.

Benim fikrim böyle bir şey kullanmak:

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

Bu şekilde, macun / SSH bağlantıyı canlı tutmalı ve port yönlendirmemden çıkmamalı.

Ben gibi komutların düşünmüşümdür yes, pingya readama

  • terminal penceremi spam yapıyor
  • aslında bir şeyler yapıyor / gereksiz CPU yükü üretiyor
  • Birisi enter tuşuna basarsa beklenmedik bir şekilde kapanabilir

Birisi Ctrl + C ile sonlandırana veya macun penceresini kapatarak SSH bağlantısını kapatana kadar sonsuza dek hiçbir şey yapmayacak bir komut var mı?

Ne için kullanmalıyım waitTillControlC?


Superuser.com/questions/587629/… gibi sorular buldum , ancak kullanıcıyı hazır bir kabukla bırakacaklardı.
stuXnet

Yanıtlar:


13

Diğer tüm yanıtların neden bir döngü kullanmak istediğini anlamıyorum, uyku herhangi bir pratik amaç için yeterince uzun süre bekleyebilir ve bunu yapan hiçbir saat döngüsü kullanmaz.

Örneğin, burada şüpheli bir yüz yıl boyunca uyumaya çalışacak ve muhtemelen isteğe uymak için yeterince yapacak:

echo "Something"; sleep 36500d

Alternatif olarak, siz Enteranahtarı yazana kadar bu da engellenmelidir :

echo "Something"; read foo

9

-NBunun yerine seçeneği deneyin . Gönderen plinkbelgeler :

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

Bu, kılavuz sayfasında açıklanan sshseçenekle aynı davranıştır :-N

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

2
Bu kabul edilen cevap olmalı. Diğerleri bir geçici çözüm nasıl ki, ama bu bir bunu nasıl söyler sağ .
Moshe Katz

Düzenleme için teşekkürler; kontrol etmek için bir Windows kutusu yok, ben on-line plink belgeleri aramayı düşünmüyordu.
chepner

Bu cevap ihtiyaçlarıma uymuyor çünkü I don't want to allow to execute other commands after authentication. -Nbunu istemci tarafında gerçekleştirir, böylece kimlik doğrulamasından sonra diğer komutları çalıştırmak için -N'yi kaldırabilirsiniz.
stuXnet

8

Bu, herhangi bir (fark edilebilir) CPU gücü tüketmeden sonsuza kadar uyumalıdır.

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

Ayrıca ForceCommandmaddede olduğu gibi bir komut verip veremeyeceğinizden de emin değilim . Komutu bir kabuk betiğine koymanız gerekebilir.

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

Bu komut dosyası elbette bir yerde olmalı ve sunucudaki sıradan bir kullanıcının ona yazamaması için izinlere sahip olmalıdır.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

Düzenle

Daha zarif görünen bir komut buldum:

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

tail -fbir dosya veya akışın bayt döndürmesini bekler. (Aksi takdirde günlükleri gerçek zamanlı olarak izlemek için kullanışlıdır.) /dev/nullHiçbir zaman bayt döndürmez. Ve böylece komut sonsuza kadar uyuyacaktır.


Bu anda kendim için bir uyku döngüsü deniyordum - evet, bu kesinlikle işe yarıyor! ForceCommand ile bile doğrudan:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet

tail -f /dev/nullteknik olarak 9999 döngüsünden daha kötüdür. İşlem 2 saat 56 dakikada bir her saniye uyanacaktır.
jlliagre

Ben burada buldum: unix.stackexchange.com/questions/42901/… Bu soruya cevap veren kişi "(bunun dahili olarak inotify kullandığını varsayarsak, yoklama veya uyandırma olmamalı, bu yüzden tuhaf görünmekten başka, yeterli olmalı) "Bu ifade veya kuyruğun inotifyyanlış kullandığı varsayımı mı?
2013

Varsayım doğrudur, mevcut olduğunda tailkaldıracak şekilde optimize edilmiştir inotify. Bu, en son yeterli dağıtımların tümü olmasa da çoğunda varsayılan durum olmalıdır. Ancak, sadece bir Linux dizüstü bilgisayarda test ettim ve tailizleme ile sahte bir etkinlik gözlemledim, /dev/nullbu yüzden saat döngüleri açısından uyku kesinlikle daha kötü.
jlliagre

Bunun tailher saniye uyanacağına inanmıyorum . Sonuç için olası bir sebep, onu tailherhangi bir nedenle iletişim kurabilen bir terminalde çalıştırıyor olmanızdır , ancak sleepolmayacaktır. Sadece izleyerek tailsahte bir şekilde uyanmak için hiçbir neden yoktur . /dev/null
nitro2k01

0

Aşağıdakileri deneyebilirsiniz:

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

1
Gelecekteki ziyaretçiler için bunun nasıl çalıştığının bir özetini sunmalısınız. Birçoğu biliyor olabilir, ancak tüm iradeyi kabul edemezsiniz.
nerdwaller

sleepCPU'da daha uzun süre daha kolay olacak, ancak sleep 1son yirmi yılda inşa edilen her şey için yeterince güvenli olmalı ...
Shadur

:kestirme yoludur true. Ben de sleepprensip dışında daha uzun bir dönemi tercih ederdim .
2013

0

Bunu yanlış sondan çözmeye çalışıyorsunuz. Kabuğun çıkmasını istemiyorsunuz, macunun pencereyi açık bırakmasını istiyorsunuz.

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit - tam olarak neyi değiştirmeniz gerektiğini açıklar. "Yalnızca temiz çıkışta" seçeneğini kullanmak istiyorsanız exit 1, ForceCommand'ın sonuna ekleyin .

Düzenleme: Yanlış anlaşıldım; yalnızca iletilen bağlantı noktalarını korumak istiyorsanız, ForceCommand çıktısını korumak istemezsiniz. Bu durumda, http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshell ne istersen yapmıyor mu?


Sorun, pencerenin kapanması değil, ssh tünelinin kapatılmasıdır. PuTTY'ye pencereyi açık bırakmasını söylemek ssh tünelini de koruyor mu?
Adrian Pronk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.