Վերադառնալ
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 կեղծ սարքի վրա. shell-ն ինքն է բացում TCP սոքեթը, իսկ HTTP հարցումը գրվում է ձեռքով։

HTTP հարցում՝ գրված ձեռքով

Մոտեցումը ոչինչ ավելին չի պահանջում, քան արդեն առկա shell-ը։ Թիրախային host-ի և port-ի նկատմամբ բացվում է ֆայլային դեսկրիպտոր՝ exec 3<>/dev/tcp/service/8642, ապա printf-ով գրվում է նվազագույն հարցում՝ հարցման տողը, Host վերնագիրը և Connection: close-ը։ cat <&3 հրամանը տպում է ամեն ինչ, ինչ վերադարձնում է սերվերը՝ կարգավիճակի տողը, վերնագրերը և մարմինը։ Authorization: Bearer վերնագիր ավելացնելը նշանակում է ևս մեկ CRLF-ով ավարտվող տող մտցնել հարցումը փակող դատարկ տողից առաջ։

/dev/tcp-ն սկավառակի վրա չկա

Ամենազարմանալին այն է, որ /dev/tcp-ն իրական ֆայլ չէ. ls /dev/tcp ոչինչ չի գտնի, իսկ մեկ այլ shell-ից cat-ը պարզապես սխալ կվերադարձնի։ Սա bash-ի ներքին վերաուղղորդումն է. 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). ժամանակակից կառուցվածքների մեծ մասում այն միացված է, սակայն Debian-ը տարիներ շարունակ այն անջատված էր տարածում։ Եզրակացությունը նույնն է. ամենօրյա աշխատանքի համար curl-ը մնում է ճիշտ գործիքը, բայց դիտավորյալ նվազագույն կոնտեյների ներսում այս հնարքը արագ ստուգում է տալիս՝ առանց փաթեթ տեղադրելու։

SSiTech

SiTech — AI-ով հզորացված վեբ մշակում

Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։