su vs sudo -s vs sudo -i vs sudo bash


89

다음 명령의 차이점은 무엇입니까?

su
sudo -s
sudo -i
sudo bash

나는 su루트 암호를 알아야 sudo하고 sudoers파일 에 있어야 하지만 한 번 실행되면 차이점은 무엇입니까?

나는 사이의 차이가 알고 susudo -s홈 디렉토리이기 때문에 /root내가 실행 한 후 su,하지만 내 홈 디렉토리는 여전히 /home/myname후가 sudo -s. 그러나 이것이 내가 놓친 근본적인 차이의 증상 일뿐입니다.


3
sudo su - 이 방법 을 사용하는 것이 좋습니다. 이 방법으로 루트 암호가 필요하지 않으며 -홈 디렉토리가 올바르게 설정되어 있는지 확인하십시오.
Jens Timmerman

답변:


114

함께 su사용하면 다른 사용자 - 기본적으로 루트하지만 잠재적으로 다른 사용자. 이라고 말하면 su -환경이 해당 사용자의 로그인 환경으로 바뀌므로 사용자가 로그인하는 것과 구별 할 수 없습니다. su로그인 할 때 해당 사용자의 조치에서 다른 사용자에게 수행 한 작업을 시스템이 알 수있는 방법이 없습니다 .

상황은 다음과 매우 다릅니다 sudo.

  • 실행하는 명령 은 기본적으로 루트 사용자이지만 대상 사용자로 sudo 실행 되지만 변경할 수는 -u있지만 실행 한 명령은 사용자 이름으로 태그 지정되어 나중에 비난을 할당 할 수 있습니다. :)

  • sudo매우 유연합니다. 예를 들어 지정된 사용자 또는 사용자 그룹이 실행할 수있는 명령을 제한 할 수 있습니다. 로 su, 그것은 전부 또는 아무것도 아닙니다.

    이 기능은 일반적으로 역할을 정의하는 데 사용됩니다. 예를 들어, 실행이 허용 된 "백업"그룹 dumptar시스템 디스크를 올바르게 백업하려면 각각 루트 액세스가 필요한 그룹을 정의 할 수 있습니다.

    나는 이것을 당신이 sudo그들에게 sudo -s또는 sudo bash능력 을주지 않고 누군가에게 특권을 줄 수 있다는 것을 의미하기 때문에 이것을 언급 합니다. su전체 시스템을 실행 하면서 작업을 수행하는 데 필요한 권한 만 있습니다. sudo vi예를 들어, 누군가에게 말할 수있는 능력을 주면 , 그들은 밖으로 나와 vi효과적으로 같은 힘을 가질 수 있습니다 sudo -s.

  • 루트 암호 대신 sudoer의 암호를 sudo사용하므로 여러 sudoers간에 권한을 분리합니다.

    이것은 su루트 암호가 변경 될 때, 그것을 사용해야하는 모든 사람들에게 알려야한다는 관리 문제를 해결합니다 su. sudosudoers의 비밀번호를 독립적으로 변경할 수 있습니다. 실제로 시스템에서 루트 사용자의 계정을 암호로 잠그면 sudo모든 sysadmin 작업이를 통해 수행됩니다 sudo. 신뢰할 수있는 sudoers가 많은 대규모 조직에서 이는 sysadmins 중 하나가 떠날 때 루트 암호를 변경하여 남아있는 관리자에게 배포 할 필요가 없음을 의미합니다.

주요 차이점 sudo bashsudo -s-s짧은 당신은 몇 가지 방법으로 사용자의 기본 쉘에서 실행하는 명령을 전달할 수 있습니다 :

  1. 쉘에서 sudo -s some-command어떤 것을 실행할 수 있는지 말할 수 있습니다 some-command. 기본적으로 약어입니다 sudo $SHELL -c some-command.

  2. 대신 명령을 셸의 표준 입력으로 전달할 수 있습니다 sudo -s < my-shell-script. 이것을 반복해서 입력 할 필요없이 heredoc 과 함께 사용 하여 단일 sudo호출에 여러 명령을 보낼 수 sudo있습니다.

이러한 동작은 모두 선택 사항입니다. 훨씬 더 일반적으로 -s혼자 주는 것이므로 사용자의 쉘을 대화식으로 실행합니다. 이 모드에서는 환경 변수 에서 먼저보고 , 설정되지 않은 경우 사용자의 로그인 쉘 설정 (일반적으로)에서 sudo bash다른 쉘을 실행할 수 있다는 점과 다릅니다 .bashSHELL/etc/passwd

에 의해 실행되는 셸 sudo -s은 현재 사용자 환경 을 상속합니다. 실제로 원하는 것이 로그인 직후와 같이 깨끗한 환경이라면 대신 sudo -i최근에 추가 한 것 sudo입니다. 대략 말하기 sudo -i에있다 sudo -s으로 su -하는 것입니다 su그것은 몇 가지 주요 환경 변수를 제외하고 모두 재설정하고 사용자의 홈 디렉토리에 당신을 보냅니다. 표준 입력 또는를 통해 해당 쉘에서 실행하도록 명령을 제공하지 않으면 sudo -i some-command해당 쉘을 대화 형 로그인 쉘로 실행하므로 사용자의 쉘 ​​시작 스크립트 (예 .bash_profile:)가 다시 실행됩니다.

이 모든 sudo -i것이보다 안전합니다 sudo -s. 왜? 누군가가 전에 환경을 수정할 sudo -s수 있으면 의도하지 않은 명령이 실행될 수 있습니다. 가장 명백한 경우는 수정 SHELL이지만 아래에있는 PAGER경우 via와 같이 직접적으로 덜 발생할 수 있습니다 .man foosudo -s

당신은 "그들이 수정할 수 있다면, 말할 수도 PAGER, 그들은 수정할 수 있습니다 PATH, 그리고 그들은 단지 악을 대체 할 수있는 sudo프로그램을,"그러나 충분히 편집증 사람이 말할 수있는 /usr/bin/sudo /bin/bash그 함정을 피하기 위해. 당신은 아마도 편집증이 아니기 때문에 다른 모든 민감한 환경 변수 의 함정도 피할 수 있습니다 . EDITOR예를 들어 VCS 명령을 실행하기 전에 를 확인 해야 합니까? 따라서 sudo -i.

sudo -i작업 디렉토리를 사용자의 홈 디렉토리로 변경하기 때문에 실행했을 때 sudo -s와 같은 디렉토리에 남아있는 상황에서 계속 cd사용할 수 있습니다 sudo. 그것은을 아직 더 안전 sudo -i하고 cd있지만, 다시는 어디까지.


2
'vi에서 셸'이란 무엇입니까?
crisron

11
@crisron :에서 vi를 입력 :sh하고 Enter를 누르십시오. 이제 셸 vi을 생성 한 프로세스 의 모든 권한을 가진 하위 셸에 있습니다. vi루트 권한으로 실행중인 경우 셸도 마찬가지입니다. 또는 쉘 via 이외의 :!cmd명령을 실행하거나 명령에서 출력을 통해 편집 버퍼로 출력 등을 읽을 수 있습니다 :r !cmd. 모든 Makefile스크립트 가 잠겨 있으면 대상이 쉘 스크립트이고 Vim에 :make임의의 쉘을 효과적으로 실행할 수 있는 명령이 있습니다. 편집기 내에서 스크립트. 이 주석 상자를 보관하기에는 장난이 발생할 가능성이 너무 큽니다.
Warren Young

2
누군가 PATH에 bash에 가짜를 넣을 수 있다면 누군가가 PATH에 가짜 sudo를 넣을 수 있습니다. 전체 경로를 사용하여 sudo를 호출해야합니다./usr/bin/sudo
lesmana

