C текущий каталог в дочернем процессе - PullRequest
0 голосов
/ 20 февраля 2020

Я пишу пользовательский модуль PAM.

Я написал файл общего объекта (.so), как требуется для Linux -PAM. Этот файл .so делает вызов встроенным Python, чтобы открыть мое распознавание лиц, и, в зависимости от результата, вернет PAM_SUCCESS или PAM_AUTH_ERR

В файле /etc/pam.d/sudo, который у меня есть сказал PAM, что файл находится в (/home/berns/2020-ca326-cberns-fileencryption-with-opencv/PAM/pam_authnew.so). Это нормально, так как, когда набирается sudo, я вижу, как печатается мое личное заявление об ошибке, в котором говорится, что он не может загрузить файл Python.

Проблема, с которой я столкнулся, заключается в том, что код распознавания лиц находится в совершенно ином каталоге, из которого находится файл .so. (../Code/facial). Я использовал команду chdir в своем коде C, но, похоже, он не меняет каталог на тот, где находятся лицевые файлы Python, чтобы обеспечить успех или нет.

Есть ли что-то, чего мне не хватает?

C код, указанный ниже:

#define PAM_SM_AUTH
#define PAM_SM_ACCOUNT
#define PAM_SM_SESSION
#define GetCurrentDir getcwd
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <security/pam_appl.h>
#include <security/pam_modules.h>
#include </usr/include/python3.6m/Python.h>


int main(int argc, char** argv){

}



PAM_EXTERN int pam_sm_authenticate( pam_handle_t *pamh, int flags,int argc, const char **argv ){

    char *result;
    chdir("../code/facial"); // this changes it to the correct directory to execute


    //dlopen("/usr/lib/x86_64-linux-gnu/libpython3.6m.so",RTLD_LAZY | RTLD_GLOBAL);
    Py_Initialize(); // Starts python interpreter
    PyRun_SimpleString("import os\nimport sys\nsys.path.append(os.getcwd())"); // lets python know where we are

    PyObject *mymod, *func1, *ret1;
    mymod = PyImport_ImportModule("pam_detect"); // This is the .py
    if (mymod != NULL){ // check if the file file was loaded
        func1 =  PyObject_GetAttrString(mymod, "detect"); // hel is the function name in the file you declared earlier
        ret1 = PyObject_CallObject(func1, NULL); // Null because the function doesnt take an argument.
        result = PyUnicode_AsUTF8(ret1);
        //printf("%s\n", result);
        if (strcmp(result, "success") == 0){
            Py_Finalize();
            return PAM_SUCCESS;
        }
        else{
            Py_Finalize();
            return PAM_AUTH_ERR;

        }
    }

    else{
            printf("Error: can't find file!\n");
    }

    Py_Finalize();

    return 0;
}

Ошибка ответа от терминала ниже

enter image description here

Is это из-за того, что дочерние процессы не меняют каталоги вне своего собственного рабочего пространства?

Также стоит отметить, что если я скомпилирую код C БЕЗ того, чтобы сделать его .so, я смогу отлично загрузить файлы Python и узнаю мое лицо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...