【问题标题】:bash: open file descriptor with sudo rightsbash:使用 sudo 权限打开文件描述符
【发布时间】:2017-12-18 13:31:36
【问题描述】:

在我的脚本中,我想打开一个特定的(设备驱动程序)文件作为 FD 3。 exec 3< 在正常情况下可以正常工作。

但是设备驱动文件只能以 root 身份读取,所以我正在寻找一种使用 sudo 以 root 身份打开 FD 的方法。

-> 如何使用 sudo 权限打开文件(描述符)?

不幸的是,我必须在脚本运行时保持文件打开,因此管道输入或输出等技巧不起作用。 另外我不想在 sudo 权限下运行整个脚本。

如果 sudo + exec 根本不可能,另一种解决方案是我可以在后台调用一个程序,例如 sudo tail -f ——但这会带来另一组问题:

  • 如何判断程序调用是否成功
  • 如果调用不成功,如何获取错误消息
  • 如何在执行结束时“杀死”程序。

编辑: 澄清我想要实现的目标:

  • 打开需要root权限的/dev/tpm0
  • 以用户权限执行我的命令
  • 关闭/dev/tpm0

这背后的原因是打开 /dev/tpm0 会阻止其他命令访问 tpm,这在我的情况下很关键。

感谢您的帮助

【问题讨论】:

  • 如果您向我们展示一些演示您要解决的问题的代码,这将更容易回答。
  • 好的,我想要实现的是: * 打开 /dev/tpm0 需要 root 权限 * 使用用户权限执行我的脚本需要做的任何事情 * 关闭 /dev/tpm0 这背后的原因是我必须在脚本运行时阻止对 /dev/tpm0 的访问。 /dev/tpm0 是一个阻塞字符设备。
  • 为什么只能以root身份打开fd?
  • 该文件归用户 root 和组 root 所有,权限为 0600。更改权限可能是另一种选择,但实际上不是首选。

标签: linux bash sudo


【解决方案1】:

你能像下面这样做吗?

# 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 命令失败。

【讨论】:

  • 感谢 larsks,这看起来非常接近我的需要 - 谢谢!仍然存在两个问题 - 输入 sudo 的密码不起作用(但这可以通过事先使用 sudo 做其他事情来规避)并且我不知道如何检测打开是否成功。
  • 如您所说,有多种方法可以解决 sudo 的问题(包括 (a) 允许 此特定命令 没有密码,或者可能 (b) 获取脚本中前面的凭据等)。检测打开是否成功有点棘手,因为我们没有从失败的 i/o 重定向中获得返回码。我添加了几个选项。
  • 一个完全不同的解决方案是运行一个单独的进程(如root),它打开/dev/tpm0并提供一些API(例如,通过一个unix套接字),允许您的非root脚本以受控方式访问它。
  • 再次感谢 - 最后一步:不幸的是 cat /dev/tpm0 立即返回成功。我需要使用tail -f 之类的东西来保持打开状态 - 但如果成功,这将永远不会返回。 ://
  • ...如果您可以选择使用 bash 以外的其他内容,则可以使用 passing a file descriptor between a root process and a non-root process
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多