-F seçeneğiyle başlayan SSH oturumunu nasıl öldürebilirim (arka planda çalıştır)


50

Bu konuda oldukça kayboldum. Man sayfasından:

 -f      Requests ssh to go to background just before command execution.

Bu -fseçenekle SSH'yi başlattıktan sonra çalışan bir tünelim var. Ancak kullanmayı bitirdikten sonra, onunla daha fazla etkileşime geçeceğimi bilmiyorum. Örneğin, bitirdiğimde SSH tünelini kapatamıyorum .

Bildiğim genel yöntemler işe yaramıyor. Örneğin, jobshiçbir şey döndürmez. ~Komut tanınmadı (ve yine, kullanmak tam olarak nasıl bilmiyorum).

Ancak, pgrepSSH tünelinin hala çalıştığını söylüyor (terminali kapattıktan sonra vs.). Bununla nasıl etkileşime girebilirim? Nasıl kapatırım?

Yanıtlar:


65

Komut dosyası oluşturma için özellikle iyi bir çözüm master mode, kontrol komutları için bir soket kullanmaktır :

ssh -f -N -M -S <path-to-socket> -L <port>:<host>:<port> <server>

Tekrar kapatmak için:

ssh -S <path-to-socket> -O exit <server>

Bu, işlem kimlikleri için grepping işleminden ve diğer yaklaşımlarla ilişkili olabilecek zamanlama sorunlarından kaçınır.


10
Sadece başlatılmamış için biraz genişletmek için, <path-to-socket> , ssh istemcisinin ana örneğinin, ana örneğin bağlantısını paylaşmak isteyen diğer ssh istemci örnekleri ile süreçler arası iletişim için oluşturacağı bir dosya yoludur. Oluşturulan dosya aslında bir unix alan soketini temsil edecektir. İstediğiniz yerde ve istediğiniz yerde isimlendirilebilir ve yerleştirilebilir, örneğin /tmp/session1( % desenlerini kullanarak isimlendirmek tavsiye edilse de - bkz. ControlPath açıklamasında) man ssh_config)
golem

1
Ayrıca , komutun <server> kısmının ssh -S <path-to-socket> -O exit <server>herhangi bir dize olabileceği anlaşılıyor, ancak mevcut olması gerekiyor. Bu biraz sakar.
golem

1
Bu cevap ve soru biraz eski, ama bu problemle ilgili olarak gördüğüm en zarif ve 'doğru' yöntemi onaylamak istedim. Teşekkürler bayım!
zentechinc

41

Çözümü burada buldum: http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/

En iyi yol - Otomatik kapanan tüneller

Daha önce de belirtildiği gibi, -f -N anahtar kombinasyonunu kullanmak yerine, sadece -f komutunu kullanabiliriz, fakat aynı zamanda uzaktaki makineye bir komut verebiliriz. Ancak hangi komutu yerine getirmeliyiz, çünkü yalnızca bir tüneli başlatmamız gerekiyor?

Uyku, herkesin en faydalı emri olabilir. Bu özel durumda, uyku iki avantajı vardır:

  • hiçbir şey yapmaz, bu yüzden hiçbir kaynak tüketilmez
  • kullanıcı ne kadar süreyle yürütüleceğini belirleyebilir

Bunların ssh tüneli otomatik olarak kapatılmasında nasıl yardımcı olduğu aşağıda açıklanmıştır.

Uzaktaki makinede 10 saniye boyunca uyku komutunu yürütürken ssh oturumunu arka planda başlatırız. Saniye sayısı çok önemli değil. Aynı zamanda, vncviewer'ı tam olarak aşağıdaki gibi yürütürüz:

[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
          vncviewer 127.0.0.1:25901:1

Bu durumda, ssh istemcisinin ssh oturumunu arka plana (-f) yerleştirmesi, tüneli yaratması (-L 25901: 127.0.0.1: 5901) ve uzak sunucuda 10 saniye boyunca uyku komutunu yürütmesi istenir (uyku) 10).

