sudo를 사용할 때 별명을 사용할 수 없음


159

나는 오늘 별칭을 가지고 놀고 있었고 다음을 사용하는 동안 별칭을 사용할 수없는 것으로 나타났습니다 sudo.

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

사용하는 동안 별칭을 사용할 수없는 이유가 sudo있습니까?


당신은 / 루트의 .bashrc에 그 별명을 선언나요 /
루치아노 Facchinelli

2
@LucianoFacchinelli : /root/.bashrcsudo를 통해 명령을 실행할 때 읽히지 않습니다.
Flimm


@Flimm : sudo -i어때요?
Evi1M4chine

답변:


250

에 다음 줄을 추가하십시오 ~/.bashrc.

alias sudo='sudo '

로부터 bash는 설명서 :

별명을 사용하면 간단한 명령의 첫 단어로 사용될 때 문자열을 단어로 대체 할 수 있습니다. 쉘은 alias 및 unalias 내장 명령으로 설정 및 설정 해제 할 수있는 별명 목록을 유지 보수합니다.

인용되지 않은 경우 각 단순 명령의 첫 단어는 별명이 있는지 확인합니다 . 그렇다면 해당 단어가 별칭의 텍스트로 바뀝니다. 문자 '/', '$', '`', '='및 위에 나열된 쉘 메타 문자 또는 인용 문자는 별명에 나타나지 않을 수 있습니다. 대체 텍스트는 쉘 메타 문자를 포함하여 유효한 쉘 입력을 포함 할 수 있습니다. 대체 텍스트의 첫 번째 단어는 별칭을 테스트하지만 확장되는 별칭과 동일한 단어는 두 번째로 확장되지 않습니다. 이것은 예를 들어 ls를 "ls -F"로 별칭을 지정할 수 있으며 Bash는 대체 텍스트를 재귀 적으로 확장하려고 시도하지 않습니다. 별명 값의 마지막 문자가 공백 또는 탭 문자 인 경우, 별명 다음에 나오는 다음 명령 단어도 별명 확장을 검사합니다 .

(Emphasis mine).
Bash는 명령의 첫 번째 단어 만 별칭을 검사하며 그 이후의 단어는 검사하지 않습니다. 즉 sudo ll, 와 같은 명령 에서 첫 번째 단어 ( sudo) 만 bash에서 별칭을 검사하고 ll무시됩니다. sudo별명 값 끝에 공백을 추가하여 bash가 별명 다음에 나오는 다음 단어를 확인하도록 지시 할 수 있습니다 (예 :).


18
꽤 좋은 해결책입니다.
ulidtko

기본적으로 문제는 sudo가 별칭을 확인하지 않는 방식으로 프로그래밍되었으므로 ll을 찾을 수 없다는 사실로 귀결됩니다.
kemra102

2
문서를 읽으면 분명히 많은 혜택을 얻을 수 있습니다 :-)
biocyberman

4
예를 들어 sudo 플래그를 사용하면이 문제가 발생 sudo -H ll합니까?
Mark E. Haase

1
@ mehaase 네, 시도했지만 깨졌습니다.
user31389

5

나는 그것을 위해 Bash 함수를 작성했다 sudo.

주어진 명령에 대한 별칭이 있는지 확인 하고이 경우 리터럴 명령 대신 별칭 명령을 실행합니다 sudo.

하나의 라이너로 내 기능은 다음과 같습니다.

sudo() { if alias "$1" &> /dev/null ; then $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}" ; else command sudo $@ ; fi }

또는 멋진 형식 :

sudo() { 
    if alias "$1" &> /dev/null ; then 
        $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}"
    else 
        command sudo "$@"
    fi 
}

.bashrc파일에 파일 을 추가하거나 파일을 소싱하거나 나중에 터미널 세션을 다시 시작하여 변경 사항을 적용 할 수 있습니다.


이것이 sudo -H ll에도 작동한다면 좋을 것입니다.
uav

3

별명은 사용자별로 다릅니다. /root/.bashrc


3
그것들은 이미 /root/.bashrc 아래에 있기 때문에 문제가되지 않습니다
kemra102

1
당신과 마찬가지로 루트로 쉘 자체를 실행하는 경우이 답변은 상황에 대한 올바른 것 sudo -s또는 sudo -i(그리고 유일한 루트 쉘을 얻기 위해 자체적으로 실행하면 되지 으로 sudo -s command...또는 sudo -i command...형태) 또는 sudo bash또는 sudo su, 또는 상황에 어디를 루트 로그인을 활성화하고 루트 쉘을 사용했습니다. 루트가 아닌 사용자가 sudo command...자신의 쉘에서 실행 하는 경우 별명이 아닌 루트가 별명 확장을 수행합니다. sudo자체적으로 별칭을 확장하지 않으므로 질문에 설명 된 상황에 적용 되면이 답변이 잘못되었습니다.
Eliah Kagan

3

