Запретить Cisco VPN AnyConnect обнаруживать выход из системы в Linux

Ну... большинство ответов здесь верны, это моя беда, файл "filelist.txt" был сгенерирован из Excel и в Windows. Как только я конвертирую файл в формат unix. все работало.

Я усвоил очень -урок, отнявший много времени. Миллион благодарностей каждому ответившему на вопрос:)

Всем хорошего дня!

6
24.09.2021, 18:01
1 ответ

Проанализировав поведение клиента VPN немного глубже, я обнаружил, что он не ищет процесс или его родительские процессы, а просто отслеживает все сеансы входа в систему во время установления VPN-подключения.

Это означает, что если у вас открыты 2 сеанса входа A и B во время подключения к VPN, и вы закроете любой из них, VPN отключится.

Мое решение состоит в том, чтобы удалить сеанс из utmp. (utmp — это в основном то, что появляется, если вы запускаете wилиwho)до соединения с клиентом. Для этой цели я написал небольшой инструмент под названием utmpremove, исходный код которого указан ниже :

.
#include <string.h>
#include <stdlib.h>
#include <pwd.h>
#include <unistd.h>
#include <utmp.h>
#include <stdio.h>
#include <ctype.h>

int main(int argc, char *argv[])
{
    struct utmp *u; // Used to read existing entries
    struct utmp newent; // Used for new entry (to delete)

    char *my_tty = ttyname(STDIN_FILENO);
    
    printf("Searching utmp for my TTY: %s\n", my_tty);

    setutent();
    
    int found_myself = 0;

    for (;;) {
        u = getutent();

        if(!u) break;
        if(u->ut_type != USER_PROCESS) continue;

        // Get TTY of this utmp entry (taken from source of 'w')
        char tty[5 + UT_LINESIZE + 1] = "/dev/";
        for (int i = 0; i < UT_LINESIZE; i++) {
            /* clean up tty if garbled */
            if (isalnum(u->ut_line[i]) || (u->ut_line[i] == '/'))
                tty[i + 5] = u->ut_line[i];
            else
                tty[i + 5] = '\0';
        }

        // Check if this matches ours
        printf("- utmp tty: %s\n", tty);
        if(strcmp(my_tty, tty) == 0) {
            printf("This is me! Removing...\n");
            found_myself = 1;
            memcpy(newent.ut_id, u->ut_id, sizeof(u->ut_id));
            break;
        }
    }

    // Remove entry if found
    if(found_myself) {
        newent.ut_type = DEAD_PROCESS;
        memset(newent.ut_line, 0, UT_LINESIZE);
        newent.ut_time = 0;
        memset(newent.ut_user, 0, UT_NAMESIZE);

        setutent();
        if(pututline(&newent)) {
            printf("Removed utmp entry successfully.\n");
            endutent();
            exit(EXIT_SUCCESS);
        } else {
            printf("Failed removing utmp entry.\n");
            endutent();
            exit(EXIT_FAILURE);
        }
    } else {
        printf("No matching utmp entry found.\n");
        endutent();
        exit(EXIT_FAILURE);
    }

}

Тогда командная строка будет выглядеть примерно так:

(sudo./utmpremove) && /opt/cisco/anyconnect/bin/vpn -s connect
4
27.09.2021, 07:42

Теги

Похожие вопросы