/root/.bashrc의 sudo 명령 사용 설정을 만드는 방법

/root/.bashrc의 sudo 명령 사용 설정을 만드는 방법

특히 .bashrc일부 별칭을 사용자 정의했습니다 .llexport LS_OPTIONS='--color=auto'

불행하게도 와 함께 사용하면 작동하지 않아서 sudo이것도 수정했지만 /root/.bashrc별 차이가 없는 것 같습니다.

sudo env디스플레이 HOME=/rootSHELL=/bin/bash

sudo설정을 사용하여 명령을 얻으려면 어떻게 해야 합니까 /root/.bashrc?

나는 bash이것이 대화형으로 실행될 때만 발생한다는 것을 알고 있으므로 이를 사용자 정의하는 방법에 대한 다른 제안에 열려 있습니다.

답변1

sudo쉘 명령 대신 실행 파일을 실행하십시오. 따라서 별칭에 대해 알지 못합니다. sudo ls처럼 을 실행하면 사용자가 갖고 있는 별칭이 sudo /bin/ls사용되지 않습니다 .ls

sudo ls다음을 에 넣어 별칭을 확장 할 수 있습니다 .bashrc.

alias sudo='sudo '

후행 공백에 유의하십시오. 별칭 확장을 위해 다음 단어를 계속 사용하도록 쉘에 지시합니다 sudo. sudo 다음에 별칭을 확장하는 것이 별칭 유형에 따라 항상 좋은 생각은 아닐 수도 있습니다.

또한 sudo는 환경에서 대부분의 변수를 제거합니다. alias ls='ls $LS_OPTIONS'이것은 명령을 확장할 때 쉘에서 사용하는 쉘 변수이기 때문에 같은 별칭에는 영향을 주지 않습니다 (내보내기는 .bashrc효과가 없습니다). 그러나 이는 명령에 사용되는 변수에 영향을 미칩니다. 예를 들어 LS_COLORSsudo의 구성을 편집하여 특정 환경 변수를 유지하도록 sudo를 구성할 수 있습니다. 실행 visudo하고 다음 줄을 추가합니다.

Defaults env_keep += "LS_COLORS"

이 설정을 사용하면 sudo ll익숙한 색상이 제공됩니다.

또는 sudo -s. 쉘은 구성 파일( ~/.bashrcbash의 경우)을 로드합니다. sudo 구성 방법에 따라 HOME홈 디렉토리로 설정되거나 /root; 을 사용하여 홈 디렉토리를 루트로 설정할 수 있습니다 sudo -Hs. 대신 원래 홈 디렉토리를 유지하려면 를 실행하십시오 sudo env HOME="$HOME" bash.

답변2

응답해주신 분들께 감사드리며, man sudo좀 더 주의 깊게 읽어보도록 유도했습니다.

sudo -s 명령이 지정되지 않으면 대화형 쉘이 실행됩니다.

이 대화형 셸은 /root/.bashrc내 사용자 정의를 사용하므로 포함되어 있습니다.

명령을 별도로 입력해야 하지만 괜찮습니다.

답변3

배경

나는 항상 이 문제가 다음과 같다고 느꼈다.XY 문제. 제목은 그들이 그것에서 무엇이든 얻고 싶어한다는 것을 암시 /root/.bashrc하지만 실제 문제는 파일의 별칭입니다. 이는 불가능하다고 널리 알려져 있습니다.내 Bash 스크립트가 별칭을 인식하지 못하는 이유는 무엇입니까?.

기본적으로 귀하의 별칭은 sudo이식성이 없기 때문에 다른 곳에서는 선택되지 않도록 설계되었습니다. 이것이 제가 별칭에 대해 느끼는 방식입니다.

사용자 환경의 어떤 것도 주어진 컴퓨터에서 실행될 수 있는 스크립트와 소프트웨어에 의해 가정되어서는 안 됩니다. 그러나 어떤 경우에는 $HOME/.bashrc다른 사용자가 대화형 시나리오에서 악용하려는 특정 사용자 계정 내에 별칭이 있을 수 있다는 것을 알고 있습니다 .

