'sudo su-'vs 'sudo -i'vs 'sudo / bin / bash'-어떤 것이 중요합니까, 아니면 어느 것이 중요합니까?


254

루트를 수십 번 연속 입력 해야하는 작업을 수행 할 때 세션을 루트 세션으로 전환하는 것을 선호합니다. 인터넷에서 사용한 다양한 자습서와 지침 sudo su에서 sudo su -, sudo -isudo /bin/bash루트 세션을 여는 데 사용되는 것을 볼 수 있지만 이러한 차이점과 언제 또는 그 차이가 중요한지 명확하지 않습니다.

누군가 나를 위해 이것을 정리할 수 있습니까?


11
당신에 대해 물어 깜빡 sudo -s하고 sudo su.
Radu Rădeanu




3
@ RaduRădeanu 질문을 입력 할 때 제안 된 질문을 검토했지만 실제로 내 완전한 질문을 해결 한 사람은 없었습니다. 연결 한 질문에 대해서도 마찬가지입니다. 그들은 나를 위해 많은 새로운 정보를 포함하고 있으며, 그들을 연결해 주셔서 감사합니다.하지만 아래의 사용자 혼돈이 제공하는 답변만큼 완벽하지는 않습니다.
Paul

답변:


325

이를 설명하려면 프로그램이 무엇을하는지 알아야합니다.

  • su-이 명령은 su다른 사용자 (로 전환하는 데 사용되는 S의 마녀 U의 SER),하지만 당신은 어떤 매개 변수를 사용하여 명령을 호출하여 루트 사용자로 전환 할 수 있습니다. su사용자 환경으로 전환 한 비밀번호를 입력 한 후 전환 할 사용자의 비밀번호를 묻습니다.
  • sudo- sudo루트 권한으로 단일 명령을 실행하기위한 것입니다. 그러나 su현재 사용자의 비밀번호를 묻는 메시지 와 달리 . 이 사용자는 sudoers 파일 (또는 sudoers 파일에있는 그룹)에 있어야합니다. 기본적으로 Ubuntu는 암호를 15 분 동안 "기억"하므로 매번 암호를 입력 할 필요가 없습니다.
  • bash-컴퓨터와 상호 작용하는 텍스트 인터페이스 로그인, 비 로그인, 대화식 및 비 대화식 쉘의 차이점을 이해하는 것이 중요합니다.

포탄의 종류 :

  • 로그인 쉘 : 로그인 쉘은 지정된 사용자로 시스템에 로그인합니다. 사용자 이름과 비밀번호가 필요합니다. 가상 터미널에 로그인하기 위해 ctrl+ alt+ F1를 누르면 로그인 쉘에 로그인 한 후 얻을 수 있습니다.
  • non-login shell : 로그인 하지 않은 상태에서 실행되며 현재 로그인 한 사용자입니다. 그놈에서 그래픽 터미널을 열면 비 로그인 쉘입니다.
  • 대화식 쉘 : 대화식으로 명령을 입력하거나 중단 할 수있는 쉘 (로그인 또는 비 로그인). 예를 들어 그놈 터미널.
  • 비 대화식 쉘 : 자동화 된 프로세스에서 실행되는 (서브) 쉘. 입력이나 출력이 보이지 않습니다.

