2017-12-18 300 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