ตั้งค่าช่วงเครือข่ายในตัวแปรสภาพแวดล้อม no_proxy


52

ฉันอยู่ในเครือข่ายที่ใช้พรอกซี ฉันมีเครื่องที่ใช้สคริปต์จำนวนมากที่นี่และเข้าถึงกันผ่านทาง HTTP

  • เครือข่ายคือ 10.0.0.0/8
  • พร็อกซีของฉันคือ 10.1.1.1:81 ดังนั้นฉันจึงตั้งค่าตามความเหมาะสม:

    export http_proxy=http://10.1.1.1:81/
  • ฉันต้องการยกเว้นช่วงของตัวเองเพื่อเข้าถึงด้วยพร็อกซี ฉันลองชุดค่าผสมที่มีอยู่

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

ไม่มีการทำงานข้างต้น!

ฉันกำลังทดสอบอยู่wgetและพยายามค้นหาพร็อกซีเสมอไม่ว่าจะใช้ที่อยู่ IP ใดก็ตามที่ฉันต้องการเชื่อมต่อ

  • เนื่องจากสคริปต์จำนวนมากอยู่ทุกที่ในทุกระบบ--no-proxyตัวเลือกจึงไม่ใช่ตัวเลือก ฉันต้องการตั้งค่าระบบให้กว้าง

1
เกือบ 2019 และไม่มีวิธีที่จะวาง CIDR ในno_proxyตัวแปรสภาพแวดล้อมได้อย่างไร อะไรคือสิ่งที่ Linus Torvalds !!
7_R3X

4
@ 7_R3X เป็น GNU wget ดังนั้นฉันคาดว่าคุณต้องการสาปแช่ง Richard Stallman?
Jakub Bochenski

คำตอบ:


43

คุณกำลังมองมันผิดทาง no_proxyตัวแปรสภาพแวดล้อมแสดงต่อท้ายโดเมนไม่คำนำหน้า จากเอกสาร :

no_proxy: ตัวแปรนี้ควรมีรายการพร็อกซีส่วนขยายโดเมนที่คั่นด้วยเครื่องหมายจุลภาคไม่ควรใช้

ดังนั้นสำหรับ IP คุณมีสองตัวเลือก:

1) เพิ่ม IP แต่ละรายการแบบเต็ม:

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

2) เปลี่ยนชื่อwgetเป็นwget-originalและเขียนสคริปต์ตัวตัด (เรียกว่าwget) ที่ค้นหา IP สำหรับโฮสต์ของ URL ที่กำหนดและพิจารณาว่าควรใช้พร็อกซีหรือไม่:

#!/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;

ขอบคุณมากฉันจะปิด wget ของฉัน (และใช้ชื่อโฮสต์แทนที่อยู่ IP)
SamK

9
จะมีที่อยู่ 255 * 255 ใน no_proxy หรือไม่?
jtpereyda

@dafrazzman: นั่นอาจเป็นไปได้ ท้ายที่สุดมันมีขนาดใหญ่เกือบ 800 กิโลไบต์ซึ่งค่อนข้างรุนแรงสำหรับตัวแปรสภาพแวดล้อม ขึ้นอยู่กับว่าสภาพแวดล้อมของคุณมีขนาดใหญ่เพียงใด สำหรับกรณีที่รุนแรงนี้ฉันอยากจะแนะนำวิธีห่อหุ้ม
janmoesen

4
อย่าเพิ่มแต่ละ IP เต็ม - มันจะยาวเกินไปและคุณจะไม่สามารถดำเนินการคำสั่งใด ๆ ในการทุบตี
Ross

5
ไม่เคยทำเช่นนี้จะสร้างสิ่งที่ยาวเกินไปสำหรับคำสั่งใด ๆ และถ้าคุณใส่สิ่งนี้ใน/etc/environmentไฟล์สิ่งนี้อาจทำลายเซิร์ฟเวอร์ของคุณ
โทมัส Decaux

15

