종료 및 재시작을 위해 왜 터미널에 루트가되어야합니까?


65

패키지를 설치 / 제거 / 업데이트하거나 관리 권한이 필요한 변경을 수행하면 sudo권한 이있는 관리자의 암호를 묻는 메시지가 표시됩니다. 이는 GUI와 터미널을 통해 발생합니다.

GUI를 통한 프롬프트

그러나 터미널을 통해 종료했다가 다시 시작하려고하면 다음과 같이 불평합니다 root.

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

그러나 오른쪽 상단의 톱니 바퀴를 통해 이러한 작업을 수행 할 때 비밀번호를 묻지 않습니다.

톱니 바퀴 메뉴

왜이 차이가 있습니까?


5
좋은 질문 이군요 내 시나리오는 바로 가기 키로 Ubuntu를 종료하는 것이 었습니다. 나는 ctrl + super + s 와 같은 할당 된 키를 누를 때 마다 명령을 실행 sudo shutdown -h now하지만 문제는 액세스 권한이 없으면 shutdown작동하지 않는다는 것입니다. .. 당신이 내 상황을 이해하기를 바랍니다 .. :)
Saurav Kumar


답변:


50

톱니 바퀴의 셧다운은 기계의 셧다운이 허용되는지 확인합니다. 이는 PolicyKit을 통해 수행됩니다. 종료 된 경우 파일에서이 명령문을 /usr/share/polkit-1/actions/org.freedesktop.consolekit.policy확인하십시오.

<action id="org.freedesktop.consolekit.system.stop">
  <description>Stop the system</description>
  <message>System policy prevents stopping the system</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>yes</allow_active>
  </defaults>
</action>

PolicyKit은 dbus-send명령을 트리거합니다 . 종료 된 경우 :

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

root-Privileges와 함께 백그라운드에서 실행중인 데몬이 종료 명령을 호출합니다.

명령 줄 ( shutdown, reboot, halt, ...)을 통해 "이전 방식"으로 시스템을 종료하려면 해당 명령에 suid-Bit을 추가해야합니다. 그러나 셸에 액세스 할 수있는 시스템의 모든 사용자가 시스템을 종료 할 수 있습니다.


14
약간 안전한 옵션은 sudoers에 암호가없는 종료 등을 허용하는 것입니다. 쉽게 수행 할 수 있습니다 : enter sudo visudo, add %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot, save 및 exit. 이런 식으로 명령 줄을 다시 부팅 할 때는 여전히 필요 sudo reboot하지만 암호를 입력 할 필요 는 없습니다.
Sebastian Thürrschmidt

27

우분투는 GNU / 리눅스 운영 시스템의 배포판으로, 유닉스 시스템 제품군에 속합니다. 이는 여러 현대 운영체제의 공통 아키텍처입니다.

전통적으로 Unix는 메인 프레임 컴퓨터에서 실행되었습니다. 원격 터미널을 통해 수십 또는 수백 명의 사용자에게 서비스를 제공하는 중앙 컴퓨팅 시설. 모든 사용자가 메인 프레임의 가용성에 의존하기 때문에 단일 사용자가 종료 명령을 실행할 수 없었습니다. 유닉스 아키텍처의 기본 개념-시스템 커널은 수퍼 유저 프로세스가 해당 함수를 호출하지 않는 한 시스템 종료를 초기화하지 않습니다.

현대 데스크탑 시스템에서 개발자는 단순한 데스크탑 사용자 만 시스템 종료를 사용할 수 있도록하기 위해 몇 가지 어려움을 겪었습니다. 일반적인 기술은 일반적으로 루트 사용자의 보안 컨텍스트에서 실행되는 로그인 관리자가 종료 및 재부팅을 처리하도록하는 것입니다. 이 경우 그래픽 쉘은 로그인 관리자에게 요청하여 컴퓨터를 종료합니다. 여기에는 일반적으로 dbus 서비스를 통한 프로세스 간 통신 (IPC) 사용이 포함됩니다.

위에서 언급 한 정책 키트는 로그인 관리자 (또는 모든 프로그램이 종료 서비스를 제공하는 프로그램)가 종료를 유발할 수있는 사용자를 확인하고 관리자가 해당 권한을 각각 구성 할 수있는 표준화 된 프레임 워크를 제공하여이 프로세스를 확장합니다.

일부 데스크탑 환경은 IPC 기반 서비스를 사용하지 않고 동일하거나 유사한 기능을 제공하기 위해 일련의 도우미 프로그램을 사용합니다. 이러한 도우미 프로그램은 메커니즘을 통해 호출되므로 sudo, suid 또는 sudo와 유사한 정책 키트 메커니즘과 같은 수퍼 유저 컨텍스트로 변경할 수 있습니다.

어쨌든 쉘의 벙어리 전통적인 종료 프로그램은 이런 방식으로 작동하지 않습니다. 수퍼 유저 컨텍스트에서 실행되고 있는지 확인해야합니다.


14

Linux는 일반적으로 서버 또는 이와 유사한 것으로 사용되기 때문에 일반적인 Ubuntu 랩톱이라도 Linux 상자에 SSH로 연결하는 것이 일반적입니다.

즉, SSH 액세스 권한이있는 사용자가 특히 원격으로 로그인 한 다른 사용자가이를 사용하는 경우 SSH를 종료하지 못하게 할 수 있습니다. GUI에 액세스 할 수있는 사람은 물론 물리적 전원 버튼으로 GUI를 종료 할 수 있습니다.

또한 원격으로 로그인 한 사용자는 다시 켤 수 없습니다.