1
@ lesmana : 편집에서 그 문제를 해결했습니다. 기본적으로 PATH유일한 문제는 아닙니다.
워렌 영

6
훌륭한 설명; 그것을 읽고 큰 두통.
lobi

27

에서 ubuntuforums 게시 나는 얼마 전에 만든 :

다음 실험을 고려하십시오.

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

내가 찾은 차이점은 다음과 같습니다.

sudo -s:

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

sudo su:

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

의 차이를 주목하라 $HOME. 루트 $HOME가되어 일반 사용자의 집으로 설정하면 문제가 발생할 수 있습니다. 예를 들어, 그래픽 앱을 실행하면 일반 사용자 ~/.Xauthority가 루트로 덮어 쓸 수 있습니다. 이로 인해 나중에 cron을 통해 특정 그래픽 앱을 실행할 수없는 등의 일반적인 사용자 문제가 발생합니다.

요약:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 아마 설정 /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

결론 sudo -i은 사용자 환경에 의해 오염되지 않은 루트 쉘을 원할 때 실행하는 적절한 명령입니다.


1
환경이 얼마나 오염되었는지는 sudo( /etc/sudoers및 관련 파일) 의 구성에 따라 다릅니다 . 같은 구성 설정 always_set_home, env_reset, env_keep, env_checkenv_reset, 이러한 사용자 및 명령에 따라 달라질 수 있습니다. sudoers (5) 맨 페이지 의 '명령 환경'SUDOERS OPTIONS 섹션을 참조하십시오 .
Curt J. Sampson

개인적으로 sudo -Hszsh와 bash를 사용하도록 변경 할 수있는 모든 응용 프로그램 계정을 사용하기 때문에 설정에 의해 환경이 오염되지 않도록하고 싶습니다. 이를 통해 특정 수의 환경 변수가 성가 시게 통과하지는 않지만 일반적으로 /etc/profile.d/*가 중요한 변수를 덮어 씁니다.
Ed Grimm

7

su( s witch u ser 또는 s ustitute u ser)를 사용하면 사용자를 전환 할 수 있습니다. su기본적으로 의도 된 사용자의 권한으로 다른 쉘 인스턴스를 시작합니다. 기본적으로 root사용자로 전환합니다. 특정 사용자를 전환하려면 다음과 같이 사용자를 전달해야합니다.

$ su bob  # switches to bob (requires bob's password)

su -환경 변수가 루트로 재설정 su됨을 의미하고 환경 변수를 이전 사용자로 의미합니다.

예를 들어, 사용하는 경우 root의 홈 디렉토리 su -또는 사용하는 경우 이전 사용자 홈 디렉토리 su.

sudo ( s uper u ser do )는 사용자가 다른 사용자의 보안 권한으로 프로그램을 실행할 수있게하는 명령 줄 유틸리티입니다 root. 기본적으로 superuser 입니다. /etc/sudoers특정 작업에 대한 권한이있는 사용자를 나열 하는 구성 파일 을 사용합니다.

sudo는 / ˈsuːduː / 로 읽어야 합니다. 구문 sudo command 마녀 U의 산이와 이 명령을.

  • susudo -i루트 계정에 로그인하는 것과 동일 하고 시뮬레이션합니다. 작업 디렉토리는 /root이고 루트 .profile등 을 읽습니다 . 프롬프트는 $에서 #으로 변경되어 루트 액세스 권한이 있음을 나타냅니다.

  • sudo -s 쉘을 루트로 시작하지만 작업 디렉토리는 변경하지 않습니다.

  • sudo bash 어디 bash에서 실행할 명령이 있습니까 sudo? 이 명령은 bash수퍼 유저로 실행 됩니다.

  • 사용은 sudo모든 것을 누군가가하는 기록 할 수 있습니다.
  • 사용 sudo하면 사용자가 루트 비밀번호를 알 필요가 없습니다.
  • 사용하여 sudo우리하면 명령을 실행할 수 있습니다 제한 할 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.