阻止某些命令以超级用户权限执行

阻止某些命令以超级用户权限执行

我是bash新手。我编写了一个由许多行和命令组成的脚本。这是用于获取和安装多个软件包的安装文件。因此,我需要在脚本中使用许多安装命令,例如以下命令:

sudo apt install python2.7 python-pip

为了避免sudo在脚本中使用这么多命令,我决定sudo在每个命令之前删除并执行类似sudo ./setup.sh.

sudo它工作正常,但问题是有一些命令在它们之前并不真正需要,例如mkdir,wget和 ...

当我使用 运行脚本时sudo ./setup.sh,如果不使用 ,则无法删除、复制或编辑使用此脚本创建的目录sudo,但是我希望所有用户都可以访问它们。因此,我的问题是:

当使用 sudo (如 )运行脚本时sudo ./setup.sh,有什么方法可以不执行某些内部命令(例如mkdirwget以超级用户权限)?

答案1

当您使用 时,您将以您告诉切换到的sudo任何用户(默认情况下为 root)身份启动一个新 shell 。sudo这会将SUDO_USER变量设置为该用户的用户名:

$ cat foo.sh
#!/bin/bash
echo "SUDO_USER: $SUDO_USER"

如果我像我一样运行这个脚本,我什么也得不到,因为变量没有设置:

$ foo.sh
SUDO_USER: 

但如果我用 运行它sudo,变量就会被设置:

$ sudo foo.sh
SUDO_USER: terdon

考虑到这一点,您可以使用启动脚本的用户的用户名来简单地以普通用户身份运行您想要运行的特定命令。因此,在脚本中更改您的wgetchmod以及您想要作为普通用户运行的任何其他命令,并使它们运行,sudo -u $SUDO_USER以便它们将以普通用户而不是 root 的身份运行:

apt install python2.7 python-pip ## will run as root
sudo -u $SUDO_USER mkdir foo ## will run as $SUDO_USER

使用该SUDO_USER变量可确保您创建的任何目录和文件都由启动该脚本的用户拥有,并且您无需在每次运行脚本时显式告诉脚本该用户的名称。

答案2

要使 mkdir 创建的目录可供所有用户使用,需要使用 chmod 命令将权限更改为 WORLD 可读/写。

在脚本中,执行后mkdir,使用以下命令:

chmod -R 755  «directory-name»

(所有人可读,仅root可写)

或者

chmod -R 777  «directory-name» 

(系统中所有用户可读可写)

对于wget,请chmod下载后使用该命令。

或者

如果您想以其他用户身份执行命令,请使用 su 命令:

su - «username» -c 'command to be executed'

相关内容