簡體   English   中英

如何使我的用戶級應用程序通過管道與根級別應用程序進行通信?

[英]How do I make my user level application communicate to a root level application through pipes?

我有一個用戶級應用程序,需要通過寫入設備文件(需要root權限)來啟用/禁用設備。

這是我的界面的當前實現:

bool DeviceInterface::EnableDevice( bool isEnabled )
{
    bool isSuccessful = false;

    //enable device
    if(isEnabled)
    {
        isSuccessful = (system("enableDevice.sh 1") == 0)? true : false;
    }
    //disable device
    else
    {
        isSuccessful = (system("enableDevice.sh 0") == 0)? true : false;
    }
    return isSuccessful ;
}

我的腳本“enableDevice.sh”看起來像這樣,並在以root身份運行時運行正常:

echo $1 > /sys/devices/device_file

這會失敗,因為它需要root權限才能寫入設備文件。 我對“管道”,“叉子”和“執行器”都很陌生。 任何人都可以幫助我如何將“0”或“1”傳遞給腳本來啟用和禁用設備?

在enableDevice.sh上運行chmod,如下所示(作為root): -

   #chmod 4755 enableDevice.sh

它被稱為設置setuid位。 使用此非root用戶將能夠運行此腳本,它將與所有者(在我們的情況下:root)權限一起運行。 因此,您的計划將有效。 請閱讀有關setuid的內容。 編輯:此外,在chmod之前,將enableDevice.sh的所有者和組作為root。 然后只有它會起作用。

為了使'enableDevice.sh'能夠執行此操作,它需要以root身份運行。 您可以將其標記為suid(chmod u + S enableDevice.sh)並將其標記為root。 請注意,您需要成為root用戶才能執行chown(在任何合理的unix系統上)。

當然,你總是可以為你的(好吧,程序)組或每個人打開寫權限,即chmod g + w,o + w / sys / devices / device_file

真的不建議你這樣做。 如果我用'\\'一堆什么都沒有調用那個腳本> / dev / sda'它會覆蓋你系統驅動器的(可能的)根。

更好的想法是讓腳本檢查“$ 1”是什么,然后將0或1回顯到設備,如果兩者都不做則不做任何事情。 即不要信任用戶數據,尤其是在suid腳本中!

case "$1" in
    enable)   VALUE=1 ;;
    disable)  VALUE=0 ;;
    *)        exit  ;;
esac
echo $VALUE > /sys/devices/device_file

更好的是,你有一個守護進程,你根據它在管道中得到的東西,根據它看到一個命名的管道(有效地)執行上面的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM