어떻습니까: sudo를 사용하고 환경, 특히 $SUDO_USER를 설정하지 마십시오.

어떻습니까: sudo를 사용하고 환경, 특히 $SUDO_USER를 설정하지 마십시오.

프로세스를 다른 프로세스로 시작하고 싶고 uid정보가 필요하지 않으므로 실행하기 $(env)전에 환경을 제거했습니다.sudo -u powerlessuser /bin/processCmd

env -i sudo -u powerlessuser /bin/processCmd

sudo는 환경을 다시 채우는 것이 필요하다고 생각하므로 그렇게 하지 말라고 요청하고 싶습니다. 예를 들어, $SUDO_USER명령을 호출한 나(tm)에 대한 정보까지 알려주는 세트가 있는데 powerlessuser, 매우 불분명하다고 생각됩니다. /bin/processCmd도움이 필요하세요?

env -isudo 다음에 스트리핑을 사용하는 것도 가능하다고 생각합니다 . 즉, 다음과 같이 하십시오:

sudo -u powerlessuser /usr/bin/env -i /bin/processCmd

sudo이를 통해 문제는 어느 정도 해결되었지만 정보를 추가하지 않고 이를 수행할 수 있는 방법이 있는지 알고 싶었습니다.맨 8 스도sudo환경 추가에 대한 문서를 찾았 지만 sudo이를 수행하지 않는 방법에 대한 도움말은 없습니다.

@terdonCheck: 불필요한 환경 변수를 모두 정리하고 싶습니다. 어떤 환경 변수가 필요한지 알 수 없지만 질문에 충실하기 위해 $SUDO_USER프로세스를 권한 없는 사용자라고 불러야 하는 이유를 찾지 못했습니다 . 그래서 sudo새지 않게 하는 방법을 알게 되어 기뻐요SUDO_USER

고쳐 쓰다- XY 문제

나는 xy 문제를 피하는 데 매우 관심이 있지만 여기서는 그렇지 않습니다. 그 이유는 실제로 질문에 명시된 것과 다른 문제가 없기 때문입니다.sudo가 아무것도 하지 않게 하는 방법을 찾고 있습니다., 나는 합리적으로 기대할 수 있습니다: sudo는 깨끗한 환경을 얻고 기껏해야 여기에 항목을 추가해서는 안 됩니다 $SUDO_USER. 즉, 이미 문제를 해결했기 때문에 다른 문제는 없을 것이라고 확신합니다 sudo. 즉, 나는 이것을 할 수 있습니다.

sudo -u powerlessuser /usr/bin/env -i /bin/processCmd

"sudo 후에 정리"되므로 follow를 사용하면 env -i문제가 해결되므로 내 문제는 결코 다른 것이 아닙니다. 내가 요구하는 유일한 것은 sudo --empty-env적어도 $SUDO_USER어떤 프로세스가 uid원래 프로세스를 실행했는지 알려주지 않고 빈 환경에서 새 프로세스를 생성할 수 있는 방법이 실제로 있는지 아는 것입니다 sudo.

이 문제를 해결하는 데 관심을 갖고 있는 모든 분들께 감사의 말씀을 전하고 싶습니다! 나도 시간을 좀 두고 있는데, 아직 그런 --empty-env전환이 일어날 가능성이 있을지도 모른다 . 그렇지 않다면 내부 누군가가 sudosudo가 불필요한 것만 넣을 수 있기 때문에 그러한 작업이 불가능하다고 소스를 참조할 수 있을 것입니다 $SUDO_USER.

다시 말하지만 xy 문제는 없습니다. 실제로는 실제로 문제가 아니기 때문입니다. 즉 , "유닉스 철학에서 잘 작동하는 것 중 하나인 sudo후속 작업으로 해결되므로 여기서 단점을 겪지 않습니다. env -i" env -i, 즉 깨끗한 환경. sudosudo는 다른 단일 목적을 가지고 있고 환경 변수 누출에 신경 쓰지 않기 때문에 거기에서 합리적인 동작을 기 대해서는 안됩니다 . 그럼에도 불구하고 sudo환경 변수와 관련된 일부 플래그를 제공한다는 사실은 사람들이 환경 변수를 잘 처리한다고 오해할 수 있습니다.

