차이점

sudo: 현재 계정에서 다른 계정의 권한만 빌림

su: 다른 계정으로 전환

su -: 다른계정으로 전환 + 그 계정의 환경변수 적용

상세내용

sudo는 root가 아닌 사용자가 root에 준하는 능력으로 sudo 다음에 나오는 명령을 실행하게 하는 명령어입니다.  su는 root 패스워드가 필요하지만 sudoer에서 사용을 허락한 사용자는 모두 패스워드와 관계없이 쓸 수 있습니다. sudo는 슈퍼유저, 관리자 권한을 가지지만 근본적으로는 해당 사용자가 내리는 명령입니다.  sudo su는 일시적으로 그 명령은 root가 내리는 명령입니다. 예를 들어 sudo로 작업하면서 디스크에 쓰기를 해야하면 소유자가 지금 사용자로 나옵니다만, sudo su로 작업하면 소유자가 root가 됩니다. sudo -s는 sudo 만으로 su 명령어와 같은 효과가 나는 명령입니다. su는 root 암호를 알아야만 쓸 수 있지만, sudo -s는 sudoer에서 허가된 사용자라면 본인 암호를 넣고 쓸 수 있는 su와 동일한 명령입니다. 간단히 말하면 sudo -s 를 하고 자기 암호를 넣으면 root로 로그인한 쉘로 전환됩니다. sudo로 가능한 명령어를 지정하는 곳은 sudoer파일에서 설정할 수 있습니다.

sudo su와 sudo -s 차이점 

sudo su 와 sudo -s 둘 다 root shell 을 사용할 수 있는 명령어이지만, 전자가 계정을 독립적으로 root 로 전환해 버리는 데 반해 (즉 root shell 을 직접 실행) 후자는 현 계정의 모든 환경 변수들을 root 계정 쪽으로 넘긴다는 차이가 있습니다. 그래서 sudo su를 하면 홈 디렉토리가 /root 가 되지만 (이와 동시에 현재 디렉토리 역시 /root 로 바뀝니다), sudo -s를 하게 되면 홈 디렉토리가 기존 그대로 유지되며, .bashrc 역시 전자가 $user의 ~/.bashrc 를 읽는데 반해 후자는 /root/.bashrc 를 읽습니다. 이 외에도 몇 가지 차이가 생깁니다.

예시

sudo

기본 값은 슈퍼유저로 슈퍼유저의 보안권한으로 프로그램을 구동할 수 있게 해주는 명령어

$ sudo mkdir test

su

로그아웃을 하지 않고 다른 사용자의 계정으로 전환.

[root@localhost ~]# pwd
/root
[root@localhost ~]# su test
[test@localhost ~]$ pwd
/root			# 사용자는 변경되었지만 로그인된 사용자 환경으로 쉘을 실행하지 않아 그대로 /root를 출력
[test@localhost ~]$ exit
[root@localhost ~]#

su -

다른 사용자의 계정으로 전환하고 해당 사용자 환경으로 쉘을 실행

[root@localhost ~]# pwd
/root
[root@localhost ~]# su - test
[test@localhost ~]$ pwd
/home/test		# 사용자 변경과 함께 로그인된 사용자 환경으로 쉘을 실행하여 /home/test를 출력
[test@localhost ~]$ exit
[root@localhost ~]#


sudo 명령어... 로 한 다음, 비밀번호를 입력하면 전부 열리지만 간혹 실행이 되지 않는 경우가 있습니다. 이때 해당 로그인된 계정에 특정 명령어에 대한 root 권한을 주어 실행할 수 있도록 하는 방법입니다.


예제로 test 계정으로 아파치를 제어할 수 있도록 변경합니다. test 계정으로 아파치를 제어할 수 있어도 아파치의 시작, 종료 등의 권한만 있고, 프로세스 실제 소유자는 여전히 root입니다.

계정 생성

[root@localhost ~]# useradd test
[root@localhost ~]# echo 'qwer1234' | passwd --stdin test
Changing password for user test.
passwd: all authentication tokens updated successfully.

sudo 시도

[root@localhost ~]# su - test
[test@localhost ~]$ sudo /usr/sbin/httpd -k stop
[sudo] password for test:
 
test is not in the sudoers file.  This incident will be reported.

위 처럼 비밀번호를 맞게 입력해도 sudoers에 설정되지 않아 실행되지 않습니다.

권한 부여

[root@localhost ~]# echo 'test ALL=NOPASSWD:/usr/sbin/httpd' >> /etc/sudoers
[root@localhost ~]# tail -5 /etc/sudoers

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

test ALL=NOPASSWD:/usr/sbin/httpd # NOPASSWD: 를 제거할 경우, sudo를 사용할 때 비밀번호를 물어봄

결과

[test@localhost ~]$ sudo /usr/sbin/httpd -k start # NOPASSWD: 를 추가해서 sudo가 되는 것은 물론 비밀번호 입력없이 실행


우분투 계정을 만든 다음, 아래와 같이 관리자 권한이 필요한 부분에서 sudo를 사용하면 아래와 같이 비밀번호를 입력하라는 프롬프트 창을 본 적이 있을 것입니다.

$ sudo mkdir test
password:


아래부터는 우분투에서 이러한 sudo 패스워드 없이 명령어를 사용하는 방법을 설명하겠습니다.

/etc/sudoers

/etc/sudoers 파일에 다음 형식으로 내용을 추가하면 됩니다.

사용자명 ALL=NOPASSWD: ALL

여기서 NOPASSWD: 를 빼면 sudo 실행 시, 사용자명의 패스워드를 입력해야만 합니다. 


전체 명령어가 아닌 사용자에 따라 명령어를 지정할 수도 있습니다.