나는이 질문을했을 때 나에게 발생하지 않았지만 우분투에서 원격 서버에 GUI 패키지를 설치하고 명령 줄 대신 GUI를 통해 원격 서버를 사용하는 옵션이라고 생각합니다. (Windows Remote Desktop 또는 Teamviewer 작동 방식과 유사). 따라서 GUI를 통해 Ubuntu를 사용하는 사람이 물리적 전원 버튼으로 종료 할 수 있다는 가정을 무효화합니다.
Aditya

@aditya는 서버가 그런 식으로 설정되어 있어야하며, 관리자가 결정해야합니다
Manishearth

예. 패키지를 설치하고 필요에 따라 구성하려면 루트 권한이 필요합니다. 그러나이 시나리오는 어제 귀하의 답변을 읽는 동안 내 마음에 들었고 나는 그것을 당신과 공유 할 것이라고 생각했습니다 :-)
Aditya

14

GUI를 통해 재부팅 할 때 sudo암호 없이 할 수 있습니다 .

로그인 한 유일한 사용자 인 경우에만. 다른 사용자 (콘솔 사용자 포함)가있는 경우 루트 암호를 입력해야 할 수 있습니다. 이것은 OS X 및 최신 Windows 버전에서 동일합니다.

왜 그런 겁니까? 우분투 시스템 내부에서 무슨 일이 일어나고 있습니까?

다음 명령 :

/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

D-Bus는 동일한 호스트에서 실행되는 프로세스 간의 로컬 통신을위한 매체 인 IPC 메커니즘입니다.

D-Bus는 UDP와 같은 저수준 메시지 전달 프로토콜보다 "똑똑하다". 반면, 메시지는 연속적인 데이터 스트림이 아닌 개별 항목으로 메시지를 전달합니다.

D-Bus는 운반하는 데이터의 구조화 된보기를 가지고 있으며 이진 형식의 데이터를 처리합니다. 다양한 너비, 문자열 등의 정수. 데이터는 단순히 D-Bus에 대한 "원시 바이트"가 아니기 때문에 메시지의 유효성을 검사 할 수 있습니다.

- 무료 데스크탑

shutdown누군가가 로그인했는지 확인 하지 않는 이유는 무엇 입니까? 솔직히 말해서 용병없는 기능인 것 같습니다. 때로는 시간이 절약 될 것이라고 생각할 수 있지만 일관된 콘솔이 종종 선호됩니다. 나는 명령하지 않으 때로는 그것을 실행 한 후 암호를 요구하고, 때로는 없습니다.

내 대명사는


qdbus 앱을 통한 더 짧은 버전도 있습니다
Sergiy Kolodyazhnyy

DE (이 경우 그놈)에서 종료 / 로그 아웃 할 때 sudoGDM을 통해 로그인 한 다른 사용자 또는 tty를 통해 로그인 한 다른 사용자와 루트 / 사용자 비밀번호를 묻지 않습니다 .
kos

@ kos hu, 이상합니다. 이 스크린 샷은 Gnome 3의 스크린 샷이며 gui와 tty에 로그인했습니다
Tim

같은 메시지가 표시되지만 "전원 끄기"를 클릭하면 시스템이 종료됩니다. 나는 또한 Fabby에게 이것을 시험해 보라고 요청했고 그것은 그에게도 똑같이 적용됩니다.
kos

@kos 어. 후회.
Tim

9

GUI에서 시스템 종료를 시작하기 위해 루트가 될 필요가없는 이유는 대부분 일반 데스크탑 사용자에게 편의의 문제입니다. 시스템 사용자가 콘솔에 로그인 한 것을 알고 있으므로 실수로 컴퓨터를 종료 한 경우 컴퓨터를 다시 켤 수 있습니다.

쉘에있는 사용자의 경우 원격으로 로그인하는 것이 좋을 수 있으므로 시스템에서 종료 명령을 실행하려면 루트로 로그인해야합니다. 이렇게하면 다른 사람이 서버를 사용하는 동안 서버에 로그인 한 일반 사용자가 서버를 종료 할 수 없으며 실제로 컴퓨터를 백업 할 사람이있을 필요는 없습니다.

shutdown이 수퍼 유저 비밀번호에 대한 GUI 프롬프트를 제공하지 않는 이유는 아마도 실제로 얻을 수있는 실제 유틸리티가 없기 때문일 수 있습니다. 콘솔에 프롬프트가 표시되는 위치에있는 경우 cog- hee 메뉴. 종료 할 수퍼 유저 암호를 묻는 명령 줄 프롬프트를 원한다면 이미 "sudo shutdown"으로 사용할 수 있습니다.


5

다중 사용자 시스템에서 마지막으로 원하는 것은 사용자가 언제든지 서버에 로그인하여 무작위로 서버를 재부팅 할 수 있으므로 명령 행 버전의 Reboot는 수퍼 유저 전용 명령이므로 루트 또는 sudo 권리가 있습니다.

Halt 및 PowerOff 명령도 분리하십시오.


2
귀하의 답변에 감사드립니다. 수십 명의 컴퓨터 사용자가 컴퓨터를 재부팅 할 수 없어야하지만 마우스를 통해 재부팅하기로 선택했을 때 우분투 (또는 거의 모든 데스크탑 배포판)가 수행하는 작업을 이해합니다 키보드 대신? 그들은 특권없이 그것을 허용합니다.
asco

3
systemctl, loginctl, systemd, 시스템 정책 등과 같은 구성 요소는 모두 데스크탑 환경을보다 사용자 친화적으로 만들기 위해 루트 액세스를 명시 적으로 요구하지 않고 현재 로그인 한 사용자가 특정 루트 기능에 액세스 할 수 있도록하지만 반드시 명령 행을 호출 할 필요는 없습니다 해당 작업을 수행하는 명령.
Jeff Sereno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.