Neden bazı sistemlerde maksimum kullanıcı adı / gid 65534 değil 65535?


2

Uid (veya gid) için paylaşılan bir maksimum değer olmadığını biliyorum: Bazı sistemler 99 (Slackware, ...), diğerleri 65534 (Debian, ...) kullanıyor.
65534'ü kullanmak için belirli bir motivasyon olup olmadığını ve 65535'i (0xFFFF) olup olmadığını soruyorum. Teşekkür ederim.

Yanıtlar:


5

Maksimum UID 65535 ise, UID işaretsiz bir 16 bitlik değerde saklanırsa, bir hatayı veya bilinmeyen bir UID'yi belirtecek bir değer yoktur.


Yani (uint16_t) -1bir hatayı belirtmek için kullanılır?
Ocak'ta 14:21

@grawity En azından olabilir. Aslında olup olmadığını, bildiğim kadarıyla değil. Ama bu muhtemelen düşünme.
David Schwartz

En son kontrol ettiğimde, (uid_t) -1 == cdrom
Joshua

4

Neden 99

Bu aslında bir maksimum değil . Bu, "sistem" hesapları için kimliklerin durduğu ve "gerçek kişi" hesapları için kimliklerin başladığı bir eşiktir. Bu da oldukça keyfi ve değişken. 100'ün kullanışlı bir yuvarlak sayı olması dışında 99 olması için gerçek bir sebep yok.

Bir platform için çeşitli parola ve grup veritabanı yönetimi araçları tarafından kararlaştırılan kullanışlı bir tur numarasıdır. Örneğin Debian sürüm 7'de, useraddve groupaddaraçları /etc/login.defs"system" ve "user" olarak sayılan UID'lerin ve GID'lerin aralıklarını arar ve ikinci aralık, hem UID'ler hem de GID'ler için 1000 ila 60000'dür.

Neden 65534?

Öncelikle POSIX sistem çağrılarında iki yaygın sözleşme olduğu için:

  • Bir dönüş değeri -1(dönüş türüne atama) bir hata gösterir; hata numarası errnomakroda bulunur.
  • Bir giriş değeri -1"değişme" gösterir.

Bunlar evrensel sözleşmeler değil . geteuid()Örneğin , sistem çağrısından hata gelme ihtimalinin olmadığına dikkat edin . (İşlemler her zaman etkili bir kullanıcı kimliğine sahiptir.) Yani orada static_cast<uid_t>(-1)endişelenmenize gerek yok. Ancak bunlardan en az biri UID'ler ve GID'ler için geçerlidir. Gelen setreuid()ve setregid()sistemin bir tartışma çağrıları -1vasıtası "değişiklik yok". Öyleyse static_cast<uid_t>(-1)ve static_cast<gid_t>(-1)gerçek kimlikler olarak uygun şekilde kullanılamaz.

İkincisi, Linux'taki UID'ler ve GID'ler 16-bit idi.

Bu, yüzyılın başlarında 32-bit olarak değişti, ancak yankıları devam ediyor ve aslında ilk başta göründüğünden daha ince. -116 bitlik işaretsiz bir tamsayıya çevirmek, ki bunun ne olduğunu uid_tve gid_t(sistem çağrı arayüzünde) eskiden gördüğünüz gibi 65535'tir. Yani bu kullanılabilir bir UID veya GID değildi.

Ancak, 32-bit alanına geçti çekirdekleri 16 bit API kullanılan programların yararları için uid_tve gid_tLinux bir "taşma UID" ve "taşma GID" tanımladı. Bunun nedeni, çeşitli noktalarda, 16 bit ile 32 bit arasında yapılan dökümden dolayı oldukça kötü etkileşimler olmasıydı. 16-bit programlar, çekirdek olmadığında UID 65536'yı süper kullanıcı olarak gördü. Eski çekirdekler, uygulama kodu kullanılmadığında UID 131072'yi süper kullanıcı olarak görüyorlardı.

"Taşma UID" ve "Taşma GID", 16 bitlik kod için tüm 32-bit UID'leri ve 65535 ila 65534'ten büyük GID'leri esas olarak eşledi. Bu, ikinci bir değer olan 0xFFFE'nin şimdi gerçek bir UID veya GID değeri olarak kullanılamaz olduğu anlamına gelir .

Ve tabii ki, -132-bit UID'ye attı ve GID türü de kullanılamaz.


0

Sistemler genellikle "geçersiz" veya "kullanılmamış" olduğunu belirtmek için işaretsiz en yüksek tamsayı 0xffff değerini (veya değer, işaretli bir tamsayı olarak yorumlanırsa -1) saklar.
(0xffff 16-bit elbette. Bazı sistemler 32-bit 0xffffffff kullanır.)

Sıfır bunun için kullanılamaz çünkü kök kullanımı için ayrılmıştır.
(Kök için 0 ayırmak, doğru hatırlıyorsam uyumluluk nedenleriyle hemen hemen tüm diğer işletim sistemlerinde gözlemlenen bir POSIX sözleşmesidir.)


3
Kullanıcı kimliği 0, çekirdek için değil kök için ayrılmıştır. ( İşlem kimliği 0 mı demek istediniz ?)
Grawity

Tamam, ancak hala bu değerin faydasını anlamıyorum: neden 'geçersiz' (0xffff) kullanıcı kimliğiyle yeni bir kullanıcı oluşturmalıyım? Veya setreuid () işlevini çağırırken 'değişmeden bırak' anlamına mı geliyor? 'man setreuid', eğer kimliği değiştirmek istemiyorsam -1'i argüman olarak koymam gerektiğini söylüyor ama uid_t imzasız. Yani 65535'i koymak zorunda mıyım?
user2431763

@grawity Elbette haklısın. Kök demek istedim. Çok az uyku, bütün silindirlerde koşmuyorum. Gönderiyi düzenler.
Tonny

@ user2431763 Oraya -1 koymayacaksınız ancak işletim sistemi bunu yapabilir. Örnek: Bazı Unix tatları silinen bir kullanıcının UID'sini -1 olarak ayarlar, ancak kullanıcıyı passwd'den kaldırmazlar. (Bu, daha sonra, tam adı, home-dir, ne tür bir kabuk kullandığı gibi, kullanıcı hakkında hala bilgi arayabilmenizin yararına sahiptir.) Ayrıca, genellikle şirket tarafından yasaklanan kullanıcı adının yeniden kullanılmasını önler. politika.
Tonny
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.