如何在 bash shell 中将 $EUID 值更改为非零

如何在 bash shell 中将 $EUID 值更改为非零

我有一个如下所示的脚本(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) 匹配,对此您也可以使用susudo

exec su realuser -c 'exec "$0" ${1+"$@"}' bash "$0" "$@"

(假设 的登录 shellrealuser是类似 Bourne 的)

exec sudo -u realuser bash "$0" "$@"

(注意,sudo可能不仅仅只是更改 uids/gids)

相关内容