如何向包含 sudo 循环的脚本重复提供密码?

如何向包含 sudo 循环的脚本重复提供密码?

我有一个脚本,其中包含

while true
  sudo mycmd
  sleep 10000
  [ ... ] ; break
end

当我在 bash 中运行脚本时,在运行完sudo mycmd.

我记得yes | somecommand可以重复提供yes作为标准输入somecommand,作为“是或否”重复问题的答案。我想知道如何向脚本重复提供密码?

谢谢。

答案1

密码可以通过管道传输到sudo命令中,但这一点也不安全,如果可能的话应该避免。

echo 'hunter2' | sudo -S mycmd

更好的方法是只运行整个脚本sudo并且只需要密码一次。

也可以完全避免使用密码sudo,但出于安全原因也不建议使用。这可以通过/etc/sudoers使用visudo命令更新文件并为组中的所有用户包含诸如此类的行来完成wheel

%wheel ALL=(ALL) NOPASSWD: ALL

要仅为单个用户禁用它,%wheel请使用用户的用户名切换。

答案2

你问:

如何向脚本重复提供我的密码?

埃瓦特的回答展示了一种直接的方法。

正如 ewatt 提到的,对“sudo mycmd”规则使用“NOPASSWD”标志将完全避免询问您的密码。

或者,如果您不想在脚本中对密码进行硬编码,请告诉 sudo 可以缓存此特定命令的密码,直到下次重新启动为止,方法是设置时间戳超时为负值。在这里,我为命令定义了一个别名(任意替换为 /tmp/mycmd.sh)并在Defaults定义中使用它。

Cmnd_Alias MYCMD = /tmp/mycmd.sh
Defaults!MYCMD timestamp_timeout=-1
tim ALL = MYCMD

或者,你可以设置用户级超时默认值:

Defaults:tim timestamp_timeout=-1

...这意味着你的时间戳为任何sudo 命令将被缓存,直到下次重新启动。

或者,仍然可以对任何命令和任何用户进行超时,但在特定的情况下主持人:

Defaults@thishost timestamp_timeout=-1

以这种方式设置 timestamp_timeout 可以让 sudo 在您第一次输入密码后缓存您的密码。

如果您实施其中一个Defaults选项以避免在脚本的每个循环期间输入密码,但更喜欢为单独的活动输入密码的安全网,则运行sudo -k告诉 sudo “杀死”(或重置)您的时间戳,以便下次系统会提示您输入。请注意,每次对 sudo 进行身份验证时,您都将重新启动此“缓存”...“重置”过程。

如果“直到下次重新启动”对您来说太长,那么请将其设置为“足够”大于 10000 秒(以分钟为单位)的值,因此大于 166! -- 让您注意到并输入每个循环的密码。

相关内容