我有一个如下所示的脚本(test1.sh),我需要以 root 身份运行它,因为作为先决条件,我们需要在进入此脚本时安装几个软件包,值 $EUID 应该非零,可以你帮我改变这个$EUID值
测试1.sh
#!/usr/bin/env bash
if [[ $EUID -eq 0 ]]; then
echo "This script must be run as nonroot user. Otherwise, couple of test
cases will fail."
exit 1
fi
答案1
只有 zsh shell 支持更改有效用户。这是通过更改$EUID
下面调用系统调用的特殊变量的值来完成的setresuid()
。您还可以设置UID
变量来设置真实和有效的用户 ID,或者分配给USERNAME
它来模拟登录并根据系统用户设置真实有效的 uid 以及真实有效的组 ID 和补充组 ID 列表数据库。
在bash shell中,$EUID
是只读的,反映了正在运行的进程的有效用户id的值bash
,并且不能更改。
在 中bash
,您需要运行单独的命令(例如perl
, zsh
, )su
sudo
来更改用户 ID。例如:
#! /usr/bin/env bash
if (( EUID == 0 )); then
exec zsh -c 'EUID=123; exec bash -p "$0" "$@"' "$0" "$@"
# or
exec perl -e '$> = 123; exec @ARGV' bash -p "$0" "$@"
fi
zsh
会导致脚本在更改 euid的帮助下使用 euid 123 重新执行自身。
那只设置有效用户 ID。因此,该-p
选项bash
不喜欢其有效 uid 与真实用户 id 不同。
您最好更改真实的 uid ( UID=123
) ,甚至模拟真实的登录,使其处于正常情况下,其中 uids/gids 与用户数据库 ( USERNAME=realuser
) 匹配,对此您也可以使用su
或sudo
:
exec su realuser -c 'exec "$0" ${1+"$@"}' bash "$0" "$@"
(假设 的登录 shellrealuser
是类似 Bourne 的)
exec sudo -u realuser bash "$0" "$@"
(注意,sudo
可能不仅仅只是更改 uids/gids)