다음 명령의 차이점은 무엇입니까?
su
sudo -s
sudo -i
sudo bash
su
루트 비밀번호를 알아야 하고 파일 sudo
에 있어야 한다는 것을 알고 있지만 sudoers
일단 실행되면 차이점은 무엇입니까?
내 홈 디렉토리는 내가 실행한 이후 이기 때문에 su
와 사이에 차이가 있다는 것을 알고 있지만 내 홈 디렉토리는 여전히 이후 입니다 . 그러나 나는 이것이 내가 놓친 근본적인 차이점의 증상일 뿐이라고 생각합니다.sudo -s
/root
su
/home/myname
sudo -s
답변1
su
너와 함께~이 되다다른 사용자 - 기본적으로 루트이지만 잠재적으로 다른 사용자입니다. 라고 말하면 su -
귀하의 환경도 해당 사용자의 로그인 환경으로 대체되므로 표시되는 내용은 해당 사용자로 로그인한 것과 구별할 수 없습니다. su
다른 사용자가 로그인할 때 해당 사용자가 수행한 작업을 통해 해당 사용자가 수행한 작업을 시스템에서 알 수 있는 방법은 없습니다 .
상황은 다음과 같이 매우 다릅니다 sudo
.
실행하는 명령
sudo
실행하다대상 사용자(기본적으로 루트이지만 변경할 수 있음)로 실행-u
하지만 이를 통해 실행하는 명령을 기록하고 사용자 이름으로 태그를 지정하여 나중에 비난을 할당할 수 있습니다. :)sudo
매우 유연합니다. 예를 들어 특정 사용자 또는 사용자 그룹이 실행할 수 있는 명령을 제한할 수 있습니다. 를 사용하면su
전부 아니면 전무입니다.이 기능은 일반적으로 역할을 정의하는 데 사용됩니다. 예를 들어
dump
및 실행이 허용된 "백업" 그룹을 정의할 수 있습니다.tar
각 그룹에는 시스템 디스크를 올바르게 백업하기 위해 루트 액세스가 필요합니다.여기서 이것을 언급하는 이유는 누군가에게 능력 이나 능력을
sudo
부여하지 않고도 특권을 부여할 수 있다는 의미이기 때문입니다 . 그들은 업무를 수행하는 데 필요한 권한만 갖고 있는 반면 전체 시스템을 실행합니다. 하지만 이 점에 주의해야 합니다. 예를 들어 누군가에게 이라고 말할 수 있는 능력을 부여하면 그 사람은 에서 벗어나 사실상 와 동일한 힘을 가질 수 있습니다 .sudo -s
sudo bash
su
sudo vi
vi
sudo -s
루트 비밀번호 대신 sudoer의 비밀번호를 사용하기 때문에
sudo
여러 sudoer 간의 권한을 격리합니다.su
이는 루트 비밀번호가 변경되면 이를 알아야 하는 모든 사람에게su
알려야 한다는 관리 문제를 해결합니다 .sudo
sudoer의 비밀번호를 독립적으로 변경할 수 있습니다. 실제로 시스템의 루트 사용자 계정을 비밀번호로 잠그면sudo
모든 시스템 관리 작업이sudo
. 신뢰할 수 있는 sudoer가 많은 대규모 조직에서 이는 시스템 관리자 중 한 명이 떠날 때 루트 암호를 변경하고 남아 있는 관리자에게 배포할 필요가 없음을 의미합니다.
sudo bash
와 의 주요 차이점은 다음 과 sudo -s
같습니다.
-s
보다 짧다bash
기본 쉘에서 슈퍼유저 권한으로
sudo -s some-command
실행하도록 할 수 있습니다 .some-command
기본적으로 의 약어입니다sudo $SHELL -c some-command
.대신 명령을 셸의 표준 입력(예
sudo -s < my-shell-script
: . 당신은 이것을 사용할 수 있습니다heredoc여러 명령을 단일 호출로 보내 반복적으로sudo
입력할 필요가 없습니다sudo
.이러한 추가 명령 인수가 없더라도 는 환경 변수 에서 먼저 찾은 다음 설정되지 않은 경우 일반적으로 사용자의 로그인 셸 설정에서 확인하기 때문에 와 다른 셸을 실행할 수 있다는 점에서
sudo -s
여전히 다릅니다 .sudo bash
bash
SHELL
/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
의도하지 않은 명령이 실행될 수 있기 때문입니다. 가장 확실한 경우는 수정이지만 , while under 라고 말하는 경우 SHELL
와 같이 덜 직접적으로 발생할 수도 있습니다 .PAGER
man foo
sudo -s
당신은 "만약 을 수정할 수 있다면 PAGER
을 수정할 수 있고 PATH
, 그런 다음 사악한 프로그램을 대체할 수 있습니다 sudo
"라고 말할 수도 있지만 편집증이 심한 사람은 /usr/bin/sudo /bin/bash
그 함정을 피하라고 말할 수 있습니다. 당신은 아마도 모든 상황에서 함정을 피할 만큼 편집증이 크지는 않을 것입니다.다른하지만 취약한 환경 변수. EDITOR
예를 들어, 다음을 실행하기 전에 확인하는 것도 기억하셨나요?VCS명령? 따라서 sudo -i
.
sudo -i
작업 디렉터리도 사용자의 홈 디렉터리로 변경되므로 실행 시에 있었던 것과 동일한 디렉터리에 남아 있기를 원하는 상황에서는 계속 사용하고 싶을 수 sudo -s
있습니다 . 그래도 원래 있던 곳으로 돌아가는 것이 여전히 더 안전합니다 .cd
sudo
sudo -i
cd
때때로 볼 수 있는 이 모든 것의 또 다른 변형은 이며 sudo su
, 이는 와 대략 동일합니다 sudo -s
. 마찬가지로 sudo su -
기능적으로도 와 매우 유사합니다 sudo -i
. sudo
와 는 경쟁하는 명령이기 때문에 su
이렇게 짝을 이루는 것이 조금 이상하므로 sudo
대신 플래그를 사용하는 것이 좋습니다.
답변2
에서우분투 포럼 포스트나는 얼마 전에 만들었습니다:
다음 실험을 고려해보세요.
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
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
아마 의해 설정/etc/environment
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
결론은 sudo -i
사용자 환경에 오염되지 않은 루트 셸을 원할 때 실행하는 적절한 명령입니다.
답변3
su
(에스마녀유서버 또는에스대체유ser)을 사용하면 사용자를 전환할 수 있습니다. su
기본적으로 의도된 사용자의 권한으로 다른 쉘 인스턴스를 시작합니다. 기본적으로 사용자를 root
사용자로 전환합니다. 특정 사용자를 전환하려면 다음과 같이 사용자를 전달해야 합니다.
$ su bob # switches to bob (requires bob's password)
su -
환경 변수가 루트로 재설정된다는 의미이며 su
환경 변수가 이전 사용자임을 의미합니다.
예를 들어, 를 사용하는 경우 루트의 홈 디렉토리, 를 su -
사용하는 경우 이전 사용자 홈 디렉토리입니다 su
.
sudo (에스위유세르하다)는 사용자가 다른 사용자(기본적으로 슈퍼유저, 즉 )의 보안 권한으로 프로그램을 실행할 수 있도록 하는 명령줄 유틸리티입니다 root
. /etc/sudoers
특정 작업에 대한 권한이 있는 사용자를 나열하는 구성 파일을 사용합니다.
sudo는 다음과 같이 읽어야 합니다./ˈsuːduː/. sudo command
즉 구문에스마녀유서버와하다이 명령.
su
sudo -i
루트 계정에 대한 로그인 과 동일하며 시뮬레이션합니다. 작업 디렉토리는 이며/root
루트 등을 읽습니다..profile
프롬프트가 $에서 #으로 변경되어 루트 액세스 권한이 있음을 나타냅니다.sudo -s
쉘을 루트로 시작하지만 작업 디렉토리는 변경하지 않습니다.sudo bash
bash
로 실행할 명령은 어디에 있습니까sudo
? 이 명령은bash
슈퍼유저로 실행됩니다.- 사용하면
sudo
누군가가 하는 모든 일이 기록될 수 있습니다. - 를 사용하면
sudo
사용자가 루트 비밀번호를 알 필요가 없습니다. - 이를 사용하면
sudo
실행이 허용되는 명령을 제한할 수 있습니다.