info wget พูดว่า:

 `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.

ดังนั้นตัวแปรควรมีรายการของโดเมนไม่ใช่ช่วง IP คุณจะต้องตั้งค่านามแฝงในท้องถิ่นที่เหมาะสมสำหรับเครื่องของคุณใน/etc/hostsไฟล์

นอกเหนือจากนี้โปรดจำไว้ว่าการตั้งค่าตัวแปรสภาพแวดล้อมไม่ได้รับประกันว่าพร็อกซีจะใช้หรือไม่ใช้ มันเป็นเพียงข้อมูลที่อาจถูกใช้โดยโปรแกรมที่สนับสนุน


หากwgetใช้วิธีนี้เหมือนกับที่curlทำ - และฉันสงสัยว่ามันทำ - จะไม่มีความแตกต่างถ้าเป็นที่อยู่ IP หรือชื่อโดเมนเนื่องจากทั้งสองนั้นถือว่าเป็นสตริง - ดูgithub.com/curl/curl/issues/1208
Piotr Dobrogost

12

ไม่ใช่วิธีการแก้ไขที่ถูกต้อง แต่อาจแก้ไขปัญหาให้คุณได้ หากคุณคิดว่าการเข้าถึงสิ่งใด ๆ จากภายนอกพร็อกซีจะเป็นการใช้ชื่อ DNS และไม่ใช้ที่อยู่ IP โดยตรงคุณสามารถตั้งค่าดังนี้:

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

เท่าที่ฉันรู้ไม่มีโดเมนบนสุดลงท้ายด้วยตัวเลขดังนั้นถ้าเป็นเช่นนั้นจะต้องเป็นที่อยู่ IP


7
นั่นเป็นวิธีที่ชาญฉลาดมาก :) น่าเสียดายที่นี่จะเลี่ยงผ่านพร็อกซีสำหรับ IP ใด ๆ ไม่เพียง แต่สำหรับ IP ในพื้นที่ ... :( ไม่มีวิธี (ในปี 2561) เพื่อระบุช่วง IP หรือ CIDR ในตัวแปร "noproxy" หรือไม่
โซริน Postelnicu

สำหรับเซิร์ฟเวอร์ศูนย์ข้อมูลนี่เป็นเคล็ดลับที่ฉลาดมาก มีผลข้างเคียง แต่ยอมรับได้
notes-jj

สิ่งนี้ใช้ไม่ได้สำหรับตัวฉันเอง .. ต้องใช้วิธีแก้ปัญหา @iconoclast
Erik

12

นี่เป็นวิธีที่ง่ายกว่าเล็กน้อย (บรรทัดเดียว) ตามการแก้ปัญหาของ janmoesen

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

ซึ่งได้รับการปรับปรุงเพิ่มเติมตามอินพุตของ Cory Ringdahl:

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

Sed chokes กับข้อโต้แย้งทั้งหมดที่ผ่านจากการขยายตัวของ10.1.{1..255}.{1..255}ทั้งในรหัสหรือของฉัน ดังนั้นหากคุณต้องการขยายเป็น 256 * 256 ที่อยู่ IP จริง ๆ คุณอาจสามารถปรับเปลี่ยนวิธีการของ Cory Ringdahl เพิ่มเติมได้ แต่ถ้าคุณต้องการเพียง 256 หรือมากกว่านั้นทั้งสองอย่างนี้จะทำงานได้อย่างสมบูรณ์แบบสำหรับคุณ

ฉันคาดเดารุ่นที่ขยาย 2 octets จะมีลักษณะดังนี้:

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

แต่ iTerm ให้ข้อผิดพลาดกับฉันเกี่ยวกับรายการอาร์กิวเมนต์ที่ยาวเกินไปดังนั้นฉันไม่สามารถบอกได้อย่างแน่นอนว่ามีวิธีแก้ปัญหาที่จะทำให้งานนี้ ...


1
สามารถเดินทางโดยใช้ sed โดยทำ"export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
Cory Ringdahl

ดี ... ฉันกำลังปรับแต่งเล็กน้อยเพื่อให้ระยะห่างสอดคล้องกันหลังจากเครื่องหมายจุลภาคและฉันจะเพิ่ม
iconoclast
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.