Cara terbaik untuk mematikan sistem adalah dengan menggunakan kode berikut
import os
os.system('systemctl poweroff')
Banyak distribusi linux di luar sana membutuhkan hak super user untuk mengeksekusi shutdown
atau halt
, tetapi kemudian, mengapa jika Anda duduk di depan komputer, Anda dapat mematikannya tanpa melakukan root? Anda membuka menu, tekan Shutdown dan dimatikan tanpa Anda menjadi root
, kan?
Yah... alasannya di balik ini adalah bahwa jika Anda memiliki akses fisik ke komputer, Anda dapat menarik kabel daya dan mematikannya, jadi saat ini, banyak distribusi memungkinkan mematikan meskipun akses ke Bus Sistem lokal dapat diakses melalui dbus
. Masalah dengan dbus
(atau layanan yang diekspos melalui itu, lebih tepatnya)? Ini terus berubah. Saya akan merekomendasikan menginstal alat penampil dbus seperti D-feet (maklum:masih cukup sulit untuk divisualisasikan, tetapi mungkin membantu)
Lihat skrip penonaktifan Dbus ini.
Jika Anda masih memiliki HAL di distrubution Anda (sedang ditinggalkan) coba ini:
import dbus
sys_bus = dbus.SystemBus()
hal_srvc = sys_bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/devices/computer')
pwr_mgmt = dbus.Interface(hal_srvc,
'org.freedesktop.Hal.Device.SystemPowerManagement')
shutdown_method = pwr_mgmt.get_dbus_method("Shutdown")
shutdown_method()
Ini berfungsi pada Ubuntu 12.04 (saya baru saja mematikan komputer saya untuk memastikannya berfungsi). Jika Anda memiliki sesuatu yang lebih baru... yah, itu mungkin tidak berfungsi. Kelemahan dari metode ini:ini sangat spesifik untuk distribusi.
Anda mungkin harus memasang dbus-python
paket agar ini berfungsi (http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html)
PEMBARUAN 1:
Saya telah melakukan sedikit riset dan sepertinya ini dilakukan di versi Ubuntu yang lebih baru melalui ConsoleKit. Saya telah menguji kode di bawah ini di Ubuntu 12.04 saya (yang memiliki HAL yang sudah usang dan ConsoleKit yang lebih baru) dan ternyata mematikan komputer saya:
>>> import dbus
>>> sys_bus = dbus.SystemBus()
>>> ck_srv = sys_bus.get_object('org.freedesktop.ConsoleKit',
'/org/freedesktop/ConsoleKit/Manager')
>>> ck_iface = dbus.Interface(ck_srv, 'org.freedesktop.ConsoleKit.Manager')
>>> stop_method = ck_iface.get_dbus_method("Stop")
>>> stop_method()
PEMBARUAN 2:
Mungkin mengapa dapatkah Anda melakukan ini tanpa root
layak mendapatkan sedikit penjelasan yang lebih luas. Mari fokus pada ConsoleKit
yang lebih baru (HAL
jauh lebih rumit dan berantakan, IMHO).
ConsoleKit
adalah layanan yang berjalan sebagai root
di sistem Anda:
[email protected]:/tmp$ ps aux|grep console-kit
root 1590 0.0 0.0 1043056 3876 ? Sl Dec05 0:00 /usr/sbin/console-kit-daemon --no-daemon
Sekarang, d-bus
hanyalah sistem penyampaian pesan. Anda memiliki layanan, seperti ConsoleKit yang memaparkan antarmuka ke d-bus
. Salah satu metode yang diekspos adalah Stop
(ditunjukkan di atas). ConsoleKit izin dikontrol dengan PolKit , yang (walaupun didasarkan pada izin Linux reguler) menawarkan sedikit kontrol yang lebih halus untuk "siapa yang bisa melakukan apa" . Misalnya, PolKit dapat mengatakan hal-hal seperti "Jika pengguna masuk ke komputer, izinkan dia melakukan sesuatu. Jika terhubung dari jarak jauh, maka jangan." . Jika PolKit menentukan bahwa pengguna Anda diizinkan untuk memanggil ConsoleKit Stop
metode, permintaan itu akan diteruskan oleh (atau melalui ) d-bus
ke ConsoleKit (yang selanjutnya akan mematikan komputer Anda karena dapat... karena itu layak... karena root
)
Bacaan lebih lanjut:
- Apa itu ConsoleKit dan PolicyKit? Bagaimana cara kerjanya?
- ArchWiki PolKit
Ringkasnya:Anda tidak dapat mematikan komputer tanpa menjadi root
. Namun Anda dapat mengetahui layanan yang berjalan sebagai root
untuk mematikan sistem untuk Anda.
PEMBARUAN 3:
Pada Desember 2021, tujuh tahun setelah jawaban asli ditulis, saya harus melakukannya lagi. Kali ini, di Ubuntu 18.04.
Tidak mengherankan, tampaknya ada sedikit perubahan:
- Fungsi PowerOff tampaknya ditangani melalui
org.freedesktop.login1
baru layanan, yang merupakan bagian dari """baru""" (uhk! uhuk!) SystemD mesin . dbus
Paket Python tampaknya sudah usang dan/atau dianggap "warisan". Akan tetapi, ada pustaka PyDbus baru yang akan digunakan.
Jadi kami masih dapat mematikan mesin dengan skrip yang tidak memiliki hak istimewa:
#! /usr/bin/python3
from pydbus import SystemBus
bus = SystemBus()
proxy = bus.get('org.freedesktop.login1', '/org/freedesktop/login1')
if proxy.CanPowerOff() == 'yes':
proxy.PowerOff(False) # False for 'NOT interactive'
Perbarui 3.1:
Sepertinya ini bukan baru seperti yang saya pikirkan X-D
Sudah ada jawaban dari @Roeften di utas yang sama ini.
BONUS :
Saya membaca di salah satu komentar Anda bahwa Anda ingin mematikan komputer setelah tugas yang memakan waktu untuk mencegahnya menjadi terlalu panas... Tahukah Anda bahwa Anda mungkin nyalakan pada waktu tertentu menggunakan RTC? (Lihat ini dan ini) Cukup keren, eh? (Saya sangat senang saat tahu saya bisa melakukan ini... ) :-D
import os
os.system("shutdown now -h")
jalankan skrip Anda dengan hak akses root.
ada cara untuk mematikan...tanpa hak istimewa yang lebih tinggi?
Tidak, tidak ada (untungnya!).
Perhatikan bahwa Anda dapat menggunakan beberapa fitur sistem untuk mempermudah peningkatan hak istimewa bagi pengguna biasa:
sudo
setuid
setcap