리눅스 시스템을 셋팅하면서, sudo와 su 명령어는 꽤 많이 사용하였습니다. 예를 들어, 우분투에서 sudo apt update 라던지, 아니면 sudo su라던지.

 


 먼저 sudo를 보시면, execute a command as another user라고 되어 있습니다. 이것을 해석하면, 명령어를 다른 유저로 실행을 한다는 의미입니다. 예를 들자면 A라는 명령어를 cho로 실행할 수도 있지만 cho2로도 실행할 수 있고, root로도 실행할 수 있을 겁니다.

 

 

 -u 옵션을 주면, user가 실행하게 되는데요. other than 이라는 것이 있습니다. 원래 default 값은 보통 root인데, -u user 이렇게 옵션을 주면, 예를 들어서 sudo -u user C 라고 입력을 하면, C라는 명령어를 user로 실행하게끔 합니다. 언급이 된 김에 예제를 하나 들어보겠습니다.

 

 cho2라는 유저를 생성하고, sudo 그룹에 (Ubuntu인 경우에) cho2가 속해 있습니다.

 

 

 저는 def1.c를 보려고 합니다. 그런데, 권한을 보니까 -rw-r-----라고 떠 있습니다. 그룹 cho에 속해있지 않거나, cho가 아닌 경우에는 def1.c를 볼 수 있는 권한이 없습니다.

 

 

 cho2로 유저를 전환하고, whoami를 치면 cho2가 나올 겁니다. 이 상태에서, cat def1.c 명령어를 입력하면 당연하게도, 권한 때문에 거부가 될 겁니다. 그룹 cho에 속해있지 않기 때문입니다. 그런데, sudo -u cho cat def1.c 명령어를 치면 이야기가 달라지는데요. cho로 cat def1.c를 수행한다는 의미입니다. 권한을 빌렸다고 이야기 하면 편할까요?

 

 당연하게도, 유저 cho는 def1.c를 읽을 권한이 있고, cho2는 sudoers에 있기 때문에, cho2의 패스워드만 입력하면 유저 cho2로 def1.c를 볼 수 있게 됩니다.

 

 

 apt update 명령어를 입력해 보면, permission denied가 뜹니다. 파일이나 폴더를 여는 데 권한 문제가 발생했다는 오류가 보이는군요. sudo apt update를 입력해 보겠습니다.

 

 

 cho의 패스워드를 입력하면, 문제 없이 수행이 되는 것을 볼 수 있는데요. 이는 apt update라는 명령어를 root로서 (즉, root의 권한으로) 실행하였기 때문입니다.

 


 

 이제 sudo su와 su를 알아보겠습니다. 전자는 크게 어렵지 않습니다. su라는 명령어를 root 유저로 실행하라는 의미인데요. 당연하게도, cho가 sudo를 날릴 수 있는 권한이 있다면, 명령이 실행이 될 겁니다.

 

 

 그러면 su는 무엇일까요?

 

 

 sudo가 run a command였다면, su는 run commands with a user 입니다. 그리고 조금 더 읽어보면, running shell as root를 보실 수 있을 텐데요. 아무런 인자가 없으면, shell이 root로서 돌게 됩니다.

 

 

 su cho2를 입력해 보겠습니다. cho2의 패스워드를 입력하면, 뭔가 바뀌었다는 것을 알 수 있는데요. whoami를 쳐 보면, cho2로 되어 있습니다. sudo su는 su 명령어를 root의 권한을 빌려서 수행하는 것인데, su가 유저를 switch 하는 것이고, 아무런 옵션이 없으면 root로 바뀌는 것이니, root로 switch 하는 작업을 root의 권한을 빌려서 한다. 정도로 보시면 됩니다.

 

 이렇게 보니, 왜 root랑 유저 비밀번호를 다르게 설정해야 하는지 어느 정도는 알 듯 싶네요.