在Bash脚本中使用sudo执行单个命令

8

这可能是一个愚蠢的问题。

我有一个脚本,希望在Mac OS X和Linux上都能使用。在OS X中,脚本中的一个命令需要sudo,而在Linux上则不需要。

简而言之,如何在脚本中运行一个带sudo的命令,然后取消其余脚本的提升权限?

我尝试过使用

su -

and

su -c

但它们似乎都出现了错误(它们会说“抱歉”然后继续,我猜测是因为它试图以root身份运行,而root没有密码)。

我知道一定有一个愚蠢且容易的方法来解决这个问题,大家有什么建议吗?

3个回答

7

您可以通过以下方式“撤销”sudo权限(实际上是:提前关闭sudo时间窗口):

sudo -k

此外,您可以配置sudo仅允许在某些命令上提升权限,甚至为特定命令模拟非root用户。请参见man sudoers。其中的示例部分非常清楚地表明,sudo的可配置性几乎没有限制(角色、主机、命令、允许转义、允许sudo目标用户、允许授权等等)。希望以下内容对您有所帮助:

The user fred can run commands as any user in the DB Runas_Alias (oracle or sybase) without giving a password.

   fred           ALL = (DB) NOPASSWD: ALL

如果您不想或不太想去修改/etc/sudoers (使用visudo!),我建议使用类似以下的方法:

{
     trap "sudo -k" EXIT INT QUIT TERM
     sudo ls # whatever
}

这正是我所需要的。运行该命令,然后运行sudo -k。非常感谢。 - rick
谢谢sudoers;正是我所需要的。 - Dan Sinclair

0
尝试使用sudo su而不是su来切换回普通用户。

当我尝试执行命令"sudo su umount /dev/disk1"时,会出现"su: unknown login: umount"的错误提示。通过查看sudo的手册,我只能得出它正在寻找名为"umount"的用户? - rick
@rick:是的,它正在寻找名为“umount”的用户。su用于切换到不同的用户(通常是root),只能作为root运行,因此它接受的参数是用户名。sudo用于以不同的用户身份运行单个命令。在您的示例中,您要运行命令su umount /dev/disk1作为root,然后说您要更改为用户umount(带有一个额外的被忽略的参数)。 - Adam Rosenfield

0

使用sudo而不是su

#!/bin/bash
whoami  # Runs under your regular account
sudo whoami  # Runs as root
whoami  # Runs under your regular account again

当我运行它时,这是输出结果:

$ ./sudotest
gordon
Password:
root
gordon

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