ImportError und PyExc_SystemError beim Einbetten von Python-Skript in C für PAM-Module (.so-Dateien)
Ich versuche, ein Demo-PAM-Modul in C zu schreiben, das das Embedding Python in C-Konzept verwendet, um ein in python (2.7) geschriebenes Skript in der Funktion pam_sm_authenticate () auszuführen, die in der C-Datei (pam_auth.c) geschrieben ist.
Dies ist das Python-Skript: test.py
import math
import numpy
def test_func():
a = "test"
return a
Der Pfad für test.py lautet /usr/lib/Python2.7/, sodass ich ihn problemlos importieren kann.
Dies ist die C-Datei:
#define PAM_SM_AUTH
#define PAM_SM_ACCOUNT
#define PAM_SM_SESSION
#include <security/pam_modules.h>
#include <security/_pam_macros.h>
#include <security/pam_appl.h>
#include<python2.7/Python.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NOBODY "nobody"
/*PAM Stuffs*/
PAM_EXTERN int pam_sm_authenticate(
pam_handle_t* pamh, int flags, int argc, const char** argv)
{
const char *user;
int retval;
user = NULL;
retval = pam_get_user(pamh, &user, NULL);
if(retval != PAM_SUCCESS)
{
fprintf(stderr, "%s", pam_strerror(pamh, retval));
// return (retval);
}
fprintf(stdout, "retval= %d user=%s\n", retval,user);
if (user == NULL || *user =='\0')
pam_set_item(pamh, PAM_USER, (const char*)NOBODY);
/* Python Wrapper */
// Set PYTHONPATH TO working directory
//int res = setenv("PYTHONPATH",".",1);
//fprintf(stdout, "%d", res);
PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *pResult;
// Initialize the Python Interpreter
Py_Initialize();
// Build the name object
pName = PyString_FromString((char*)"test");
// Load the module object
pModule = PyImport_Import(pName);
// pDict is a borrowed reference
PyErr_Print();
pDict = PyModule_GetDict(pModule);
// pFunc is also a borrowed reference
pFunc = PyDict_GetItemString(pDict, (char*)"test_func");
if (PyCallable_Check(pFunc))
{
pValue=NULL;
PyErr_Print();
pResult=PyObject_CallObject(pFunc,pValue);
PyErr_Print();
}else
{
PyErr_Print();
}
printf("Result is %s\n",PyString_AsString(pResult));
// Clean up
Py_DECREF(pModule);
Py_DECREF(pName);/* */
// Finish the Python Interpreter
Py_Finalize();
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_setcred(
pam_handle_t* pamh, int flags, int argc, const char** argv)
{
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_acct_mgmt(
pam_handle_t* pamh, int flags, int argc, const char** argv)
{
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_open_session(
pam_handle_t* pamh, int flags, int argc, const char** argv)
{
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_close_session(
pam_handle_t* pamh, int flags, int argc, const char** argv)
{
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_chauthtok(
pam_handle_t* pamh, int flags, int argc, const char** argv)
{
return PAM_SUCCESS;
}
Die C-Datei ist nur eine Modifikation von pam_permit.c. Die C-Datei wird mit gcc (gcc -shared -o pam_auth.so -fPIC pam_auth.c -I / usr / include / python2.7 -lpython2.7) kompiliert, um eine .so-Datei (pam_auth.so) zu erhalten, und wird abgelegt im Ordner / lib / security /
Ich habe die PAM-Konfiguration der 'sudo'-Datei in /etc/pam.d wie folgt geändert:
#%PAM-1.0
auth required pam_env.so readenv=1 user_readenv=0
auth required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
#@include common-auth #this line is commented to make it use my pam module
auth required pam_auth.so
@include common-account
@include common-session-noninteractive
Die Zeile "auth required pam_auth.so" zwingt das System, mein Modul jedes Mal zur Authentifizierung zu verwenden, wenn ich den Befehl "sudo" verwende. (zum Beispiel sudo nautilus)
Nun ist das Problem: Diese Zeile in der C-Datei "pModule = PyImport_Import (pName);" gibt einen Importfehler aus, der von PyErr_Print () wie folgt gedruckt wird:
stitches@Andromida:~$ sudo nautilus
retval= 0 user=stitches
Traceback (most recent call last):
File "/usr/lib/python2.7/subho_auth.py", line 8, in <module>
import numpy
File "/usr/lib/python2.7/dist-packages/numpy/__init__.py", line 153, in <module>
from . import add_newdocs
File "/usr/lib/python2.7/dist-packages/numpy/add_newdocs.py", line 13, in <module>
from numpy.lib import add_newdoc
File "/usr/lib/python2.7/dist-packages/numpy/lib/__init__.py", line 8, in <module>
from .type_check import *
File "/usr/lib/python2.7/dist-packages/numpy/lib/type_check.py", line 11, in <module>
import numpy.core.numeric as _nx
File "/usr/lib/python2.7/dist-packages/numpy/core/__init__.py", line 6, in <module>
from . import multiarray
ImportError: /usr/lib/python2.7/dist-packages/numpy/core/multiarray.so: undefined symbol: PyExc_SystemError
Segmentation fault (core dumped)
Wie ich verstehen kann, kann die in der Datei test.py angegebene numpy-Bibliothek nicht importiert werden. Wie kann man dieses Problem von ImportError & PyExc_SystemError lösen?
Das Python-Skript funktioniert wie ein Zauber, wenn ich es wie folgt ausführe:
#include <Python.h>
#include <stdlib.h>
#include <string.h>
int main()
{
// Set PYTHONPATH TO working directory
//int res = setenv("PYTHONPATH",".",1);
//fprintf(stdout, "%d", res);
PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *pResult;
// Initialize the Python Interpreter
Py_Initialize();
// Build the name object
pName = PyString_FromString((char*)"test");
// Load the module object
pModule = PyImport_Import(pName);
// pDict is a borrowed reference
PyErr_Print();
pDict = PyModule_GetDict(pModule);
// pFunc is also a borrowed reference
pFunc = PyDict_GetItemString(pDict, (char*)"test_func");
if (PyCallable_Check(pFunc))
{
pValue=NULL;
PyErr_Print();
pResult=PyObject_CallObject(pFunc,pValue);
PyErr_Print();
}else
{
PyErr_Print();
}
printf("Result is %s\n",PyString_AsString(pResult));
// Clean up
Py_DECREF(pModule);
Py_DECREF(pName);/* */
// Finish the Python Interpreter
Py_Finalize();
return 0;
}
Wenn es unter allgemeinen Python-Einbettungsbeispielen funktioniert, warum funktioniert es nicht unter PAM-basierten Einbettungsbeispielen (wo werden .so-Dateien verwendet)?
PS: Ich importiere Numpy aus einem bestimmten Grund. Fragen Sie nicht, warum ich in Python-Skripten keine Verwendung gefunden habe, da dies nur ein Demo-Skript für das ist, was ich erreichen möchte. Außerdem gibt import math keinen Importfehler aus. Ich erhalte auch einen Importfehler für SciPY.
PPS: Numpy und Scipy-Pakete funktionieren perfekt in Python-Skripten und werden unter /usr/lib/python2.7/dist-packages/ installiert. Ich benutze Ubuntu 14.04.
Bitte hilfe !!!!