-
[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처럼 실행하는 방법을 지양하고 있습니다. (할 필요도 없다고..)