从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 &&
?
我相信这可以最大限度地减少用户的惊讶。考虑两种情况:
- 须藤是不是配置为命令需要密码(NOPASSWD 标签)
相对:
- 须藤是配置为命令需要密码
在第一种情况下,对 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 -