【问题标题】:sudo asks for a password instead of getting it from stdinsudo 要求输入密码而不是从标准输入中获取密码
【发布时间】:2022-06-25 02:01:56
【问题描述】:

我在打开的终端窗口中运行了一个脚本:

while sleep 345600; \
  do pass="$(security find-generic-password -w -s 'service' -a 'account')"; \
     sudo --stdin <<< "${pass}" head /etc/hosts; \
done

当进行测试时,我手动运行此脚本并将 sleep 设置为 1,它按预期工作,sudo 在没有用户交互的情况下获得通过。然后,当我延迟 4 天运行脚本时,它不会在指定时间内运行相同的说法,sudo 等待来自用户终端的密码(即手动输入!)。我什至可以将pass 变量设置为包含实际的纯文本密码,但无济于事。

为什么会有这种差异?

【问题讨论】:

  • macOS sudo 与 Linux sudo 非常不同。在macos下可能不行
  • --stdin 选项不存在 - 请参阅 the macos sudo man-page - 实际上根据手册页,只允许使用单字符选项。也许这就是--stdin 没有产生错误消息的原因,而只是将其作为sudo 的正常参数。
  • @user1934428 ,系统 sudo 手册页(截至 2020 年)显示允许短选项和长选项。
  • 如果您查看我发布的链接,它会在页面底部显示 2022。如果您可以发布指向您所引用的手册页的链接,将会很有帮助。
  • 差异可能是由于 sudo 在每次成功运行后将凭据缓存 5 分钟。在运行之间执行sudo -K 以删除这些以进行测试。

标签: zsh sudo macos-big-sur iterm


【解决方案1】:

将所需的特定命令添加到 sudoers 配置并允许它在没有密码的情况下运行可能更安全(有关 macOS 上的示例,请参阅https://apple.stackexchange.com/q/398656)。

如果这不是一个选项,您可以尝试使用--askpass 选项:它获取一个命令的路径,该命令将在调用时在标准输出上输出用户的密码。将find-generic-password 命令放入帮助脚本并将其传递给--askpass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-18
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2014-06-29
    • 2022-01-11
    相关资源
    最近更新 更多