如何在脚本中使用sudo执行多个命令

7

我们可以使用heredocs来运行多个需要sudo权限的命令吗?

当我运行多个命令时,我遇到了一个问题(需要为每个命令输入密码):

echo 'password'| sudo -S ls
echo 'password'| sudo -S cat /var/log/abc.log

有人能帮我如何在脚本中自动化这个过程吗?比如:
echo 'password' | sudo -S << ENDBLOCK
ls
cat
ENDBLOCK

sudo 会在短时间内(默认为5分钟)记住使用的密码,因此如果第一次运行不需要太长时间,第二次调用就无需提供密码。然而,更好的解决方案是配置 sudo 允许您的特定命令在不提供密码的情况下运行,这样可以完全避免密码出现在脚本中。 - chepner
3个回答

6

您可以运行sh -c ...,但请记得正确使用引号。

sudo sh -c 'id; echo another command ; id'

sudo 命令必须将其视为 sh 命令的单个参数。

当然,您也可以使用换行符代替分号:

sudo sh -c '
  echo "I am root"
  id
  echo "another command"
  id
'

请问一下,当我们远程运行它时,它会怎么样? - Sasikiran Vaddi
如果您能具体说明问题,我可以尝试解决。您想要做什么,它是如何失败的?通过ssh运行吗? - Michał Šrajer
在我的脚本中,我将使用sudo用户" sasi "登录到VM,然后需要执行一些命令,如" mv"、" sed"等。然后我遇到了以下问题:sudo: no tty present and no askpass program specified Sorry, try again. sudo: no tty present and no askpass program specified Sorry, try again. sudo: no tty present and no askpass program specified Sorry, try again. - Sasikiran Vaddi
1
抱歉耽搁了。在这种情况下,考虑在远程机器上创建脚本来完成任务,并在 /etc/sudoers 中声明 NOPASSWD: 标签以供此脚本使用。然后您可以无需密码使用 sudo。顺便说一句,请记得给我的答案点赞;-) - Michał Šrajer
除了将NOPASSWD添加到sudoers之外,是否有其他替代方法? - Sasikiran Vaddi

2

一种方法是编写一个脚本,在其中列出需要使用sudo执行的所有事项,然后通过sudo运行该脚本。


1

你可以将所有命令放在一个脚本中,然后

  • sudo ./script.sh
  • 将script.sh的权限放在/etc/sudoers.d中,这样你就再也不需要为该脚本输入密码了

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接