我有一个脚本,其中包含
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! -- 让您注意到并输入每个循环的密码。