No_proxy ortam değişkeninde bir ağ aralığı ayarlama


52

Proxy kullanan bir ağdayım. Burada birçok komut dosyası kullanan makineler var ve orada HTTP üzerinden birbirinize erişebiliyoruz.

  • Ağ 10.0.0.0/8'dir.
  • Vekilim 10.1.1.1:81, ben de buna göre hazırladım:

    export http_proxy=http://10.1.1.1:81/
  • Proxy ile erişilebilecek kendi aralığımı hariç tutmak istiyorum. Kullanılabilir herhangi bir kombinasyonu denedim.

    export no_proxy='10.*'
    export no_proxy='10.*.*.*'
    export no_proxy='10.0.0.0/8'

Yukarıdaki çalışmaların hiçbiri!

Test wgetediyorum ve bağlanmak istediğim IP adresi ne olursa olsun, proxy'yi sorgulamaya çalışıyor.

  • Birçok komut dosyası tüm sistemlerde her yere uzandığından, --no-proxyseçenek aslında bir seçenek değildir. Sistemi geniş ayarlamak istiyorum.

1
Neredeyse 2019 ve CIDR'yi no_proxyortam değişkenine koymanın bir yolu yok mu? Ne cehennem Linus Torvalds!
7_R3X

4
@ 7_R3X bu GNU yazarı olduğundan Richard Stallman'ı lanetlemek istediğini umuyorum.
Jakub Bochenski

Yanıtlar:


43

Yanlış yoldan bakıyorsun. no_proxyOrtam değişkeni alanı eklerini değil önek listeler. Gönderen belgeler :

no_proxy: Alan uzantıları vekil virgülle ayrılmış listesini içermelidir Bu değişken olmalıdır değil için de kullanılabilir.

Yani IP'ler için iki seçeneğiniz var:

1) Her IP’yi tam olarak ekleyin:

printf -v no_proxy '%s,' 10.1.{1..255}.{1..255};
export no_proxy="${no_proxy%,}";

2) yeniden adlandırma wgetiçin wget-originalve adında bir sarıcı betik (yazma wgetverilen URL ana bilgisayar için IP arar ve bu proxy veya değil kullanmalısınız belirler):

#!/bin/bash
ip='';
for arg; do
   # parse arg; if it's a URL, determine the IP address
done;
if [[ "$ip" =~ ^10\.1\. ]]; then
   wget-original --no-proxy "$@";
else
   wget-original "$@";
fi;

Çok teşekkürler, wget'imi saracağım (ve IP adresleri yerine hostnames kullanıyorum).
SamK

9
No_proxy risk performansı konularında 255 * 255 adresleri olacak mı?
jtpereyda

@dafrazzman: Bu iyi olabilir. Sonuçta, neredeyse 800 kilobayt büyüklüğünde, bu da bir ortam değişkeni için biraz aşırı. Aynı zamanda ortamınızın ne kadar büyük olabileceğine de bağlıdır. Bu aşırı durumda, sarmalayıcı yaklaşımını tavsiye ederim.
janmoesen

4
Her IP'yi tam olarak eklemeyin - çok uzun sürecek ve bash'ta herhangi bir komutu yürütemeyeceksiniz.
Ross,

5
ASLA YAPMAYIN, bu herhangi bir komut için çok uzun bir şey üretecektir ve eğer bunu /etc/environmentdosyaya koyarsanız , sunucunuzu bozabilir.
Thomas Decaux,

15

info wget diyor:

 `no_proxy'
     This variable should contain a comma-separated list of domain
     extensions proxy should _not_ be used for.  For instance, if the
     value of `no_proxy' is `.mit.edu', proxy will not be used to
     retrieve documents from MIT.

Yani değişken bir listesini içermelidir etki değil, IP aralıkları . Dosyalarda yerel makineleriniz için uygun yerel takma adlar ayarlamanız gerekir /etc/hosts.

Bunun dışında, bir ortam değişkeni belirlemenin , bir proxy'nin kullanılacağını veya kullanılmayacağını garanti etmediğini unutmayın . Sadece bir bilgidir olabilir bunu destekleyecek programlar tarafından kullanılabilir.


Eğer wget bu aynı şekilde uygulayan olarak bukle yapar - ve bunu vermez şüpheli - bakınız - Her iki dize olarak kabul edilir gibi IP adresi veya alan adı ise o zaman hiçbir fark yoktur github.com/curl/curl/issues/1208
Piotr Dobrogost

12

Tam olarak doğru bir çözüm değil, sorunu sizin için çözebilir. Proxy dışından bir şeye erişmenin DNS adlarını kullanacağını ve doğrudan IP adreslerini kullanmayacağını varsayıyorsanız, şöyle ayarlayabilirsiniz:

export no_proxy=0,1,2,3,4,5,6,7,8,9

Bildiğim kadarıyla, hiçbir üst etki alanı bir sayı ile bitmiyor, öyleyse bir IP adresi olması gerekir.


7
Bu çok akıllıca bir çözüm :) Maalesef bu, yalnızca yerel IP'ler için değil, IP için proxy'yi atlayacak ... :( (2018'de) "noproxy" değişkeninde IP aralıkları veya CIDR belirtmenin yolu yok mu?
Sorin Postelnicu

Veri merkezi sunucusu için bu çok zekice bir numara. Yan etkisi var ama kabul edilebilir.
notes-jj,

bu benim için işe yaramadı .. @iconoclast çözümü kullanmak zorunda kaldı
Erik

12

İşte janmoesen'in çözümüne dayanan biraz daha basit (tek satırlık) bir yaklaşım.

export no_proxy=`echo 10.1.1.{1..255} | sed 's/ /,/g'`

Cory Ringdahl'ın girişine dayanarak daha da geliştirilmiştir:

export no_proxy="`echo 10.1.1.{1..254},` 10.1.1.255"

Sed 10.1.{1..255}.{1..255}, kodunda veya benimkide genişlemesinden geçen tüm argümanlara boğulur. Bu nedenle, 256 * 256 IP adresine gerçekten genişletmeniz gerekiyorsa, Cory Ringdahl'ın yaklaşımını daha da uyarlayabilirsiniz, ancak yalnızca 256 veya daha fazlasına ihtiyacınız varsa, bunların her ikisi de sizin için mükemmel şekilde çalışmalıdır.

2 oktetin genişletildiği versiyonun şöyle göründüğünü tahmin ediyorum:

export no_proxy="`echo 10.1.{1..255}.{1..254},` 10.1.255.255"

fakat iTerm, tartışma listelerinin çok uzun olduğu konusunda bana hatalar veriyor, bu yüzden bu işi yapmanın bir çözümü olup olmadığını kesin olarak söyleyemem ...


1
Yaparak sed kullanarak etrafında alabilirsiniz"export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
Cory Ringdahl

Güzel ... Boşluğu virgüllerden sonra tutarlı kılmak için biraz ince ayarlıyorum ve ekleyeceğim.
iconoclast
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.