[英]How to make python open new Terminal as normal user and not as root user
[英]How to use a socket created by root with a normal user
所以我有這個服務器:
import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind('/tmp/sock.sock')
sock.listen(1)
while True:
conn, ca = sock.accept()
print(conn.recv(1024))
而這個客戶:
import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect('/tmp/sock.sock')
sock.send('Hello, World')
實際的發送和接收有點復雜,但只要服務器和客戶端都由 root 運行,就可以完美地工作。 當客戶端以 root 身份運行並且服務器由普通用戶運行時,它也可以工作。 但是當我嘗試由普通用戶使用 root 和客戶端運行服務器時,我得到了這個:
$ python3 client.py
connecting to /tmp/sock.sock
[Errno 13] Permission denied
我該如何解決這個問題? 服務器需要以 root 身份運行,客戶端需要以非特權用戶身份運行。
我已經明白它與套接字文件的文件權限有關,但我看不出我應該如何修復它。 我看不到任何傳遞給可以解決此問題的套接字構造函數的選項。
更改文件模式以允許任何人訪問它。 在您的服務器中添加此行
import os
os.chmod("/tmp/sock.sock", 0o777)
感謝 P.Dmitry 為我指明了正確的方向。 我最終對相同的想法進行了修改,這更適合我的需要:
import pwd
import grp
...
# Change the owner of the socket
os.chown('/tmp/sock.sock',
pwd.getpwnam('user').pw_uid,
grp.getgrnam('group').gr_gid)
# Restrict access to only this user (and root of course)
os.chmod('/tmp/sock.sock', 0o600)
0o
是 Python3 中的八進制前綴。 在 Python2 中,它只是0
,就像在 C 中一樣。
這不是一個好主意,如果您將整個服務器設計為以 root 身份運行,則某處存在設計錯誤。
這里發生的是 root 用戶使用自己的權限創建/tmp/sock.sock
文件,並且該文件只能由創建它的用戶訪問。
問題是,即使 Linux(但不是在 Mac OS 上)上的bind
方法已被修補為不遵循符號鏈接。 您仍在創建安全問題,假設該文件不存在。 並且服務器沒有運行。 然后,普通用戶可以創建從/tmp/sock.sock
到/etc/passwd
的符號鏈接,當服務器嘗試啟動時,它將嘗試綁定、設置權限,然后由於符號鏈接而失敗,但權限將是放。 因此,您將 passwd 文件設置為可寫。
即使沒有權限問題,假設有人發送了非常大量的數據並且它填滿了磁盤導致服務器崩潰。 如果您使用普通用戶運行服務器,則可以設置最大配額,但您不想在 root 上設置。
我的建議是:創建一個新用戶,其唯一任務是運行服務器和客戶端,並且具有所需的最低權限集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.