Yazdığım bir Python uzantısı, tek bir donanım başlatma çağrısı yapmak için kök erişimi gerektirir. Uzantıdaki bu tek çağrı için tüm betiği root olarak çalıştırmamayı tercih ediyorum, bu nedenle kullanıcı ayrıcalıklarına düşmeden ve asıl senaryoyu çalıştırmadan önce bu başlatmayı yapmak için bir sarıcı yazmak istiyorum. Bu sarmalayıcı için niyetindeBir setuid sarıcı için dikkat edilmesi gerekenler
, sudo
yoluyla yapılacaksa mesela
$ sudo devwrap python somescript.py
I ( hata bir çift düzeltmek için güncellenmiş
) gibi bir şey düşündüğünü :
int main(int argc, char * argv[])
{
if(argc < 2) return 0;
int res = do_hardware_init();
if(res != OK_VALUE)
{
// Print error message
return HW_ERR;
}
const char *sudo_uid = getenv("SUDO_UID");
if(sudo_uid)
{
int real_uid = (int) strtol(sudo_uid, NULL, 0);
setuid(real_uid);
}
return execvp(argv[1], &argv[1]); // No return if successful
}
Yani var üç soru:
- bu aklı başında görünüyor? Genellikle * uid() çağrılarıyla uğraşmak zorunda değilim, bu yüzden normal tuzaklara aşina değilim.
execvp
çağrı da biraz tuhaf görünüyor, ama görebildiğim kadarıyla doğru yerde argümanlar var). execvp
man page, "Ortam dizisine uygulama tarafından doğrudan erişilmemelidir" diyor " - bugetenv
'u kötü bir fikir mi yapıyor?execvp
daha iyi bir çağrı var mı, bu yüzdensudo devwrap somescript.py
yapabilirsiniz ("piton" notu yokluğunu) daha aşağıda aklı başında bir
* Bunu başarmanın başka bir yolu olmadığından emin misiniz? * Hayır, değilim, ama başka bir yol düşünemiyorum. Başlatma çağrısı kök olarak çalıştırılmazsa, başarısız olur, tam durur. Sanırım * bu işlemin – detly
numaralı işleme göre gerekli olduğunu ... ama bu belgelenmemiş. Şaşırırdım, yine de bellek eşlemeli kontrol kayıtları gibi görünüyor. – detly
Bunu kabul etmek için çok uzun süre için üzgünüm. Tavsiyeni almaya ve SUID yoluna gitmeye karar verdim. – detly