@Alvins의 답변이 가장 짧습니다. 의심의 여지가 없습니다! :-)

그러나 내가 할 수있는 명령 줄 솔루션 생각 sudo는에 별칭 명령을 실행 재정의 할 필요가없는 경우 sudoalias명령.

다음은 관심이있는 사람들을위한 제안입니다.

해결책

type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\`).*(?=')" | xargs sudo

ll명령 의 경우

type -a ll | grep -o -P "(?<=\`).*(?=')" | xargs sudo

설명

별명 (예 :)이 있으면 ll명령 type -a은 별명 표현식을 리턴합니다.

$type -a ll
ll is aliased to `ls -l'

grep당신이 경우에 액센트`와 아포스트로피 '사이에있는 텍스트를 선택ls -l

그리고 xargs선택한 텍스트 실행 ls -l의 매개 변수를 sudo.

예, 조금 더 길지만 완전히 깨끗합니다. ;-) sudo별칭 으로 재정의 할 필요가 없습니다 .


3
alias출력이 더 깨끗하기 때문에 내장 을 사용하면 더 간단 할 수 있습니다 . alias ll출력 alias ll='ls -ahlF'.
muru

@muru의 제안을 통합 한 버전은 다음과 같습니다 alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo.
ACK_stoverflow

원래 질문의 요점은 sudo -i먼저 별명 명령을 실행할 필요가 없지만 바로 수행하여 작업을 저장 하는 것이 었습니다. 그렇게 복잡한 명령을하면 패배합니다. 당신은 전자를 할 수 있고 훨씬 빠릅니다.
Evi1M4chine

1

나는 약간의 신뢰를 더하는 또 다른 멋진 해결책이 있습니다.

bash 완성을 사용하여 sudo탭을 누를 때 뒤에 있는 단어를 별칭 으로 자동 대체 하십시오.

이것을로 저장하면 /etc/bash_completion.d/sudo-alias.bashcomp대화식 쉘 시작시 자동으로로드됩니다.

_comp_sudo_alias() { from="$2"; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$/\1/" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

그런 다음 새 터미널에 로그인하십시오.


별명 목록을 얻는 방법이 있습니다. 특히 완성을 목표로합니다.compgen -a
muru

@muru : 감사합니다.하지만이 경우 키가 아닌 값이 필요합니다. 입력 한 별칭이 대체됩니다. 와 같이 별칭을 입력하고 sudo ll[TAB ↹]를 누르면 스크립트가 ll별칭 할당 목록에서 찾은 후 할당 된 항목을 잘라 내고 삽입합니다. (따라서 얻을 수 sudo ls -lahvF --color=auto --time-style=long-iso있습니다.)
Evi1M4chine

0

sudo별칭 으로 추가 할 필요가없는 다른 솔루션이 있습니다 . Linux Mint 17.3을 실행하지만 Ubuntu와 매우 유사합니다.

루트 인 경우 .profile홈 디렉토리에서 실행됩니다. 루트 아래의 홈 디렉토리가 무엇인지 모르는 경우 다음을 확인하십시오.

sudo su
echo $HOME

보다시피,의 집은 root입니다 /root/. 내용을 확인하십시오 :

cd $HOME
ls -al

.profile파일 이 있어야 합니다. 파일을 열고 다음 행을 추가하십시오.

if [ "$BASH" ]; then
    if [ -f ~/.bash_aliases];then
        . ~/.bash_aliases 
    fi
fi

기본적으로이 bash 스크립트는이라는 파일을 확인하는 것 .bash_aliases입니다. 파일이 있으면 파일을 실행합니다.

.profile파일을 저장하고에 별명을 만드십시오 .bash_aliases. 별명 파일이 이미 준비되어 있으면 파일을이 위치로 복사하십시오.

터미널을 다시 시작하면 갈 수 있습니다!


0

최고 투표 답변은 큰 답변입니다. 그러나 sudo -isudo 프롬프트 ( #) 를 입력 하고 높이면 사용할 별칭이 없습니다.

#프롬프트 에서 별명 (및 기타)을 사용하려면 다음을 사용하십시오.

sudo cp "$PWD"/.bashrc /root/.bashrc

"$ PWD"가 "/ home / YOUR_USER_NAME"으로 자동 확장되는 경우


0

@ WinEunuuchs2Unix : $PWD"현재 작업 디렉토리"로 확장됩니다. 당신이 원하는 것 같아요 $HOME.

또한 대부분의 상황에서 별도의 루트 .bashrc 파일을 사용하는 것이 가장 좋습니다. 사실, 나는 그것을 /root사용자의 홈 디렉토리 (예 :)에 있는 실제 파일에 소프트 링크로 만들고 그것을 .bashrc_root사용자의 .bashrc파일 에서 소스로 만들 것입니다 . 나중에이 권한있는 사용자 계정이 더 이상 존재하지 않으면 .bashrc다른 사용자가 루트 파일을 계속 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.