따라서 사례는 다음과 같습니다.

  • sudo susudo명령으로 호출 합니다 su. Bash는 대화 형 비 로그인 셸이라고합니다. bash는 오직 실행 만한다 .bashrc. 루트로 전환 한 후에도 여전히 같은 디렉토리에 있음을 알 수 있습니다.

    user@host:~$ sudo su
    root@host:/home/user#
  • sudo su -이 시간은 로그인 쉘, 그래서 /etc/profile, .profile그리고 .bashrc실행하면 루트의 환경과 루트의 홈 디렉토리에있는 자신을 발견 할 것이다.

  • sudo -isudo su --i (초기 로그인 시뮬레이션) 옵션은 대상 사용자의 비밀번호 데이터베이스 항목에 의해 지정된 쉘을 로그인 쉘로 실행 하는 것과 거의 동일 합니다. 이 로그인 특정 자원과 같은 파일을 의미 .profile, .bashrc또는 .login읽고 쉘에 의해 실행됩니다.

  • sudo /bin/bash이것은 당신 sudo이 명령으로 호출한다는 것을 의미합니다 /bin/bash. /bin/bash비 로그인 쉘로 시작되어 모든 도트 파일이 실행되지는 않지만 bash 자체 .bashrc는 호출하는 사용자를 읽습니다 . 환경은 동일하게 유지됩니다. 당신의 집은 뿌리의 집이 아닙니다. 그래서 당신은 근본이지만 호출하는 사용자의 환경에 있습니다.

  • sudo -s$SHELL변수를 읽고 내용을 실행합니다. 경우 $SHELL포함 /bin/bash이 호출 sudo /bin/bash(위 참조).

검사:

로그인 쉘에 있는지 여부를 확인하려면 ( shopt내장 명령 이므로 bash에서만 작동 ) :

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

18
설명 : sudo허용 된 사용자가 수퍼 유저 또는 다른 사용자 로 명령을 실행할 수 있습니다 . 어쨌든 노력에 +1하십시오.
Radu Rădeanu

2
@chaos이 훌륭한 답변에 감사드립니다! 대부분 내 질문에 대답하므로 계속 진행하여 질문에 답변을 표시했지만 특정 쉘을 실행하는 것이 바람직한 시점을 이해하지 못합니다. 나는 실제로 명령 줄을 통해 우분투를 사용하고 root사용자 세션 을 여는 데 가장 일반적으로 사용되는 것을 발견합니다 (vs 사용 sudo)는 root새로운 것을 설치하거나 주요 재구성을 수행 할 때와 같이 권한을 많이 사용해야하는 일을하는 경우입니다 . 나는을 사용 sudo /bin/bash했지만 분명히 이해할 수없는 이유로 그 방법에 나쁜 랩이 있습니다.
Paul

2
또한 su는 수퍼 유저가 아닌 스위치 사용자를 의미한다고 말하는 것이 더 정확합니다. 즉, PHP 스크립트를 실행하십시오 : su www-data /usr/share/script.php 또는 대화식 쉘을위한 su www-data. 그러나 사용자 이름이없는 su는 루트 (슈퍼 사용자) 계정을 가정합니다.
oblivian 2019

혼돈- "shopt -q login_shell && echo '로그인 쉘'|| echo '로그인 쉘 없음'"이런 종류의 제안은 자주 볼 수 있지만 왜 그렇게 길어 집니까? && 연산자는 종료 코드가 0이면 "다음 명령 수행"을 의미하고 이중 파이프 (||)는 다른 것을 의미하고 (0이 아닌 경우)이 명령을 수행합니다. 따라서 기본적으로 종료 코드 0 인 경우 "로그인 쉘", 종료 코드 1 (실패한 경우) "로그인 없음"을 표시합니다. 왜 "shopt -q login_shell; echo $"가 아닌가? $? 는 이전 명령의 결과 / 종료 코드를 의미합니다. 모든 프로그램이 0이 아닌 경우 대부분은 성공을 의미하고 1 이상은 실패합니다. 에코는 = 성공 ... 0 그래서 경우
oblivian

2
@ 폴 : sudo -i제안합니다. 여기를 읽으십시오 : ubuntuforums.org/showthread.php?t=1817402 그리고 여기 : unix.stackexchange.com/questions/98531/…
Marco Sulla

0

차이점을 찾기 위해 다른 호출간에 결과 환경을 혼란시킬 수 있습니다.

몇 가지 중요한 변수에서 "작은" 차이점을 찾을 수 있습니다 .

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

또는 ~ /의 약간의 차이. 도트 파일 처리 ( ~/.config).

명령이 생성하는 $ HOME 기반 로그 파일 ( ~/.xsession.errors, 등 ...) 또는 xauth 쿠키 ( ~/.Xauthority) 의 소유권도 고려하십시오 .

다음 명령을 시도하십시오 :


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.