უკან დაბრუნება
HTTP მოთხოვნები curl-ის გარეშე: bash-ის /dev/tcp ხრიკი კონტეინერში
SiTech AI Team2 წთ. საკითხავი

HTTP მოთხოვნები curl-ის გარეშე: bash-ის /dev/tcp ხრიკი კონტეინერში

დეველოპერს, რომლის კონტეინერსაც არც curl და არც wget არ ჰქონდა, შიდა Docker-ქსელში სერვისის ხელმისაწვდომობა bash-ის /dev/tcp რედირექციით შეამოწმა — HTTP მოთხოვნა მხოლოდ ჭურვის საშუალებებით დაიწერა.

დეველოპერს, რომელსაც შიდა Docker-ქსელში ერთი კონტეინერიდან მეორეზე წვდომის შემოწმება სჭირდებოდა, ჩვეულებრივი ხელსაწყო არ ჰქონდა: აპლიკაციის იმიჯი მაქსიმალურად იყო შემცირებული და არც curl, არც wget და არც სოკეტის გახსნის სხვა საშუალება არ შეიცავდა. გამოსავალი, რომელიც ავტორმა მოკლე ჩანაწერში აღწერა, bash-ის ჩაშენებულ შესაძლებლობას — /dev/tcp ფსევდო-მოწყობილობას — ეყრდნობა: ჭურვს შეუძლია თავად გახსნას TCP-სოკეტი და ხელით დაწეროს HTTP-მოთხოვნა.

HTTP-მოთხოვნა ხელით, მხოლოდ ჭურვის საშუალებებით

მიდგომა უკვე არსებული ჭურვის გარდა არაფერს მოითხოვს. ფაილის დესკრიპტორი იხსნება სამიზნე ჰოსტისა და პორტის მიმართ — exec 3<>/dev/tcp/service/8642 — რის შემდეგაც printf-ით იწერება მინიმალური მოთხოვნა: მოთხოვნის სტრიქონი, Host-ჰედერი და Connection: close. ბრძანება cat <&3 ბეჭდავს ყველაფერს, რასაც სერვერი დააბრუნებს: სტატუსის სტრიქონს, ჰედერებსა და სხეულს. Authorization: Bearer ტოკენის დამატება კიდევ ერთი CRLF-ით დასრულებული სტრიქონის ჩასმას ნიშნავს იმ ცარიელ სტრიქონამდე, რომელიც მოთხოვნას ასრულებს.

/dev/tcp დისკზე არ არსებობს

ყველაზე ხშირი გაუგებრობა ისაა, რომ /dev/tcp რეალური ფაილი არ არის: ls /dev/tcp ვერაფერს იპოვის, სხვა ჭურვიდან cat კი მხოლოდ შეცდომას დააბრუნებს. ეს bash-ის შიდა რედირექციაა — ჭურვი თავად ასრულებს DNS-ის გარჩევას და connect(2) გამოძახებას, შემდეგ კი სოკეტს ფაილის დესკრიპტორს ანიჭებს. სახელები სწორედ იმიტომ შეირჩა, რომ ნამდვილ Unix-ს /dev/tcp იერარქია არ აქვს და კოლიზია შეუძლებელია. რადგან ეს bash-ის, და არა POSIX-ის ფუნქციაა, dash-სა და zsh-ში არ მუშაობს — სკრიპტმა bash პირდაპირ უნდა გამოიძახოს.

რას არ აკეთებს ეს მეთოდი

ავტორი ხაზგასმით აღნიშნავს, რომ ეს HTTP-კლიენტი არ არის: ის არ ამუშავებს პასუხებს, არ მიჰყვება გადამისამართებებს, არ უმკლავდება chunked კოდირებას, შეკუმშვას, ხელახლა ცდასა და TLS-ს — სოკეტი მხოლოდ ღია ტექსტისთვისაა, ამიტომ https-ისთვის openssl s_client დასჭირდება. Connection: close ჰედერის გამოტოვება იწვევს იმას, რომ სერვერი კავშირს ღიად ტოვებს და cat უსასრულოდ ელოდება ბაიტებს, რომლებიც არასდროს მოვა; ამისგან იცავს ბრძანების timeout 6 bash -c '...'-ში გახვევა. ფუნქცია კომპილაციის დროს ჩართვადი ოპციაა (--enable-net-redirections): თანამედროვე build-ების უმეტესობა მას ჩართულს ტოვებს, თუმცა Debian წლების განმავლობაში გამორთული ავრცელებდა. დასკვნა უცვლელია: ყოველდღიური მუშაობისთვის curl საუკეთესო ხელსაწყოდ რჩება, მაგრამ მინიმალურ კონტეინერში, სადაც ვერაფერს დააყენებ, ეს ხრიკი სწრაფ პასუხს იძლევა ზედმეტი პაკეტის დამატების გარეშე.

SSiTech

SiTech — AI-გაძლიერებული ვებ დეველოპმენტი

ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.