Bu yöntem ile öncekinin (-N anahtarı) arasındaki fark, temel olarak, bu durumda ssh istemcisinin öncelikli hedefi tüneli oluşturmak değil, uyku komutunu 10 saniye çalıştırmaktır. Tünelin oluşturulması ikincil bir amaç olan bir çeşit yan etkidir. Vncviewer kullanılmamışsa, ssh istemcisi 10 sn süresinden sonra çıkacak, yapacak başka işi kalmayacak, aynı anda tüneli yok edecek.

Uyku komutunun yürütülmesi sırasında, bu durumda vncviewer başka bir işlem varsa, bu tüneli kullanmaya başlar ve 10 sn'lik bir sürenin ötesinde işgalde tutar, ardından, ssh istemcisi uzaktaki işini bitirse bile (uyku işleminin yürütülmesi), çık çünkü başka bir işlem tüneli işgal ediyor. Başka bir deyişle, ssh istemcisi tüneli tahrip edemez çünkü vncviewer'ı da öldürmek zorunda kalır. Vncviewer tüneli kullanmayı bıraktığında, o zaman ssh istemcisi de hedefine ulaşmış olduğu için çıkar.

Bu şekilde, arka planda çalışan hiçbir ssh işlemi kalmaz.


4
Kısa bir açıklama / düzeltme: Bildiğim kadarıyla vncviewer 127.0.0.1::25091, ekran sözdizimini değil, bağlantı noktası sözdizimini kullandığınızı belirtmeniz gerekir .
Christian Wolf

Bu harika bir fikir ve düzgün bir şekilde Windows'ta sahip olduğum bir sorunu iki adım öteye götürüyor. Windows'un son sürümleri bir ssh istemcisiyle birlikte geliyor ve teoride -S seçeneğini destekliyor, ancak benim için işe yaramadı.
Keeely,

9

Tüneli öldürmek için, hangi ssh işleminin tünelinizi çalıştırdığını belirlemek için ps -C sshveya ps | grep sshveya başka bir varyantını kullanın. Öyleyse öldür onu.

Alternatif olarak, bu portun hangisinin açık olduğunu belirleyerek işlemi arayabilirsiniz:

netstat -lnpt | awk '$4 ~ /:1234$/ {sub(/\/.*/, "", $7); print $7}'

Makinenizde çalışan tüm ssh istemcilerini (kullanıcı olarak) öldürmek istiyorsanız pkill ssh, bunu yapar.


6

Burada başkaları tarafından cevaplandığı gibi pkill sshonu öldürür.

Geri getirilebilecek bir tünel oluşturmak için screen, -fseçenek olmadan başladım ve ardından ekranı ayırdım Ctrl-A D. Tüneli geri getirmek için ara screen -r.


Kaba kuvvet, ama etkili
mafroz

1
Uzaktan bağlanıyorsanız dikkatli olun. pkill ssh, şu anki bağlantınızı bile öldürür.
kennyut

@ kennyut Kullanması için başka bir neden screen.
Haotian Yang

0

Bir tünele başladığımda:

ssh -fN -D 8080 SOME_IP_HERE -l LOGIN_NAME_HERE
  • -f Ssh'nin komut çalıştırmadan hemen önce arka plana gitmesini ister.
  • -NUzak bir komut çalıştırma. Bu sadece portları yönlendirmek için kullanışlıdır.
  • -D Yerel bir "dinamik" uygulama düzeyinde bağlantı noktası iletmeyi belirtir.
  • -l Uzaktaki makinede olduğu gibi oturum açacak kullanıcıyı belirtir.

Şununla kapatabilirim:

ps -lef | grep ssh | grep "8080" | awk "{print \$2}" | xargs kill

-1

Tüm tünelleri tek bir komut satırında öldürürken bulduğum en iyi çözüm

ps -lef|grep ssh|grep "\-L"|awk '{print $4}'|xargs kill

ssh oturumları için, sadece tünel seçeneğini kaldırın

ps -lef|grep ssh|awk '{print $4}'|xargs kill

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.