.bashrc
여러 별칭으로 구체적으로 사용자 정의 ll
했으며export LS_OPTIONS='--color=auto'
불행히도와 함께 사용하면 작동하지 않으므로 sudo
수정 했음에도 /root/.bashrc
불구하고 아무런 차이가 없었습니다.
sudo env
쇼 HOME=/root
와SHELL=/bin/bash
sudo
의 설정을 사용하는 명령을 얻으려면 어떻게 /root/.bashrc
해야합니까?
나는 이것이 bash
대화 형으로 실행될 때만 발생한다는 것을 이해 하므로 사용자 정의 방법에 대한 다른 제안을 할 수 있습니다.
답변
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
. 이 셸은 구성 파일 ( ~/.bashrc
bash 용)을 로드합니다 . sudo 구성 방법에 따라 HOME
홈 디렉토리로 설정되어 있거나로 변경할 수 /root
있습니다. 홈 디렉토리를 루트로 강제 설정할 수 있습니다 sudo -Hs
. 반대로 원래 홈 디렉토리를 유지하려면을 실행하십시오 sudo env HOME="$HOME" bash
.
답변
대답 한 사람들 덕분에 man sudo
좀 더 자세히 읽어 보았습니다 .
sudo -s
명령을 지정하지 않으면 대화식 쉘이 실행됩니다.
이 대화식 쉘은 /root/.bashrc
사용자 정의를 사용 하므로 포함합니다.
명령을 개별적으로 입력해야하지만 괜찮습니다.
답변
배경
나는 항상이 질문이 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 -ci
Bash가 적어도 다음을 읽도록 유도 할 수 있습니다 $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
.
참고 문헌
답변
/ etc / sudoers 파일에는 특히 sudo 명령이 실행될 때 환경을 설정하는 많은 설정이 있습니다 (예 : PATH에 신뢰할 수있는 위치 만 있는지 확인하십시오). 환경을 설정하기 위해 셸에서 실제 명령을 실행하는 경우 수행중인 작업을 수행하지 못할 수 있습니다. Sudoing은 루트 로그인 쉘을 제공하지 않으므로 일반 프로파일을 설정하지 않습니다.
답변
/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
#
답변
TL; DR : 별명이 아닌 정의 된 함수sudo -i
를 실행하고 해당 파일에서 내 보낸 변수에 액세스 할 수 있습니다./root/.bashrc
sudo -i 명령 인수
그러나 별칭은 작동하지 않지만에 사용할 수있게하려면 함수로 쉽게 변환 할 수 있습니다 sudo -i
.
전체 분석 및 자세한 내용은 계속 읽으십시오.
여기에 몇 가지 문제가 있습니다. 일부는 sudo 작동 방식과 일부는 bash 자체 작동 방식에 있습니다 …
기본적으로 sudo
명령 만 찾고 셸을 무시하므로 의 디렉토리 중 하나에 실행 파일이있는 sudo ll
경우에만 간단하게 실행 됩니다 . 따라서 별명 (또는 함수)을 사용하려면 프로세스의 일부로 쉘을 호출해야합니다.ll
$PATH
현대적인 (sudo 1.8.19p1에서 이것을 테스트하고 있습니다) 옵션 과 그 목적을 가지고 있지만 한 가지 방법은 sudo sh
또는 과 같은 것을 실행 하는 것입니다.sudo bash
sudo
-s
-i
따라서 한 시도는 sudo -s ll
( 당신이 언급 한 바에 근거한 Bash sudo bash -c 'll'
라고 가정 할 때 와 동일합니다 .)하지만 비 대화식으로 셸을 시작하기 때문에 작동하지 않습니다. 시작 파일을 읽지 않는 비 로그인 모드 쉘 스크립트를 작성 하여 실행 하는 것과 본질적으로 동일 합니다. 귀하 가 가진 별칭 및 기능 은 해당 스크립트에서 액세스 할 수 없습니다 …$SHELL
rcfile
#!/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
하므로 추가 보너스입니다.
이 답변과 설명이 도움이 되셨기를 바랍니다.