Bazı durumlarda kullanıcının erişim yetkisi olmayan bazı dosyalara ya da aygıtlara yazılım üzerinden erişebilmesi istenir. Olası bir çözüm yazılımın setuid bitini etkinleştirmektir. Böyle bir yazılım çalıştırılırsa, sürecin etkin kullanıcı kimliği yazılım dosyasının sahibi olarak değiştirilir. Böylece, yazılımın sahibi
root yapılıp setuid biti de etkinleştirilerek, normalde sadece ayrıcalıklı kullanıcı tarafından erişilebilen
/etc/passwd gibi dosyalara, yazma erişimi sağlanabilir.
Bunun yanında bir kullanıcının erişim izni olmayan dosyalara erişmesine izin vermeyecek bir düzenleme de düşünülebilir. Bu durumda yazılım, bir dosyayı okumadan ya da ona yazmadan önce kullanıcının gerekli erişim izinlerine sahip olup olmadığını sınamalıdır.
Bunu yapmak için, sürecin etkin kullanıcı kimliğine değil gerçek kullanıcı kimliğine dayalı erişim izinlerini sınayan access işlevi kullanılır. (Setuid özelliği gerçek kullanıcı kimliği değiştirmez, böylece yazılımı gerçekte kimin çalıştırdığı saptanır.)
Bu erişimi sınamanın daha kolay açıklanabilen bir yolu daha vardır, ama onun da kullanımı zordur. Bu yöntemde işlem dosya kip bitlerini öğrenerek ve sistemin kendi erişim hesaplaması taklit edilerek yapılır. Bu yöntemin kullanılması pek tercih edilmez, çünkü bir çok sistem ek erişim denetim özelliklerine sahiptir ve yazılımınız farklı sistemlerin farklı erişim özelliklerini taşınabilir olarak taklit etmek zorunda kalacaktır. access işlevi bu işlemleri sizin yerinize yapar.
access işlevi sadece ve sadece setuid yazılımlarda kullanmak için değildir. Setuid olmayan bir yazılım daima gerçek kimlik yerine etkin kimliği kullanır.
Bu bölümdeki semboller
unistd.h başlık dosyasında bildirilmiştir.
int access | (const char *dosyaismi,
int nasıl) |
işlev
access işlevi ismi dosyaismi ile belirtilen dosyaya nasıl ile belirtilen yolla erişilip erişilemeyeceğini sınar. nasıl argümanında belirtilebilecek değer ya R_OK, W_OK ve X_OK seçeneklerinin bit seviyesinde VEYA'lanmışı ya da F_OK varlık sınaması olabilir.
Bu işlev erişim izinlerini sınamak için sürecin etkin kullanıcı ve grup kimliklerini değil, gerçek kullanıcı ve grup kimliklerini kullanır. Sonuç olarak, bu işlevi bir
setuid veya
setgid yazılımda (
Bir Sürecin Aidiyeti Nasıl Değiştirilir?) kullanıyorsanız, işlev yazılımı gerçekte hangi kullanıcı çalıştırıyorsa o kullanıcıya göre bilgi verir.
Erişime izin verilmişse işlev 0 ile, aksi takdirde -1 ile döner. (Başka bir deyişle, eğer istenen erişime izin verilmezse, access işlevi, bir isnat işlevi gibi düşünülerek doğru ile döner.)
- EACCES
nasıl ile belirtilen erişime izin verilmiyor.
- ENOENT
Dosya mevcut değil.
- EROFS
Salt-okunur bağlı bir dosya sistemi üzerindeki bir dosya için yazma izni istendi.
access işlevinin
nasıl argümanında kullanmak için tasarlanmış olan bu makrolar tamsayı sabitler olarak
unistd.h başlık dosyasında tanımlanmıştır:
Okuma izni için sınama seçeneği.
Yazma izni için sınama seçeneği.
çalıştırma/arama izni için sınama seçeneği.
Dosyanın mevcut olup olmadığını sınama seçeneği.