sudo를 사용하여 명령줄 및 별칭에서 이전 명령을 실행하는 방법(별칭 사용)

sudo를 사용하여 명령줄 및 별칭에서 이전 명령을 실행하는 방법(별칭 사용)

(참고: 이것은아니요질문이 중복되었습니다. )

명령줄에서 sudo !!sudo를 사용하여 이전 명령을 실행할 수 있습니다. 하지만 이전 명령에서 별칭을 사용하면 어떻게 될까요?

마찬가지로 별칭을 사용하여 sudo를 통해 이전 명령을 실행하려면 .bashrc 파일에서 다음(또는 다른) 옵션 중 하나를 사용할 수 있습니다.

alias please='sudo "$BASH" -c "$(history -p !!)"'
alias please='sudo $(fc -ln -1)'
alias please='eval "sudo $(fc -ln -1)"'
alias please='function _please(){ eval "sudo $(fc -ln -1)"; }; _please'
alias please='sudo sh -c '"'"'sudo sh -c $(fc -ln -1)'"'"''
alias please="sudo sh -c 'sudo sh -c $(fc -ln -1)'"

alias temp='sudo -s eval $(fc -ln -1)'

please () (
    my_source=~
    past_command=$(fc -ln -1)
    sd ${past_command}
)

나는 이전 명령의 별칭을 사용하여 작동하도록 노력하면서 이들 각각을 시도했습니다. 나는 그것들을 확장하기 위해 사용해 보았고 shopt -s expand_aliases이 트릭을 사용해 보았습니다 alias sd='sudo '. 그것들은 모두 일반 명령에서는 잘 작동하지만 sudo는 내 별칭이 무엇인지 전혀 모릅니다.

내 홈 디렉토리에 모든 사용자 정의 옵션을 유지해야 합니다.

sudo sh -c . . .또한 가능하다면 파이프와 리디렉션과 같은 옵션을 사용하여 sudo 권한도 얻는 것을 선호합니다 .

편집: 이 트릭을 사용하면 명령줄에서는 작동 alias sd='sudo '하지만 여전히 별칭으로는 작동하지 않는다는 것을 발견했습니다.sd !!

답변1

sudo(에 의해 시작된 쉘) 내부에는 별칭이 정의되어 있지 않습니다.

실제로 시작 시 환경 변수를 제거하고 별칭 정의를 피하는 것이 일반적인 보안 관행입니다 sudo.

예를 들어 설명하겠습니다.

실행 파일을 만들고 /bin(루트만 만들 수 있음) 이를 사용자 실행 파일로 정의해 보겠습니다.

# echo $'/bin/sh\necho "running $0 by $USER with $EUID"' >/bin/usercmd
# chmod a+x /bin/usercmd

이 새로운 명령은 사용자 usercmd나 루트에 의해 간단히 실행될 수 있습니다.sudo usercmd

$ usercmd
running usercmd as isaac with 1027

$ sudo usercmd
running usercmd as root with 0

사용자와 루트 모두 실행 파일을 실행할 수 있습니다.

이제 매우 간단한 별칭을 정의하고 시도해 보겠습니다.

$ alias tcmd='usercmd'
$ tcmd
$ tcmd
running /usr/bin/usercmd as isaac with 1027

$ sudo tcmd
sudo: tcmd: command not found

sudo에는 사용할 수 있는 별칭이 없습니다.

유일한 (일반적인) 해결책은 별칭에서 명령을 추출하는 것입니다.

$ sudo sudo $(alias tcmd | sed 's/[^=]*=//;s/'\''//g')
running /usr/bin/usercmd as root with 0

관련 정보