답변1

도구가 요구 사항을 충족하지 않는 경우 래퍼 스크립트를 사용하여 도구를 개선할 수 있습니다. 나는 이 스크립트를 사용합니다(noenv) 빌드 환경을 깨끗하게 유지합니다. 다음과 같이 사용하세요

sudo -u powerlessuser noenv /bin/processCmd

당신이 요구하는 것을 할 것입니다. (스크립트는 정규화된 경로에 있어야 합니다. 그렇지 않으면 명령에 해당 경로를 제공해야 합니다.)

스크립트:

#!/bin/sh
# $Id: noenv,v 1.3 2014/05/10 22:43:32 tom Exp $
# trim the environment to minimal (PATH may still be long...)
env | sed -e 's/=.*//' -e '/^[  ].*/d' | \
while true
do
    read value
    if test -z "$value" ; then
        # honor assignments to variables in the parameter list
        while test $# != 0
        do
            case "x$1" in
            *=*)
                eval $1
                name=`echo "$1"|sed -e 's/=.*//'`
                export $name
                shift 1
                ;;
            *)
                break
                ;;
            esac
        done
        exec "$@"
        break
    fi
    case "$value" in
    HOME|PATH|USER|_|SHLVL|TMPDIR|LOGNAME)
        ;;
    *\ *|*\(*|*\)*|*\!*)
        #echo "...skipping $value"
        ;;
    *)
        #echo value:"$value"
        unset "$value"
        ;;
    esac
done

/usr/bin/env명확히 하기 위해, 제가 만들고 있는 일부 시스템에는 문제가 없기 때문에 언급된 POSIX 기능을 사용하여 이 글을 작성하지 않았습니다 : options -i. 이들은 다음을 포함하는 오래된 BSD 시스템입니다.썬 OS 4그리고HPUX 10(FreeBSD의 "env" 매뉴얼 페이지와 비교하여 내 메모리를 확인합니다.)

그런데 이 스크립트는 여러 줄의 값을 제거합니다(그러나 이는 발생할 가능성이 있는 유일한 값이며 TERMCAP매우 오래된 시스템에서만 가능합니다). 두 번째 sed 표현식은 tabsum 이 포함된 범위 여야 합니다 space.

POSIX(더 관심이 있을 수 있음)의 경우 함수를 사용하여 상위 환경에서 선택한 값을 전달하는 작업을 수행할 수 있습니다. 예를 들어 다음과 같습니다.

env -i foo="bar"

따라서 둘 다 사용자 정의할 수 있습니다. 변수가 많으면 다루기 힘들 수 있으므로 스크립트를 사용하는 것이 더 좋습니다.

sudoTERMCAP어쨌든 그것을 거부하십시오. 이는 환경에서 이러한 변수를 제거하는 데 도움이 되는 변수의 (긴) 목록입니다.

sudo특정 변수 설정을 고집합니다. 소스 코드 읽기plugins/sudoers/env.c, 끝 부분에 다음 블록이 표시됩니다 rebuild_env.

/* Add the SUDO_USER, SUDO_UID, SUDO_GID environment variables. */
CHECK_SETENV2("SUDO_USER", user_name, true, true);
snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_uid);
CHECK_SETENV2("SUDO_UID", idbuf, true, true);
snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_gid);
CHECK_SETENV2("SUDO_GID", idbuf, true, true);

debug_return_bool(true);

즉, 함수가 성공적으로 반환되기 직전에 자체적으로 설정합니다.변하기 쉬운, 자신의 것을 사용하십시오가치.

답변2

SUDO_USER와 같은 특정 환경 변수만 설정 해제하려는 경우 sudo를 호출할 때 "env -u" 옵션을 사용하여 이를 필터링할 수 있습니다.

예를 들어,

sudo -u powerless env -u SUDO_USER -u SUDO_UID ./some_script.sh

./some_script.sh 스크립트가 실행되는 환경에서 SUDO_USER 및 SUDO_UID를 설정 해제합니다.

sudo와 env가 뒤에 올 때 -u의 의미가 다르기 때문에 순서에 유의하세요.

관련 정보