sudo를 통해 별칭을 전달하는 방법


32

자주 사용하는 도구에 일부 매개 변수를 전달하는 별칭이 있습니다. 때때로 나는 나 자신처럼 달리기도하고 때로는 sudo를 받는다. 불행히도 sudo는 별칭을 인식하지 못합니다.

별칭을 전달하는 방법에 대한 힌트가 있습니까?

이 경우 디버깅 할 때 perl에 대한 많은 옵션이 있습니다.

alias pd='perl -Ilib -I/home/myuser/lib -d'

때로는 도구를 루트로 디버깅해야하므로 대신 실행하지 마십시오.

pd ./mytool --some params

sudo에서 실행해야합니다. 나는 여러 가지 방법을 시도했다.

sudo eval $(alias pd)\; pd ./mytool --some params
sudo $(alias pd)\; pd ./mytool --some params
sudo bash -c "$(alias pd)\; pd ./mytool --some params"
sudo bash -c "$(alias pd); pd ./mytool --some params"
sudo bash -c eval\ "$(alias pd)\; pd ./mytool --some params"
sudo bash -c eval\ "'$(alias pd)\; pd ./mytool --some params'"

내 시도 중 일부가 전혀 간결하지 않았지만 현재 pd 별칭이 완전히 사용되도록 (나중에 조정해야 할 경우) 간결하고 간결한 방법을 원했습니다. 나의 마지막 수단은 그것을 쉘 스크립트에 넣고 sudo가 찾을 수있는 곳에 두는 것입니다. 그러나 별칭은 때로는 너무 편리하므로 마지막 수단입니다.

답변:


50

매우 우아한 해결책은 아치 리눅스 위키에서 찾을 수 있습니다 :

alias sudo='sudo '
# whitespace ---^

에 모든 별칭을 전달합니다 sudo.

출처 : http://wiki.archlinux.org/index.php/Sudo#Passing_aliases


16
이것은 훌륭한 트릭입니다! 궁금한 점은 bash 맨 페이지의 별칭 섹션에 대한 설명입니다.A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
Russell Davis

1
이것은 실제로 받아 들여지는 대답이어야합니다.
Adrian Frühwirth

이것이 기능에 작동하지 않는 것은 부끄러운 일입니다.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

2
참고 : -passthrough 트릭을 동시에 유지하면서 옵션sudo다시 전달해야한다고 가정 하십시오 sudo. 옵션을 다시 사용하려면을 사용하십시오 \sudo. 백 슬래시는 별명 을 대체 합니다. (많은 사람들이 그것에 대해 알지 못하는 것 같습니다). 이 방법을 사용하면 (수 위험! )도없이 파일을 제거 어떤 가 무시 경고 alias rm='rm -i'일반적으로 지정된 .bash-aliases간단히 입력하여, \rm file-to-delete.
syntaxerror

11

나는 당신이 무엇을하려고하는지 명확하지 않습니다. 두 가지 방법이 있습니다.

옳은 길

alias pd='sudo perl -Ilib -I/home/myuser/lib -d'

그런 다음 실행 pd ./mytool하면 디버깅 명령이 루트로 실행되지만 여전히 sudo (루트 셸에서 작동하지 않는 감사 추적)의 이점을 유지합니다.

예:

insyte $ alias sid = 'sudo id'
insyte $ sid
uid = 0 (루트) gid = 0 (루트) 그룹 = 0 (루트)

쉬운 길

루트에 별칭을 추가하고 루트에 sudo 할 때마다 .bashrc사용하십시오 sudo -i.

root # echo '별칭 fb = "echo foo bar"'>> /root/.bashrc
루트 번호 이탈
출구
insyte $ sudo -i
루트 # fb
푸 바

4

두 개의 별칭이 있고 변수를 사용하십시오.

내가 사용하는 이유가 표시되지 않습니다 awk또는 cut그것은 단지 순서대로 한 번 정의 된 핵심 별칭을 갖고 않는 한 수정하기 쉽도록 할 수 있습니다. 그 경우라면 다음과 같이 작동합니다.

# ... in .bashrc ...
pd='perl -Ilib -I/home/myuser/lib -d'
alias pd="$pd"
alias spd="sudo $pd"

위와 같은 별칭 쌍을 만드는 간단한 기능은 다음과 같습니다.

mkap () {
    alias $1=$2
    alias s$1="sudo $2"
}

쓰다:

mkap pd 'perl -Ilib -I/home/myuser/lib -d'
mkap ct 'cat'

이제 당신은 pdspd플러스 ctsct.

$ ct /etc/shadow
cat: /etc/shadow: Permission denied
$ sct /etc/shadow
[sudo] password for dennis:
root:[censored]...
$ alias
alias ct='cat'
alias pd='perl -Ilib -I/home/myuser/lib -d'
alias sct='sudo cat'
alias spd='sudo perl -Ilib -I/home/myuser/lib -d'

4

두 가지 답변을 "정확한"것으로 표시 할 수 있기를 바랍니다. Insyte 's, 음, 통찰력있는 게시물 의 올바른 방법 과 Bill Weiss 의 awk (또는 cut) 솔루션을 결합하면 다음과 같은 결과를 얻을 수 있습니다.

alias spd="sudo $(alias pd | cut -d\' -f2)"

이제 이것을 내 .bashrc 또는 쉘의 쉘 함수에 넣고 루트로 실행하려는 모든 별칭의 "s"버전을 만듭니다.

