ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux] sudo command not found 해결법 (Go 권한문제 해결법)
    서버 2017. 2. 2. 11:46

    우분투에서 패키지를 설치하지 않고 압축을 풀어서 사용하면 로그인된 사용자에 맞게 설정할 시, 로그인된 사용자는 세팅한 명령어를 사용할 수 있지만 사용자 권한을 변경하면 해당 패키지를 찾지 못하여 에러가 발생합니다.

    아래에서는 go라는 압축파일을 풀어 로그인된 사용자가 세팅한 다음, 루트계정으로 변환하여 해당 명령어를 실행하는 예제입니다.

    예제

    test$ tar -xcvf go1.7.1.linux-amd64.tar.gz # 패키지 압축해제
    test$ sudo mv go /usr/local/ # /usr/local/ 폴더 하위로 압축파일 이동
    test$ cd /home/test
    test$ echo "export PATH=$PATH:/usr/local/go/bin" >> .bashrc # .bashrc파일에 go 패키지 등록
    test$ source .bashrc # 적용
    test$ go
    # 정상적으로 적용
    Go is a tool for managing Go source code.
    Usage:
    	go command [arguments]
    The commands are:
     
    ....
     
    test $ sudo su # root로 변경
    root # go # 명령어 인식 못함
    -bash: go: command not found


    위와 같이 root 권한으로 실행하려고 할 때, 패키지를 못찾는 문제에 대해 해결하는 방법을 다음에서 설명합니다.

    sudo su

    test$ sudo su
    root# cd ~root
    root# echo "export PATH=$PATH:/usr/local/go/bin" >> .bashrc 
    root# source .bashrc
    root# go
    # 정상적으로 적용
    Go is a tool for managing Go source code.
    Usage:
    	go command [arguments]
    The commands are:
     
    ....


    sudo 명령어

    위처럼 sudo su로 사용하는 것이 아닌 sudo go 처럼 권한만 가져와 실행한다고 하면 똑같은 에러가 발생합니다.

    test$ sudo go
    -bash: go: command not found


    위와같은 문제를 해결하는 방법은 다음과 같이 두 가지가 존재합니다.

    sudoers 파일 수정

    test$ sudo vi /etc/sudoers
     
    #
    # This file MUST be edited with the 'visudo' command as root.
    #
    # Please consider adding local content in /etc/sudoers.d/ instead of
    # directly modifying this file.
    #
    # See the man page for details on how to write a sudoers file.
    #
    Defaults        env_reset
    Defaults        mail_badpass
    Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"  # <- 이 부분에 :/usr/local/go/bin과 같이 패키지 경로 추가
    # Host alias specification
    # User alias specification
    # Cmnd alias specification
    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    # See sudoers(5) for more information on "#include" directives:
    #includedir /etc/sudoers.d

    :wq!로 강제저장한 다음 sudo go env를 사용하면 명령어가 먹히는 것을 볼 수 있습니다.

    심볼릭 링크 생성

    test$ sudo ln -s /usr/local/go/bin/go /usr/bin/go


    위와같이 할 경우 sudo go를 사용할 수 있는 것을 확인할 수 있습니다.


    여기서 PATH만 사용할 경우는 위와처럼 하면 되지만 go와 같이 GOPATH라는 특수한 환경변수도 공유하여 사용하고 싶은 경우 아래와 같이 .bashrc를 수정합니다.

    test$ sudo vi .bashrc
     
    .....
     
    alias sudo ='sudo env GOPATH=$GOPATH' # 추가


    위까지 할 경우 sudo go env의 내용과 사용자계정으로 세팅한 내용이 똑같은 것을 확인할 수 있습니다.

    여기에서는 root계정에 직접 go 환경을 세팅하는 것과 sudo 권한에 심볼릭 링크 등을 걸어 사용자 환경과 동일시하게 하는 방법을 소개했지만 sudo go처럼 실행하는 방법을 지양하고 있습니다. (할 필요도 없다고..)


    댓글