간단히 Bash 인터프리터에게 로그인 프로세스 중에 발견한 별칭을 사용할 때 직면하게 되는 일반적인 쉘 동작 이상으로 확장하도록 지시하면 됩니다 sudo.

설정

/root/.bashrc이를 설정하기 위해 루트 사용자 와 파일 에 다음 별칭, 환경 변수 및 함수를 추가했습니다 /root/.bash_profile.

$ grep smurf ~/.bashrc
alias brc_smurf='echo "ran alias from /root/.bashrc"'
export brc_smurf_env='var from /root/.bashrc'
bpf_smurf_func() { echo 'ran func from /root/.bash_profile'; }

$ grep smurf ~/.bash_profile
alias bpf_smurf='echo "ran alias from /root/.bash_profile"'
export bpf_smurf_env='var from /root/.bash_profile'
brc_smurf_func() { echo 'ran func from /root/.bashrc'; }

다른 작업을 수행하지 않으면 다음 중 어느 것도 작동하지 않습니다(당연히).

$ sudo brc_smurf
sudo: brc_smurf: command not found

$ sudo bpf_smurf
sudo: bpf_smurf: command not found

alias별칭 없이 명령이 실행되는 것을 볼 수 있습니다 sudo.

$ sudo alias
$

이 동작은 별칭에 대한 액세스 권한이 있을 것으로 예상해서는 안 된다는 것을 의미합니다. 하지만 계속하자...

1단계 - 별칭을 표시합니다.

다음을 실행하면 bash -ciBash에게 최소한 우리의 내용을 읽도록 지시할 수 있습니다 $HOME/.bashrc.

$ sudo bash -ci 'alias' | grep smurf
alias brc_smurf='echo "ran alias from /root/.bashrc"'

좋아요, 어쩌면 우리가 실행할 수 있을까요?

$ sudo bash -ci 'alias; brc_smurf'
bash: alias; brc_smurf: No such file or directory

2 단계 -shopt -s expand_aliases

아니요. 다시 말하지만, 이것은 의도적으로 설계된 것입니다. 우리는 하지 말아야 할 일을 하고 있으므로 많은 "안전 조치"를 비활성화해야 합니다. 또 다른 "보안"은 Bash입니다.

$ sudo bash -ci 'shopt -s expand_aliases; alias; brc_smurf'
alias brc_smurf='echo "ran alias from /root/.bashrc"'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
ran alias from /root/.bashrc

/root/.bashrc여기에서 루트 사용자에 대한 별칭을 성공적으로 실행했다는 메시지를 볼 수 있습니다 brc_smurf.

3단계 - 환경 변수는 어떻습니까?

위에 표시된 방법을 사용하는 경우에도 이제 작동합니다.

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env'
ran alias from /root/.bashrc
var from /root/.bashrc

4단계 - 함수는 어떻습니까?

예상대로 작동합니다.

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env;brc_smurf_func'
ran alias from /root/.bashrc
var from /root/.bashrc
ran func from /root/.bashrc

너무 오래;

이렇게 하면 환경 변수 + 별칭에 액세스할 수 있습니다 /root/.bashrc.

$ sudo bash -ci 'shopt -s expand_aliases; <cmds>'

테이크아웃

이 방법은 콘텐츠를 활성화 /root/.bashrc하지만 콘텐츠를 선택하지는 않습니다 /root/.bash_profile.

인용하다

답변4

핵심요약: 다음 sudo -i을 실행할 수 있습니다.기능/root/.bashrc별칭이 아닌 정의 하고 이 파일에서 내보낸 변수에 액세스합니다.

스도-나 명령 매개변수

그러나 별칭은 여기서 작동하지 않지만 sudo -i.

전체 분석 및 자세한 내용을 보려면 계속 읽어보세요.


여기에는 몇 가지 문제가 있습니다. 일부는 sudo 작동 방식에, 일부는 bash 자체 작동 방식에...

기본적으로 sudo명령만 검색되고 셸은 무시되므로 별칭 sudo ll( 또는 함수)을 사용하려면 프로세스의 일부로 셸이 호출되는지 확인해야 합니다.ll$PATH

