/root/.bashrc의 설정을 사용하기 위해 sudo 명령을 얻는 방법


9

.bashrc여러 별칭으로 구체적으로 사용자 정의 ll했으며export LS_OPTIONS='--color=auto'

불행히도와 함께 사용하면 작동하지 않으므로 sudo수정 했음에도 /root/.bashrc불구하고 아무런 차이가 없었습니다.

sudo envHOME=/rootSHELL=/bin/bash

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

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


@ daniel-gelling-나는 항상이 Q가 XY 문제 인 것처럼 느꼈습니다 -meta.stackexchange.com/questions/66377/what-is-the-xy-problem . 제목은 그들이 무엇이든 원 /root/.bashrc하지만 실제로 Q가 따르는 것은이 파일의 별명입니다-이것은 unix.stackexchange.com/questions/1496/…에 따라 가능하지 않습니다 .
slm

@slm 내가하고 싶은 것은 bashrc에 메소드를 추가하는 것입니다. 개인용 .bashrc 파일과 루트에 대한 .bashrc 파일에서 수행 한 것처럼 : -r옵션 을 "비활성화"합니다 . 이것은 어느 한 사용자로 로그인했을 때 작동하지만, 실행할 때 여전히 실행됩니다. crontabcrontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}sudo crontab -r
Daniel Gelling

@DanielGelling-내 대답이 당신에게 적합한 지 확인하십시오.
slm

답변:


6

sudo쉘 명령이 아닌 실행 파일을 실행합니다. 따라서 별칭에 대해 알지 못합니다. 을 (를) 실행하면 ( sudo ls와) 같은 별칭이 sudo /bin/ls사용되지 않습니다 ls.

sudo ls에 다음을 입력하여 별칭을 확장 시킬 수 있습니다 .bashrc.

alias sudo='sudo '

후행 공백에 주목하십시오. 이것은 뒤에 나오는 단어로 쉘이 별명 확장을 계속하도록 지시합니다 sudo. sudo 후에 별칭을 확장하는 것이 항상 좋은 생각은 아니지만 사용하는 별칭의 종류에 따라 다릅니다.

또한 sudo는 환경에서 대부분의 변수를 제거합니다. 이 alias ls='ls $LS_OPTIONS'명령은 명령을 확장하는 동안 쉘에서 사용하는 쉘 변수이기 때문에 별명에는 영향을 미치지 않습니다 .bashrc. 그러나와 같이 명령에 사용되는 변수에 영향을 미칩니다 LS_COLORS. 구성을 편집하여 특정 환경 변수를 유지하도록 sudo를 구성 할 수 있습니다. 실행 visudo및 라인 추가

Defaults env_keep += "LS_COLORS"

이 설정을 sudo ll사용하면 익숙한 색상을 얻을 수 있습니다.

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


3

대답 한 사람들 덕분에 man sudo좀 더 자세히 읽어 보았습니다 .

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

이 대화식 쉘은 /root/.bashrc사용자 정의를 사용 하므로 포함합니다.

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


2

배경

나는 항상이 질문이 XY 문제인 것처럼 느꼈다 . 제목은 그들이 무엇이든 원 /root/.bashrc하지만 실제로 문제가 된 것은이 파일의 별칭 이라는 것을 의미 합니다. .

기본적으로 의도적으로 별칭이 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

TLDR;

다음에서 환경 변수 + 별명에 액세스 할 수 있습니다 /root/.bashrc.

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

빼앗아

이 방법은의 내용을 활성화하지만의 내용을 /root/.bashrc선택하지는 않습니다 /root/.bash_profile.

참고 문헌


그러나 그들 사이에 약간의 차이가 있지만 여기서는 자세히 설명하지 않겠습니다. ;-). 어쨌든, 당신은 질문에 대한 의견에서 언급 한 상황을 도울 수 있습니까 .bashrc? 특히 -r옵션을 제거 crontab하시겠습니까?
Daniel Gelling

좋아,하지만 이것은 내가 sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'대신 실행해야한다는 것을 의미합니다 . 간단한 sudo echo $brc_smurf_env?
Daniel Gelling

alias를 표시 할 수 있습니다. 간단히 표시하기 위해해야 ​​할 것sudo bash -ci 'shopt -s expand_aliases; <cmds>'
slm

그것은 루트에 대한 crontab을 편집하기 위해 많은 타이핑이 될 것입니다. 별명을 만들어 봅시다 :
Daniel Gelling

@DanielGelling-p, 쉘 창자에서 모든 재미에 오신 것을 환영합니다.
slm

0

/ etc / sudoers 파일에는 특히 sudo 명령이 실행될 때 환경을 설정하는 많은 설정이 있습니다 (예 : PATH에 신뢰할 수있는 위치 만 있는지 확인하십시오). 환경을 설정하기 위해 셸에서 실제 명령을 실행하는 경우 수행중인 작업을 수행하지 못할 수 있습니다. Sudoing은 루트 로그인 쉘을 제공하지 않으므로 일반 프로파일을 설정하지 않습니다.