사용자명 ALL=NOPASSWD: 명령어1, 명령어2

예제

전체 명령어 허용

test라는 계정으로 로그인 후 관리자 계정 접속

[test@localhost ~] $ sudo su
password:
[root@localhost ~] # 

test계정에 sudo 권한 추가

[root@localhost ~] # echo 'test ALL=NOPASSWD: ALL' >> /etc/sudoers
[root@localhost ~] # cat /etc/sudoers | tail -2
# includedir /etc/sudoers.d
testuser1 ALL=NOPASSWD: ALL

패스워드 입력없이 sudo reboot 가능

[root@localhost ~]# su - test
[testuser1@localhost ~]$ reboot
reboot: Need to be root
[test@localhost ~]$ sudo reboot
The system is going down for reboot NOW!

지정한 명령어만 허용

visudo를 열어 useradd와 userdel 명령어를 추가 또는 표준출력으로 /etc/sudoers에 직접입력

[root@localhost ~] # visudo
 
... (생략)
#includedir /etc/sudoers.d
test ALL=NOPASSWD: /usr/sbin/useradd, /usr/sbin/userdel  # 추가
 
또는
 
[root@localhost ~] # echo 'test ALL=NOPASSWD:/usr/sbin/useradd, /usr/sbin/userdel' >> /etc/sudoers 

test 계정으로 sudo reboot 테스트

[root@localhost ~]# su - test
[test@localhost ~]$ sudo reboot
[sudo] password for test: 
Sorry, user test is not allowed to execute '/sbin/reboot' as root on localhost.localdomain.

위처럼 sudo reboot에 대해서 패스워드를 묻지만 본인의 로그인 패스워드를 정확하게 입력해도 권한이 없어 실행을 할 수 없습니다.


하지만 추가한 명령어인 useradd와 userdel을 사용할 경우 비밀번호를 묻지 않고 바로 사용가능합니다.

[test@localhost ~]$ sudo useradd test1
[test@localhost ~]$ cat /etc/passwd | grep test1
test1:x:501:501::/home/test1:/bin/bash


  1. 지나가는사람 2019.01.11 16:11

    이런 방법이 있는지는 몰랐네요. 좋은 정보 감사합니다.

제목 그대로 맨 처음 'sudo [명령어]...' 실행 시 비밀번호를 입력하라는 prompt 창을 확인할 수 있습니다.

$ sudo vi test
Password:


불가피하게 sudo로 명령어를 실행하고 추가적인 prompt창 없이 바로 실행하도록 하고싶을 때 아래와 같이 사용합니다.

echo '비밀번호' | sudo -S 명령어
 
 
# 예시
$ echo '1234' | sudo -S vi test.txt


여기서 sudo의 -S 옵션은 sudo가 표준 입력으로부터 암호를 읽도록 합니다. 

만약 이미 sudo [명령어]를 사용해 비밀번호를 이미 입력한 다음, 위와같이 실행하면 sudo의 액세스 토큰이 활성화가 되어 있어 에러가 발생할 수도 있습니다. 이러한 액세스 토큰을 리셋하기 위해선 아래와 같은 명령어를 입력합니다.

echo '비밀번호' | sudo -kS 명령어
 
 
# 예시
$ echo '1234' | sudo -kS vi test.txt


이와같이, 명령어 한 줄로 관리자 권한을 얻어 실행할 수 있지만 보안 관점에서는 상당히 취약합니다. history에 관리자의 비밀번호가 그대로 남기 때문입니다. 따라서 해당 방법을 사용하기 보단, /etc/sudoers 파일에서 사용자의 권한을 수정하는 것이 좀 더 낫습니다. ( 그렇다고 해당 방법이 안좋은 것은..)

활성화 확인

$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6
0 # 사용중
1 # 사용안함

sysctl.conf 파일 수정

$ sudo vi /etc/sysctl.conf
 
# 파일 내 아래 내용 붙여넣은 후 저장
 
#IPv6 Disable
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

적용

$ sudo sysctl -p
$ sudo reboot

활성화 확인

$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6
1  # 활성화 상태 확인에서 사용안함
0  # 활성화 상태 확인에서 사용중

세미콜론(;)

하나의 명령어 라인에서 여러 개의 명령을 실행(하나의 명령어 다음에 추가)

첫 번째 명령이 실패하여도 두 번째 명령은 반드시 실행이 됨.

$ printf "first command\n"; printf "second command\n"
first command
second command

# linux; date
-bash: linux: command not found
2016. 09. 04. (수) 11:21:39 KST

파이프(|)

앞에서 나온 명령 결과를 두 번째 명령에서 사용

$ ps -ef | grep python
root     30426     1  0 15:51 ?        00:00:00 sudo python3 manage.py runserver 0.0.0.0:80
root     30427 30426  0 15:51 ?        00:00:00 python3 manage.py runserver 0.0.0.0:80
root     30429 30427  0 15:51 ?        00:00:14 /usr/bin/python3 manage.py runserver 0.0.0.0:80
test 31255 30994  0 16:29 pts/1    00:00:00 grep --color=auto python

더블 엠퍼센드(&&)

첫 번째 명령이 에러 없이 정상적으로 종료했을 경우에만 두 번째 명령을 수행

$ date 'test' && printf "second command\n"
date: invalid date `test'

$ date && printf "second command\n"
2013. 09. 04. (수) 11:35:22 KST
second command

더블 버티칼바(||)

첫 번째 명령의 결과에서 에러가 발생하더라도 각각의 모든 명령을 수행

$ date 'test' || printf "second command\n"
date: invalid date `test'
second command


  1. heyhyo 2018.08.28 16:46 신고

    감사합니다~

+ Random Posts