Ну... большинство ответов здесь верны, это моя беда, файл "filelist.txt" был сгенерирован из Excel и в Windows. Как только я конвертирую файл в формат unix. все работало.
Я усвоил очень -урок, отнявший много времени. Миллион благодарностей каждому ответившему на вопрос:)
Всем хорошего дня!
Проанализировав поведение клиента 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