Bağlantı noktası iletme başarısız olduğunda SSH'nin başarısız olmasına neden olabilir miyim?


38

Uzaktaki bir uzak bağlantı noktasını ileriye götürürsem, -R 3690:localhost:3690uzak ana bilgisayardaki bağlantı noktasında bir bağlayıcı zaten varsa, şu uyarıyı alırım:

Warning: remote port forwarding failed for listen port 3690

Sadece bir uyarı vermek yerine, ssh'nin başarısız olmasının (yani sıfırdan farklı bir dönüş koduyla çıkmanın) bir yolu var mı?


Gerçekten de bir terminal kanalı yapmanız mı gerekiyor, yoksa sadece yönlendirme mi?
Ignacio Vazquez-Abrams

1
@ IgnacioVazquez-Abrams: Sadece yönlendirme.
Matt Joiner

Yanıtlar:


62

Koşmak

ssh -o "ExitOnForwardFailure yes" ...

veya koymak

ExitOnForwardFailure yes

içine ~/.ssh/config. Ayrıntılar için ssh_config(1)kullanma bölümüne manbakınız.


Ne yazık ki OpenSSH 4'üm var. Bu özelliğin ne zaman eklendiğini söyleyebilir misiniz?
Matt Joiner

2
Hayır, bunu bilmiyorum. Sürüm 5 özelliği olabilir. Ancak sürüm 4 şimdi çok eski olmalı ve her zaman güvenlik düzeltmeleri var . Sunucuyu kendiniz yükseltemiyorsanız, bu sürümü kullanmaya devam etmenin güvenli olduğunu düşündüğü durumlarda, sunucu yöneticinize sorabilirsiniz.
Andrew Schulman

Açıkça belirtmezseniz, bind_addressssh'nin hala başarısız olabileceğini unutmayın. Örneğin, başka bir kullanıcı zaten ipv6 localhost'u dinliyorsa, [::1]:3690ssh sadece ipv4'ü bağlayabilir 127.0.0.1:3690ve şikayet etmez. Ama svn istemciniz muhtemelen (saldırganın) ipv6 soketini tercih eder. Güvenli daha iyi kullanmak için-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
rudimeier

3
Bir de ssh -o ExitOnForwardFailure = yes boşluk kullanmadan ve alıntı yapma ihtiyacından kaçınmak için kullanabilir.
boşluk

1

Yönlendirmenin doğru açıldığından emin olmak için hedef ana bilgisayardaki bash betiğini kullanıyorum. SSH bağlantısı bunu çalıştıracak ve port yönlendirme ile ilgili bir sorun varsa, örneğin çıkacaktır.

istemci tarafı komut dosyası: (bu, bağlantı noktası iletme ayarları için .ssh / config kullanır)

#!/bin/bash    

while true; do
    echo -n starting at : "
    date
    ssh user@server bin/sshloop.sh
    echo "got back, sleeping 17 "
    sleep 17
done 

sunucu tarafı komut dosyası (bin / sshloop.sh)

#!/bin/bash

while true; do 
  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client"
  sleep 17
  if ! netstat -an | grep -q ":::1090 " ; then
     echo "1090 forward missing, bailing out"
     exit
  fi
done

Belki de istemci tarafı betiğini -dmS ile ekranın altında çalıştır


2
Kaçınılmaya çalıştığım durum, ileriye doğru bir liman olduğu ve bir uyarı verildiğidir. Bu betiğin bağlantı noktasına yapılan bağlantıyı başarısızlıktan çok başarı olarak değerlendireceğini düşünüyorum.
Matt Joiner

1
Bu doğru. Benim sorunum zaman aşımına uğramadan önce portu birkaç dakika açık tutan aynı betiği kullanmaktı. Thsi betiği çıkıp birkaç kez tekrar açılacak ve ardından port tekrar açılacaktı. Limanın kime ait olduğundan emin olmanız gerekiyorsa, netstat -anp komutunu sudo ile çalıştırmayı deneyebilirsiniz.
Antti Rytsölä Circles, 7:11

@ AnttiRytsöläCirclesConsult: Proses kimliğini kontrol etmeniz gerekebileceğini unutmayın, örneğin proses adı olarak "ssh" ile eşleşmesi, SSH istemcilerinden hangisinin o portu yönlendirdiğini hala söylemez.
Piskvor
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.