Genellikle bir kullanıcı kimliğiyle ilişkilendirilmiş giriş adını almak istiyorum ve bunun yaygın bir kullanım durumu olduğu kanıtlandığından, bunun için bir kabuk işlevi yazmaya karar verdim. Öncelikle GNU / Linux dağıtımlarını kullanırken, senaryolarımı olabildiğince taşınabilir olması için senaryoları yazmaya ve POSIX uyumlu olup olmadıklarını kontrol etmeye çalışıyorum.
Ayrıştırma /etc/passwd
Denedim ilk yaklaşım ayrıştırma /etc/passwd
(kullanarak awk
) oldu.
awk -v uid="$uid" -F: '$3 == uid {print $1}' /etc/passwd
Bununla birlikte, bu yaklaşımla ilgili sorun, girişlerin yerel olmayabilir, örneğin kullanıcı kimlik doğrulaması NIS veya LDAP yoluyla olabilir.
getent
Komutu kullan
Yerel olmayan NIS veya LDAP veritabanlarını da getent passwd
sorguladığından /etc/passwd
, kullanmak ayrıştırmaya göre daha taşınabilir .
getent passwd "$uid" | cut -d: -f1
Ne yazık ki, getent
yardımcı program POSIX tarafından belirtilmiş gibi görünmüyor.
id
Komutu kullan
id
Bir kullanıcının kimliği hakkında veri almak için POSIX standardize edilmiş bir yardımcı programdır.
BSD ve GNU uygulamaları bir kullanıcı kimliğini operand olarak kabul eder:
- id (1) - OpenBSD kılavuz sayfaları
- id (1) - FreeBSD kullanıcı sayfası
- GNU Coreutils: kimlik kontrolü
Bu, bir Kullanıcı Kimliği ile ilişkili giriş adını yazdırmak için kullanılabileceği anlamına gelir:
id -nu "$uid"
Bununla birlikte, kullanıcı kimliklerini işlenen olarak sağlamak POSIX'te belirtilmemiş; sadece bir işleç olarak giriş adının kullanılmasını açıklar .
Yukarıdakilerin hepsini birleştirmek
Yukarıdaki üç yaklaşımı aşağıdaki gibi bir şeye birleştirmeyi düşündüm:
get_username(){
uid="$1"
# First try using getent
getent passwd "$uid" | cut -d: -f1 ||
# Next try using the UID as an operand to id.
id -nu "$uid" ||
# As a last resort, parse `/etc/passwd`.
awk -v uid="$uid" -F: '$3 == uid {print $1}' /etc/passwd
}
Ancak, bu tıknaz, inelegant ve - daha önemlisi - sağlam değil; Kullanıcı Kimliği geçersizse veya yoksa sıfır olmayan bir durumla çıkar. Her komut çağrısının çıkış durumunu analiz eden ve depolayan daha uzun ve clunkier bir kabuk betiği yazmadan önce, burada soracağımı düşündüm:
Bir kullanıcı kimliğiyle ilişkili giriş adını almanın daha şık ve taşınabilir (POSIX uyumlu) bir yolu var mı?
getent
ne de id
ilk maçında geçen şey döndürür; hepsini bulmanın tek yolu, kullanıcı veritabanına izin veriyorsa, tüm kullanıcıları sıralamaktır. ( /etc/passwd
Açıkçası, orada tanımlanan kullanıcılar için çalışmalara bakmak .)
/etc/passwd
ve /etc/shadow
bu senaryoyu test etmek ve hem doğruladıktan id
ve getent passwd
açıkladığınız olarak davranır. Bir aşamada, bir kullanıcının birden fazla isme sahip olduğu bir sistem kullanırsam, bu sistem yardımcı programlarıyla aynı şeyi yapacağım ve ilk oluşumu yalnızca o kullanıcı için geçerli olan ad olarak kabul edeceğim.
setuid(some_id)
ve some_id
herhangi bir kullanıcı veritabanının parçası olabilecek bir gereklilik yoktur . Linux'ta kullanıcı ad alanları gibi şeylerle, bu, betikleriniz için sakatlayıcı bir varsayım olabilir.
getpwuid()
işlevi çağırmanın pahalı bir yolu gibi görünüyor ls
. Gilles'un cevabı , bunu başarmanın daha doğrudan ve etkili bir yoludur.