首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用"sudo -c“代替"sudo”总是好吗?

用"sudo -c“代替"sudo”总是好吗?
EN

Unix & Linux用户
提问于 2021-08-25 13:17:19
回答 2查看 2K关注 0票数 4

我们只讨论Debian/Ubuntu操作系统。(如果冒犯了,请道歉,因为我只熟悉这两个)

第二,我们讨论的是一个只具有sudo特权的非根用户。

每次我要使用sudo特权运行命令时,我总是问自己是使用sudo bash -c 'command'还是只使用sudo command,这对我来说有点痛苦。

因为在某些情况下sudo command不能直接工作,比如,sudo echo "smth" >> /etc/privilegedfile

但是它似乎总是使用sudo sh -c "echo 'smth' >> /etc/privilegedfile"sudo bash -c "echo 'smth' >> /etc/privilegedfile"来工作。

(或者使用其他工具,比如tee来使其工作。)

所以问题是,

是否有任何情况(例外) sudo bash -c 'command'无法执行,但只有sudo command可以执行?

is使用 sudo bash -c instead sudo 永远使用

EN

回答 2

Unix & Linux用户

发布于 2021-08-25 14:03:32

sudo bash -csudo有很大的不同,因为可以将sudo配置为向运行特定命令的特定用户授予权限。因此,您可能会发现自己处于允许运行sudo command (对于command的某些值)的设置中,而不是sudo bash

一般来说,尽量具体是个好主意,所以喜欢sudo command而不是sudo bash -c command

票数 11
EN

Unix & Linux用户

发布于 2021-08-26 01:06:22

bash -c与sudo结合使用比单独使用sudo要危险得多。在shell上运行命令时,shell会以各种方式处理和扩展许多特殊字符。例如,rm *.txt,您键入的shell (通常是bash)正在将*.txt扩展为以.txt结尾的当前文件夹中的文件列表。sudo命令出于对简单性和安全性的渴望,并没有这样做。相反,它只是直接使用传递给它的参数运行命令。例如,假设您在shell上运行了以下代码:

代码语言:javascript
复制
$ file=/etc/passwd
$ sudo vim $file
$ ls *.txt
hello.txt  world.txt
$ sudo rm *.txt

第一行设置变量$file,在当前shell中以sudo vim /etc/passwd的形式运行sudo命令,然后列出并删除所有文本文件。在sudo有机会看到它或运行它之前,它是扩展变量和文件名通配符的shell。在最后一行中,当调用sudo时,它看到它得到了三个参数:rmhello.txtworld.txt。然后,它将rm称为用户根,其中包含两个参数,没有进一步的处理。如果我在它周围使用引号,比如说,sudo rm "*.txt",那么sudo将看到并使用一个参数*.txt调用rm命令。rm命令会从字面上删除这个文件,并尝试删除一个名为"*.txt“的文件,然后发现它不存在。它甚至不会查看以.txt结尾的另外两个文件。这种膨胀是由外壳完成的。

为了证明这一点,当您去掉shell使生活变得更容易的魔力时,我上面列出的命令必须直接编写,而不需要任何变量或通配符,比如:

代码语言:javascript
复制
$ sudo vim /etc/passwd
$ ls hello.txt world.txt
hello.txt  world.txt
$ sudo rm hello.txt world.txt

lsrmsudo本身都不知道如何展开*.txt或$file,这是shell的工作。现在,让我们看看bash -c在sudo内部可能是危险的地方。请不要在家里尝试这个:

代码语言:javascript
复制
$ file=/etc/passwd
$ sudo vim $file
# Take a short break from your computer here...
$ file="/lets/be/malicious; cp /dev/zero /dev/sda"
$ sudo vim $file  # Might see a harmless error here
$ sudo bash -c "vim $file"  # Goodbye hard-drive

虽然我不得不承认,这是一个非常人为的例子,我希望这不是太难想象一些潜在的危险,可能会发生在这里。问题是,您现在将shell作为根扩展元字符。假设您走开了,有人修改了文件变量,将恶意命令嵌入其中,这将清除您的硬盘驱动器。使用sudo vim $file的前一种语法,它将扩展为常规的、无特权的用户并失败。在第二次使用中,它将扩展$file及其内嵌的所有魔法,使其以根用户的身份在完整的shell上运行。

票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/666213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档