2017-12-18 371 views
-1

在我的腳本中,我想打開一個特定的(設備驅動程序)文件作爲FD 3. exec 3<在正常情況下正常工作。bash:使用sudo權限打開文件描述符

但是,設備驅動程序文件只能以root身份讀取,所以我正在尋找一種方法來使用sudo以root身份打開FD。

- >如何用sudo權限打開文件(描述符)?

不幸的是我必須保持腳本運行時的文件打開,所以像管道輸入或輸出這樣的技巧不起作用。 另外我不想在sudo權限下運行整個腳本。

如果須藤+ EXEC是根本不可能的,另一種解決方案是,我可以調用程序,在後臺像sudo tail -f - 但這帶來另一些問題:

  • 如何確定是否程序調用成功
  • 如果調用不成功,如何獲取錯誤消息
  • 如何在執行結束時「終止」程序。

編輯: 爲了澄清我想達到的目標:

  • 打開/ dev/tpm0這需要root權限
  • 執行與用戶權限我的命令
  • 密切的/ dev/tpm0

這背後的原因是打開/ dev/tpm0阻止其他命令訪問tpm,這在我的s中是至關重要的ituation。

感謝您的幫助

+1

如果您要向我們展示一些演示您正在嘗試解決的問題的代碼,則這將更容易回答。 – larsks

+0

好吧,我想達到的目標是: *打開/ dev/tpm0這需要root權限 *做任何我的腳本需要做的,與用戶權限 *近的/ dev/tpm0 這背後的原因是,我我的腳本運行時必須阻止對/ dev/tpm0的訪問。 /dev/tpm0是一個阻止字符設備。 – PeterH

+0

爲什麼只能以root身份打開fd? – 123

回答

0

您可以像下面這樣做嗎?

# open the file with root privileges for reading 
exec 3< <(sudo cat /dev/tpm0) 

# read three characters from open file descriptor 
read -n3 somechars <&3 

# read a line from the open file descriptor 
read line <&3 

# close the file descriptor 
exec 3<&- 

爲了檢測失敗的開放,你可以做這樣的事情:

exec 3< <(sudo cat /dev/tpm0 || echo FAILEDCODE) 

然後,當你第一次從FD 3讀,看看你得到的FAILCODE。或者你可以這樣做:

rm -f /tmp/itfailed 
exec 3< <(sudo cat /dev/tpm0 || touch /tmp/itfailed) 

然後檢查/tmp/itfailed;如果存在,則sudo命令失敗。

+0

感謝larsks,這看起來非常接近我所需要的 - 謝謝! 還有兩個問題 - 輸入sudo的密碼不起作用(但這可以預先用sudo做其他事情) ,我不知道如何檢測打開是否成功。 – PeterH

+0

正如你所說,用'sudo'解決這個問題的方法有很多種(包括(a)允許*這個特殊的命令*沒有密碼,或者(b)在腳本的早期獲取憑證等)。檢測打開成功是否有點棘手,因爲我們沒有從失敗的I/O重定向中得到返回代碼。我添加了幾個選項。 – larsks

+0

一個完全不同的解決方案是運行一個單獨的進程(作爲'root')來打開'/ dev/tpm0',並提供一些API(例如通過unix套接字),允許非root用戶腳本訪問它控制時尚。 – larsks