업데이트 : 약간 사용하기 쉽도록 Dennis Williamson 의 단순한 기능을 약간 수정 했습니다.

 salias()
 {
   local a c
   a=$(echo "$1" | cut -f1 -d=)
   c=$(echo "$1" | cut -f2- -d=)
   alias $a="$c"
   alias s$a="sudo $c"
 }

이것은 단지 전체 명령 앞에 "s"를 넣어야한다는 것을 의미합니다. 대신에:

alias pd='perl -Ilib -I/home/myuser/lib -d'

난 그냥 앞에 s를 추가합니다.

salias pd='perl -Ilib -I/home/myuser/lib -d'

그리고 나는 끝났다. 물론, 컴퓨터는 좀 더 많은 작업을 수행하지만 그것이 바로 컴퓨터를위한 것입니다. :-)

감사!


당신은 마킹처럼이 :) 수정의 종류 인 허용으로 마크 일 (또는 할 수 있어야) 할 수 있습니다
빌 와이즈

마우스 오른쪽 - 나는 표시 할 이 개 올바른 P는 등의 답변
Tanktalus

3
Slizzered의 답변이 어떻습니까? alias sudo="sudo "완벽하게 작동합니다.
trusktr


3

옵션이 포함 된 스크립트를 해킹 한 다음 일반 계정 및 루트 경로 인 폴더 중 하나에 배치하는 것이 더 쉽지 않습니까? 실제로 많은 스크립트를 사용하지는 않습니다.

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*

실제로 $ * 대신 "$ @"여야하며, 이것이 일반적으로 피하려고하는 이유의 일부입니다. ;-) 작동합니다. 포함 된 내용과 관련하여 디스크 공간을 많이 낭비합니다.
Tanktalus

3

이것은 거칠지 만 여기서 작동합니다.

houdini@clanspum:~/ > alias fb
fb='echo foo bar'
houdini@clanspum:~/ > alias fb | awk -F\' '{print $2}'
echo foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}')"
foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}') a b c"
foo bar a b c
houdini@clanspum:~/ > fb
foo bar
houdini@clanspum:~/ > fb a b c
foo bar a b c

불완전한 솔루션을 여기에 붙여 넣은 다음 수정하도록 수정했습니다. 현재는 옳습니다. 첫 번째 사람에게 무료 upvote에이 :) 여기 무슨 일이 일어나고 있는지 설명 댓글을
빌 와이즈

나는 awk보다 더 간단한 방법을 기대하고 있었지만 희망! = 현실 가끔 ;-) 분명히 "cut -f2 -d \ '"는 awk와 마찬가지로 잘 작동하고 조금 더 짧을 것입니다.
Tanktalus

예, 컷은 효과가 있었지만 항상 잊어 버렸습니다.
Bill Weiss

3

선택한 별칭 및 명령에 "sudo"접두사 를 다음 ~/.bashrc과 같이 추가 하십시오 .

#a regular alias
alias pd='perl -Ilib -I/home/myuser/lib -d'

#sudofy (command id, alias pd - add others to this list)
for cmd in id pd;
      do alias "s$cmd"="sudo $cmd";
done;

그것은 작동하지 않습니다-내가 시작한 곳입니다. 해봤 어?
Tanktalus

좋은 개념. 생각 alias sudo="sudo "하지만 쉽다.
trusktr

3

몇 번 게시 된 것처럼 '.bashrc'에서 수행하십시오.

별명 sudo = 'sudo'

이유는 'man bash'및 'help alias'에 설명되어 있습니다.

alias : alias [-p] [name [= value] ...] 별칭을 정의하거나 표시합니다.

Without arguments, `alias' prints the list of aliases in the reusable
form `alias NAME=VALUE' on standard output.

Otherwise, an alias is defined for each NAME whose VALUE is given.
**A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.**

1

당신은 이와 같은 것을 원합니다 :

(alias; echo "exec < /dev/tty") | sudo bash  -i

틀릴 수도 있지만 bash -i(i = 대화식) ISTR 은 v4.0 전용입니다. 따라서 bashv3 을 계속 실행중인 이전 서버 에서는 이것이 실패 할 가능성이 높습니다. 그러나 나를 잘못 증명해
보아라

@syntaxerror-당신은 잘못 기억합니다. -iBourne shell입니다. pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
geocar

와우, 6 살짜리 포스트에 대해 너무 빨리 답장을 기대하지 않았는데 ... 왜 그렇 #!/bin/bash -i습니까? 세방 이후에 혼동했을 수도 있습니다 . 간단히 말해 "라이브"명령 줄이 아닌 스크립트 history에서 사용 하려면 "only" v3이 설치된 서버에서 작업 할 수없는 옵션 필요합니다 . 그리고 그것은 사실입니다. bash-ibash
syntaxerror

1

그것이 프로덕션 박스에서 가장 현명한 일인지 모르겠지만 로컬에서 사용합니다.

alias sudo="sudo -E"

-E ( 환경 보존 ) 옵션은 sudoers (5)의 env_reset 옵션보다 우선합니다. 일치하는 명령에 SETENV 태그가 있거나 setenv 옵션이 sudoers (5)에 설정된 경우에만 사용할 수 있습니다.


-1

루트의 .bashrc에 별칭을 추가하거나 명령 전에 sudo를 통해 .bashrc를 실행할 수 있습니까?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)

1
음, 이것도 거의 작동하지 않았습니다. 실제로 위에서 시도한 것들과 상당히 비슷하지만 실제 쉘 / 스도 구문과는 거리가 멀습니다.
Tanktalus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.