这里“sudo -v &&”和“sh /dev/stdin”的用途是什么?

这里“sudo -v &&”和“sh /dev/stdin”的用途是什么?

https://calibre-ebook.com/download_linux

sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin

sudo -v &&鉴于上面man sudo说的,这里的目的是什么

 -v, --validate

更新用户的缓存凭据,必要时对用户进行身份验证。对于 sudoers 插件,默认情况下这会将 sudo 超时再延长 15 分钟,但不会运行命令。并非所有安全策略都支持缓存凭据。

目的是什么sh /dev/stdin? (在 Ubuntu 18.04 中,sh是破折号)

谢谢。

答案1

这里的目的是什么sudo -v &&

我相信这可以最大限度地减少用户的惊讶。考虑两种情况:

  1. 须藤是不是配置为命令需要密码(NOPASSWD 标签)

相对:

  1. 须藤配置为命令需要密码

在第一种情况下,对 sudo 的两次调用都成功,没有任何提示。问题解决了!

在第二种情况下,同样有两种可能性:用户最近已经通过 sudo 身份验证,或者还没有。

  • 如果他们最近进行了身份验证,sudo -v只需更新其缓存凭据的时间戳即可。
  • 如果用户有不是最近通过 sudo 验证,它会提示他们输入密码;一旦通过身份验证,他们的凭据就会被缓存。

一旦该sudo -v过程成功,第二个sudo sh /dev/stdin调用应该使用其缓存的凭据并不间断地运行。

考虑没有初始sudo -v命令的替代方案(其中 sudo 仍配置为提示输入密码)。在这种情况下,wget可能已将输出写入 stdout 或 stderr,这可能会导致用户错过看到它并想知道为什么没有发生任何事情。

目的是什么sh /dev/stdin

这里sh使用一个参数来调用,因为command_file这是一个特殊文件——指向标准输入的链接。

名称破折号——命令解释器(shell)

概要

 dash ...
      [command_file [argument ...]]

结果,sh 读取 command_file,期待并执行其中的命令。该特殊的标准输入“文件”通过管道连接到 的输出wget,因此最终结果是将 URL 的内容发送到根级 shell。

我不知道为什么 Calibre 项目专门选择了这种语法。替代方案包括:

  • ... | sudo sh
  • ... | sudo sh -

相关内容