0

/root/.bashrc를 다음과 같이 편집한다고 가정 해 봅시다.

$ sudo su -
Password: ******
# cat ~/.bashrc

echo "root bashrc file was read"
PATH=~/bin:$PATH
echo "$PATH"
export USERVAR=set
echo "$USERVAR"

umask 022
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'

bash가 파일을 읽도록 로그 아웃했다가 다시 로그인 할 수있게합니다.

# exit
$ sudo su -
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@here:~# alias l
alias l='ls $LS_OPTIONS -lA'
root@here:~# 

보시다시피 파일을 읽고 PATH를 변경하고 별칭을 설정했습니다. 요청한대로 모두 작동합니다.

그러나 sudo는 여전히 예상대로 작동하지 않습니다.

root@here:~# exit
$ sudo env | grep USERVAR              # no output 
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

PATH가 변경되지 않았습니다. sudoers에서 경로를 변경하는 방법이있을 수 있지만 그렇게하지 않는 것이 좋습니다. 어쨌든 별칭, 기능 및 기타 변경 사항은 PATH 만 변경해도 적용되지 않습니다. 파일을 소싱해야합니다. 모든 스크립트 나 명령에 대해 그렇게하면 컴퓨터는 실질적인 이점없이 더 많은 작업을 수행하도록 요구합니다. 스크립트는 별칭을 사용하지 않습니다 (스크립트 내에서는 별칭을 실제로 사용하지 않습니다).

로그인 만하면 .bashrc파일이 자동으로로드되어 작동합니다.

다음과 같이 bash를 시작할 수 있습니다.

$ sudo bash
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@mail:/home/isaac/me/temp/clocks-master#

그러나 위에서 볼 수 있듯이 pwd (작업 디렉토리)는 변경되지 않았으며 조금 더 살펴보면 일부 다른 설정도 변경되지 않았습니다. 이것이 올바른 명령을 사용하는 이유입니다.

$ sudo su -

해당 명령이 입력하기에 너무 긴 경우 해당 명령이 사용될 사용자 (루트 아님)에서 별명 또는 함수를 작성하십시오.

$ alias mysu='sudo su -'
$ mysu
# 

0

TL; DR : 별명이 아닌 정의 된 함수sudo -i 를 실행하고 해당 파일에서 내 보낸 변수에 액세스 할 수 있습니다./root/.bashrc

sudo -i  명령 인수

그러나 별칭은 작동하지 않지만에 사용할 수있게하려면 함수로 쉽게 변환 할 수 있습니다 sudo -i.

전체 분석 및 자세한 내용은 계속 읽으십시오.


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

기본적으로 sudo명령 만 찾고 셸을 무시하므로 의 디렉토리 중 하나에 실행 파일이있는 sudo ll경우에만 간단하게 실행 됩니다 . 따라서 별명 (또는 함수)을 사용하려면 프로세스의 일부로 쉘을 호출해야합니다.ll$PATH

현대적인 (sudo 1.8.19p1에서 이것을 테스트하고 있습니다) 옵션 과 그 목적을 가지고 있지만 한 가지 방법은 sudo sh또는 과 같은 것을 실행 하는 것입니다.sudo bashsudo-s-i

따라서 한 시도는 sudo -s ll( 당신이 언급 한 바에 근거한 Bash 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'

bash가 대화 형 인 경우 초기화 셸을 읽을 수 있기 때문에 로그인 셸이 필요하지 않았지만 로그인 셸이 필요 -l했습니다.

이것들은 상당히 긴 명령 줄입니다 ... 또한 전체 쉘 명령을 인용해야하므로 인수가있는 별칭을 호출하는 경우 모든 것을 문자열로 바꿔야합니다. 그래서 일종의 서투른 ...

이전에 별칭과 함수 에 대해 이야기했습니다 ... 함수는 실제로 여기에서 훨씬 더 편리하기 때문에 의도적이었습니다. 정의를 소싱하는 한 쉘에서 함수를 실행하기 위해 대화식 쉘을 가지고 있거나 특정 옵션을 설정하는 것과 같은 특별한 것은 필요하지 않습니다.

따라서 별칭 대신 함수ll 로 정의한 경우 sudo의 바로 가기 와 함께 직접 사용할 수 있습니다 .-i

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하므로 추가 보너스입니다.

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


DV-나는 이것이 이미 존재하는 것보다 더 상황을 개선하고 있다고 생각하지 않습니다.
slm

1
내가 더 이전의 대답은 형태를 언급하지 않기 때문에 내 대답은 뭔가를 추가 생각 하는가 @slm sudo -i command arguments실행할 수 있도록 기능 에서을 /root/.bashrc내 보낸 변수를 사용할 수 있습니다. 그러나 내 대답이 너무 길었고 그 정보가 다소 묻혀있는 것을 보았습니다 ... 그래서 TL; DR을 추가하여 요약했습니다 (조사의 기술적 세부 사항을 계속 유지하면서). 다시 한 번 살펴보십시오.
filbranden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.