Geri Dön
curl olmadan HTTP isteği: konteynerde bash /dev/tcp yöntemi
SiTech AI Team2 წთ. საკითხავი

curl olmadan HTTP isteği: konteynerde bash /dev/tcp yöntemi

İç Docker ağındaki bir konteynerin diğerine ulaşıp ulaşmadığını kontrol etmesi gereken geliştirici, imajda curl ve wget bulamayınca HTTP isteğini bash'in /dev/tcp yönlendirmesiyle elle yazdı.

İç bir Docker ağında bir konteynerin diğerine ulaşıp ulaşmadığını kontrol etmesi gereken bir geliştirici, beklenen aracı bulamadı: uygulama imajı en ince haline indirilmişti ve içinde ne curl ne de wget vardı. Kısa bir notta anlatılan çözüm, bash'in kendi içindeki bir yeteneğe dayanıyor: /dev/tcp sözde aygıtı. Kabuk TCP soketini kendisi açıyor, HTTP isteği ise elle yazılıyor.

Yalnızca kabuk araçlarıyla yazılan HTTP isteği

Yöntem, hâlihazırda var olan kabuk dışında hiçbir şey gerektirmiyor. Hedef ana makine ve port için bir dosya tanımlayıcı açılıyor — exec 3<>/dev/tcp/service/8642 — ardından printf ile asgari bir istek yazılıyor: istek satırı, Host başlığı ve Connection: close. cat <&3 komutu sunucunun döndürdüğü her şeyi basıyor: durum satırı, başlıklar ve gövde. Authorization: Bearer başlığı eklemek, isteği kapatan boş satırdan önce CRLF ile biten bir satır daha eklemekten ibaret.

/dev/tcp diskte var olmayan bir yönlendirme

En çok şaşırtan ayrıntı, /dev/tcp'nin gerçek bir dosya olmaması: ls /dev/tcp hiçbir şey bulmaz, başka bir kabuktan cat ise hata verir. Bu, bash'in kendi içinde işlediği bir yönlendirmedir; DNS sorgusunu ve connect(2) çağrısını bash yapar, sonra sokete bir dosya tanımlayıcı verir. Adlar özellikle seçilmiş, çünkü gerçek hiçbir Unix'te /dev/tcp hiyerarşisi yoktur ve çakışma riski bulunmaz. Bu bir bash özelliği olduğu ve POSIX olmadığı için dash ve zsh'de çalışmaz; betik bash'i doğrudan çağırmalıdır.

Bu yöntemin yapamadıkları

Yazar açıkça belirtiyor: bu bir HTTP istemcisi değil. Yanıtları ayrıştırmaz, yönlendirmeleri izlemez, chunked kodlamayı, sıkıştırmayı, yeniden denemeyi ve TLS'i yönetmez — soket yalnızca düz metin içindir, https için openssl s_client gerekir. Connection: close başlığı atlanırsa sunucu bağlantıyı açık bırakır ve cat hiç gelmeyecek baytları sonsuza kadar bekler; komutu timeout 6 bash -c '...' içine almak bunu engeller. Özellik derleme zamanında açılan bir seçenektir (--enable-net-redirections): yaygın derlemelerin çoğunda etkindir, ancak Debian yıllarca kapalı dağıttı. Sonuç değişmiyor: günlük işlerde doğru araç hâlâ curl, ama kasıtlı olarak küçültülmüş bir konteynerde bu yöntem paket kurmadan hızlı bir kontrol sağlıyor.

SSiTech

SiTech — AI destekli web geliştirme

Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.