需要sudo的脚本是否应该失败(如果没有),或者使用sudo和提示符?


26

我有一个脚本,可以对背光亮度进行精细控制,并且需要sudo运行。本质上是这样的:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | tee $backlight

并居住在~/bin/backlight-adjust。该脚本需要sudo特权,因为tee $backlight正在写入特权位置。因此,如果不与一起运行,它将失败sudo

这种方法有一个问题,因为我不能随便跑sudo backlight-adjust,因为~/bin不在$PATHsudo环境下,只有在我的环境。所以我必须运行sudo env "PATH=$PATH" backlight-adjust或类似的方法。

或者,我可以这样写:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | sudo tee $backlight

并提示我输入密码。

第二种方法对我来说更好,因为我不必记住键入sudo。它会提示我。而且我可以保持$PATH原样。总体上来说,这样做更方便,但是有什么原因使我不应该第二种方式呢?

(如果正在运行Xubuntu 14.04,并且我的shell是GNU bash 4.2.45,则可以这样做。)


感谢您的更正。我正在运行经过修改的Debian(LMDE),sudo实际上$PATH默认情况下是保留我的身份,所以我没有这个问题。
terdon

Answers:


27

就个人而言,我将使用其他方法。为您的脚本命名。将此行添加到您的行~/.bashrc(或其他shell中的等效行)

alias backlight-adjust='sudo ~/bin/backlight-adjust'

这样,您就不必担心使用它来运行它,sudo也不需要将其添加sudo到脚本中。它对您完全透明,并且在您尝试运行时仅要求输入密码backlight-adjust


这似乎是一种非常明智的方法,并且对系统的其余部分影响最小。+1。
John Feminella 2014年

@JohnFeminella另一方面,如果您想与其他任何人共享此脚本,他们也将需要别名。就我个人而言,我看不出没有放入sudo实际脚本的任何理由,特别是因为这使您可以轻松地查看脚本中哪些元素实际上需要root权限。
凯尔·斯特兰德

@KyleStrand不,他们不会。脚本调用的命令只会抱怨没有访问权限。
terdon

@terdon我认识到我本可以稍微清楚一点,但是想必您知道我的意思:脚本的接收者将面临脚本作者最初面临的相同问题,作为一个尽职尽责的脚本共享者,作者应该还分享他们针对此特定使用难题的个人解决方案。
凯尔·斯特兰德

@KyleStrand是的,但是没有问题,OP唯一的问题是他不想“必须记住键入sudo”,除此之外,脚本将是完全可移植的。我的意思是,别名是完全可选的,不会解决任何问题,只是使它更易于使用。
terdon

7

我看不出为什么它可能是不正确的---尽管我通常更喜欢命令不会问我一些问题,所以它们是可编写脚本的。您可以调整/etc/sudoers使其sudo在没有密码的情况下工作。

但是...为什么不添加

chgrp  one-of-your-groups-here /sys/class/backlight/acpi_video0/brightness     
chmod g+w /sys/class/backlight/acpi_video0/brightness 

在你/etc/rc.local那里忘记了sudo吗?

(在Ubuntu中,如果您能够使用sudo,则属于sudo组,因此您可以使用它chgrp sudo /sys...并对此感到满意。)


3

或者,您可以添加

Defaults        env_keep +="PATH"

到您的/etc/sudoers文件。


2

您声明sudo背光调整,因为〜/ bin在sudo环境中不在$ PATH中

那么为什么要依靠它呢?我认为您应该将该行更改为/home/user/bin/backlight-adjust,它将起作用。

但是我真的很喜欢Terdon也使用别名的解决方案。或者,您可以将脚本放入其中,/usr/bin/并且该脚本将对每个用户(包括root)可用。


是的,但是这样做很烦人。否则,首先将它放在我的$ PATH中有什么意义?另外,我喜欢安装它,~/bin因为它位于我家的dotfiles存储库下,因此它保持在版本控制中。
John Feminella 2014年

@JohnFeminella顺便说一句,没有理由更改路径,只需使用-E标记保存环境即可:sudo -E command
terdon

@terdon在Debian中不起作用;由于安全原因,它已被覆盖。正如我在问题(sudo env "PATH=$PATH" ...)中提到的那样,您必须显式传递环境变量。
John Feminella 2014年

1

无法给出一般规则...如果脚本/程序旨在进行一些重新配置(例如,打印机)并由常规用户调用,则必须这样做。否则,我会独自待在一个很好的地方:如果普通用户运行它,那就失败了(要么是因为进行了明确的检查,要么是因为它不允许做某事)。

如果有的话,应该少发一些特权。切换到更高的特权是棘手的,最好将它留给专家(例如sudo(1))。


0

我个人${SUDO}在脚本中使用了类似的内容,以便调用者可以根据需要进行设置,也${SUDO:-sudo}可以默认使用它。

不过,在您的特定情况下,我的答案是可以接受的。


-1

将脚本(不带sudo)放在适当的用户范围内,例如/bin,然后执行以下操作:

sudo chown root /bin/backlight-adjust
sudo chmod 4755 /bin/backlight-adjust

这通过设置setuid标志来起作用,这意味着它将始终以文件所有者的身份运行。有关详细信息,请阅读http://major.io/2007/02/13/chmod-and-the-mysterious-first-octet/。我对它的工作原理并不十分了解,我只是根据几年前我读过的东西发现它在谷歌搜索。


1
Shell脚本不能再设置为setuid了,谢天谢地……您知道,这是一个完全邪恶的答案。安全方面尤其如此。
mirabilos 2014年

@mirabilos只有在组或常规写标志处于打开状态时,这才是危险的。setuid的风险是,具有文件写许可权的任何人都可以像用户一样运行任何他们喜欢的东西,因此需要保护这些写许可权。4755表示始终以所有者身份执行,所有者可以读取,写入和执行,组可以读取和执行以及用户可以读取和执行,这是应该允许任何用户使用root权限执行的操作的标准权限级别。
AJMansfield 2014年

@mirabilos而且,使用setuid的shell脚本比使用setuid的二进制文件引入更多漏洞的想法很愚蠢;二进制文件也不能幸免于ptrace攻击,这是利用setuid的主要攻击。
AJMansfield 2014年

2
当前所有类似于Unix的操作系统都禁止setuid脚本。这只是事实。如果您不相信我,请自己问原因。从OpenBSD开始。
mirabilos 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.