sudo sh한 가지 방법은 or 와 같은 것을 실행하는 것입니다 sudo bash. 하지만 최신 sudo버전(Sudo 1.8.19p1에서 테스트 중)에는 옵션이 있고 -s-i목적으로 사용됩니다.

따라서 시도는 다음과 같습니다. (Bash에 있다고 가정하면 sudo -s ll동일하며 언급한 내용 을 기반으로 한 경우인 것 같습니다 .) 그러나 그것도 작동하지 않습니다. 비대화형에서 셸을 시작하기 때문입니다. , 비로그인 모드, 시작 파일을 읽지 않음. 이는 쉘 스크립트를 작성하고 실행하는 것과 본질적으로 동일합니다. 이 스크립트에서는 별칭(및 함수)에 액세스할 수 없습니다 ...sudo bash -c 'll'$SHELLrcfile#!/bin/bash~/.bashrc

-i다음은 로그인 쉘을 생성하는 옵션 입니다 . 이것이 더 유망한 이유는~ 할 것이다시작 파일을 읽어보세요! 그러나 sudo -i ll(와 동일 sudo bash -l -c 'll')은 여전히 ​​작동하지 않습니다. 그러면 이것이 어떻게 가능합니까?했다별칭의 정의를 읽어보세요 ll.

글쎄, 다음 설명은 쉘이 대화형이 아닌 한 기본적으로 bash는 별칭을 확장하지 않는다는 것입니다. 쉘 은 sudo -i(또는bash -l로그인쉘이지만 여전히 상호 작용할 수 없습니다.

따라서 다음 단계는인터렉티브껍질, 그럼일하다:

sudo bash -i -c 'll'

(또한 소유로그인그리고인터렉티브또한 좋습니다. 물론 bash -l -i -c ...작동할 것입니다. )

또 다른 옵션은 계속 사용하는 것입니다.로그인쉘(비대화형)이지만 별칭을 확장하도록 명시적으로 요청하므로 이 방법도 작동합니다.

sudo bash -l -O expand_aliases -c 'll'

(배쉬의 경우인터렉티브불필요한로그인셸은 초기화 파일을 읽는 데 충분하지만 이 파일은 -l읽어야 합니다. )

이것은 꽤 긴 명령줄입니다... 그리고 전체 쉘 명령을 인용해야 하기 때문에 인수를 사용하여 별칭을 호출하는 경우 모든 것을 문자열로 변환해야 합니다... 그래서 사용하기가 다소 어색합니다. ..

앞서 제가 별칭과기능…이 기능은 실제로 더 편리하기 때문에 의도적인 것입니다. 정의를 얻는 한, 쉘에서 함수를 실행하기 위해 특별한 것(예: 대화형 쉘이 있거나 특정 옵션 설정)이 필요하지 않습니다.

ll따라서 다음 과 같이 정의하면기능-i별칭 대신 sudo의 바로가기를 통해 직접 사용할 수 있습니다 .

sudo -i ll

더 긴 명령줄과 인수가 있는 경우 여기에 직접 전달할 수도 있습니다.

sudo -i ll -C -R /etc

(비교하면 sudo bash -i -c 'll -C -R /etc'.)

함수는 또한 더 유연하고 일반적으로 유지 관리가 더 쉽습니다... 일반적으로 별칭을 함수로 변환하는 것은 쉽습니다. 유일한 주의 사항은 항상 "$@"추가 인수가 필요한 곳(보통 별칭에서)을 사용하는 것입니다.

예를 들어 다음 별칭은 다음과 같습니다.

alias ll='ls $LS_OPTIONS -l'

다음 기능으로 변경할 수 있습니다.

ll () {
    ls $LS_OPTIONS -l "$@"
}

대부분의 경우에는 동일합니다. 그리고 앞서 언급한 것처럼 이 기능은 에서 직접 액세스할 수 있어야 하므로 sudo -i이는 추가 보너스입니다.

이 답변과 설명이 도움이 되었기를 바랍니다.

관련 정보