Artikel ini mencerminkan pengalaman pribadi dalam mengembangkan aplikasi CLI untuk Linux.
Ini membahas bagaimana proses superuser dapat mengeksekusi panggilan sistem dengan hak istimewa ketika diminta oleh program kontrol melalui API yang didefinisikan dengan baik.
Kode sumber ditulis dengan Python untuk aplikasi komersial nyata, tetapi disarikan dari tugas tertentu untuk publikasi.
pengantar
โKomunikasi antar proses (IPC) adalah pertukaran data antar utas dari satu atau proses yang berbeda. Ini diterapkan melalui mekanisme yang disediakan oleh kernel OS atau dengan proses yang menggunakan mekanisme OS dan mengimplementasikan kemampuan IPC baru. " - Wikipedia
Proses dapat memiliki alasan berbeda untuk bertukar informasi. Menurut pendapat saya, semua itu adalah konsekuensi dari kebijakan keamanan kernel Unix.
Seperti yang Anda ketahui, kernel Unix adalah sistem otonom yang berfungsi tanpa campur tangan manusia. Faktanya, pengguna adalah objek sistem operasi yang tampaknya melindungi kernel dari gangguan yang tidak sah.
Keamanan kernel adalah tentang membagi ruang alamat sistem operasi menjadi ruang kernel dan ruang pengguna . Oleh karena itu ada dua mode operasi sistem: mode pengguna dan mode kernel. Selain itu, perubahan mode adalah peralihan antara dua ruang.
Dalam mode pengguna, area memori yang dicadangkan oleh kernel tidak dapat diakses, begitu juga panggilan sistem yang mengubah status sistem.
Namun, superuser memiliki akses ini.
Prasyarat konkurensi
Jika program Anda tidak menggunakan panggilan sistem dengan hak istimewa, Anda tidak memerlukan superuser, yang berarti Anda dapat menulis monolit tanpa konkurensi.
Jika tidak, Anda harus menjalankan program Anda di bawah root.
, .
, , .
, , , , . , . , , , โ .
IPC.
|
|
|
|
|
|
, POSIX. |
|
, POSIX. |
(Message queue) |
. |
|
|
; , , Windows, , , IPC. |
|
. |
|
|
. |
|
, POSIX. |
(mmap) |
, POSIX. . Windows , API, API, POSIX. |
( ) |
MPI, Java RMI, CORBA . |
|
|
. |
|
|
, POSIX. |
|
|
, POSIX. |
API .
, , .
, , .
, , daemon. ยซdยป. : systemd.
, daemon , . : systemctl.
: ssh sshd.
.
.
โโโ core
โ โโโ api.py
โ โโโ __init__.py
โโโ main.py
core
โ , . api
.
API
from multiprocessing.connection import Client
from multiprocessing.connection import Listener
# ( )
#
daemon = ('localhost', 6000)
# ( )
#
cli = ('localhost', 6001)
def send(request: dict) -> bool or dict:
"""
.
,
.
"""
with Client(daemon) as conn:
conn.send(request)
with Listener(cli) as listener:
with listener.accept() as conn:
try:
return conn.recv()
except EOFError:
return False
def hello(name: str) -> send:
"""
send .
"""
return send({
"method": "hello",
"name": name
})
connection
multiprocessing
, API โ socket.
Client
โ , .
Listener
.
.
, Python, , . ยซ ยป .
API
main.py
api
.
from core import api
response = api.hello("World!")
print(response)
. lick Framework LI , API.
API
, . .
def hello(request: dict) -> str:
"""
.
"""
return " ".join(["Hello", request["name"])
API
from core import api
from multiprocessing.connection import Listener
from multiprocessing.connection import Client
# ( )
daemon = ('localhost', 6000)
#
cli = ('localhost', 6001)
while True:
with Listener(daemon) as listener:
with listener.accept() as conn:
request = conn.recv()
if request["method"] == "hello":
response = api.hello(request)
with Client(cli) as conn:
conn.send(response)
, .
Jadi, itu selalu mendengarkan pada port 6000 dan mem-parsing permintaan ketika datagram tiba. Kemudian memanggil metode yang ditentukan dalam permintaan dan mengembalikan hasil eksekusi ke klien.
Selain itu
Saya menyarankan Anda untuk melengkapi server Anda dengan paket systemd , yang memungkinkan program Python untuk masuk ke journald .
Untuk membangun Anda dapat menggunakan pyinstaller - ini akan mengemas kode Anda menjadi file biner dengan semua dependensi. Jangan lupa konvensi penamaan untuk file yang dapat dieksekusi yang disebutkan sebelumnya.
Terima kasih atas perhatiannya!