2013-03-05 20 views
5

Aşağıda gösterildiği gibi uzak mysql sunucusunu güvenli bir şekilde bağlamak için ssh tüneli oluşturan bir bash komut dosyası var. ssh tüneli alt işleminin bash komut dosyası çıkışı üzerine sonlandırılması

ssh -f -N -L $LOCAL_PORT:localhost:3306 [email protected]$REMOTE_IP 
mysql -P $LOCAL_PORT -h 127.0.0.1 -u lapl_stg -p${REMOTE_DB_PASS} <./t1.sql> ./out.txt 

bash script çıkışta, bash komut ssh tünel açtıktan sonra, ben SSH tünel çocuk süreci hala hayatta olduğunu fark ettim.

Komut dosyası çıkarıldıktan sonra, netstat yaparsanız, aşağıdakini gösterir.

netstat -a -n -p -l 
(Not all processes could be identified, non-owned process info 
will not be shown, you would have to be root to see it all.) 
Active Internet connections (servers and established) 

Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 

tcp  0  0 127.0.0.1:3308   0.0.0.0:*    LISTEN  6402/ssh   
tcp  0  0 10.44.44.11:46836  10.44.44.21:22   ESTABLISHED 6402/ssh   
tcp6  0  0 ::1:3308    :::*     LISTEN  6402/ssh 

Ssh alt işlemlerini (6402) betikte temizlemek için nasıl sonlandırırsınız? 'Killall ssh' kullanmayı düşündüm ama başkaları tarafından yaratılan diğer ssh süreçlerini kaza ile öldürebilirim.

Teşekkür ederiz.

cevap

7

SSH'de kontrol soketlerini kullanarak bunu yapmanın bir yolunu buldum. Temelde:

ssh -M -f -N -L $LOCAL_PORT:localhost:3306 [email protected]$REMOTE_IP -S /tmp/ssh-control 
mysql -P $LOCAL_PORT -h 127.0.0.1 -u lapl_stg -p${REMOTE_DB_PASS} <./t1.sql> ./out.txt 
ssh -S /tmp/ssh-control -O exit $REMOTE_IP 

işlem komut çıkışında öldürdü almaz nedeni -f arka plana çatallar bunu ssha geçirilen olmasıdır. Bu, SSH tünellerinin bir sonraki satırın yürütülmesini kesintiye uğratmadan çalışması için gereklidir.

+0

Çok teşekkür ederim. İşe yarıyor. Ben -f seçeneği ile, ssh arka plan işlemi haline geldiğini ve script çıkışında çalışmaya devam ettiğini bilmiyordum. Bu çözümü sadece ssh man sayfasını okuyarak bulmak zor. Bu 'killall ssh'den çok daha iyi ve daha zarif. – user1026669

+0

ssh -f seçeneği ssh'i arka plan moduna geçirirse, nasıl olur da 'echo $!' hala ssh'den sonra hiçbir şey göstermiyor. – user1026669

+1

Eh, * bir arka plan sürecine * forking * yani bash, işlem kimliğini almak için açıkça bilmesi gerektiği anlamına gelir. Eğer '-f 'kullanmadıysanız ve bunun yerine ssh -N -L $ LOCAL_PORT: localhost: 3306 $ REMOTE_USER @ $ REMOTE_IP &' alsaydınız, '$!' Bash işi ile uğraştığınız için bir PID verirdi. o noktada kontrol. – cwgem

İlgili konular