2
我試圖運行一個python腳本作爲其他用戶(不是root),這也是沒有shell的系統用戶。我知道我不能直接在腳本上設置suid標誌,所以我寫了一個C++包裝器。運行具有不同權限的Python
wrapper.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
int main(void)
{
std::cout << geteuid() << std::endl;
setgid(getgid());
setuid(getuid());
execl("/usr/bin/python2.6", "/usr/bin/python2.6", "test.py", NULL);
}
並設置以下權限
sudo chown NoShellUser:NoShellGroup /path/to/wrapper
sudo chmod 7755 /path/to/wrapper
最後,嘗試一下我有一個python腳本
import sys
import getpass
import os
import pwd
print "VERSION:", sys.version
print "USER:", getpass.getuser(), pwd.getpwuid(os.getuid())
print "EUSER:", pwd.getpwuid(os.geteuid())
有了下面的權限,如果該事項在全部
sudo chown NoShellUser:NoShellGroup /path/to/test.py
sudo chmod 7755 /path/to/test.py
現在,當我跑這件事爲用戶「測試」我看到這一點:
255 # UID of NoShellUser
VERSION: 2.6.8 (unknown, Apr 12 2012, 20:59:36) # Don't know where that comes from
[GCC 4.1.2 20080704 (Red Hat 4.1.2-52)] # Don't know where that comes from
USER: test pwd.struct_passwd(pw_name='test', pw_passwd='hash', pw_uid=20804, pw_gid=604, pw_gecos='Name Surname', pw_dir='/home/test', pw_shell='/bin/bash')
EUSER: pwd.struct_passwd(pw_name='test', pw_passwd='hash', pw_uid=20804, pw_gid=604, pw_gecos='Name Surname', pw_dir='/home/test', pw_shell='/bin/bash')
正如你所看到的有效用戶仍然是「測試」。有人可以指點我,我做錯了什麼,因爲我已經看了幾個例子,他們似乎都或多或少地顯示完全相同的東西?
你爲什麼不使用'sudo'? – hop
你能解釋一下這個程序的用途,以及爲什麼它需要在自己的賬戶下運行?根據情況,可能有更好的方法可供您使用。 –
這是一個隊列,它運行來自安全源的可執行文件,因爲代碼中沒有任何有害內容,但在大多數情況下不是由專業開發人員編寫的安全文件,因此可能存在允許升級權限的錯誤(那裏將是未經過測試的文本輸入到這個應用程序)。這就是爲什麼我希望它儘可能地孤立。最後,我將把它放到同一個系統(uid <500)用戶所擁有的cron中,但有時我需要從web界面自己啓動它。 –