AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 670505
Accepted
Philipp F
Philipp F
Asked: 2021-09-25 10:01:16 +0800 CST2021-09-25 10:01:16 +0800 CST 2021-09-25 10:01:16 +0800 CST

阻止 Cisco VPN AnyConnect 在 linux 下检测注销

  • 772

Cisco VPN AnyConnect 会自动检测发起 VPN 会话的用户何时注销,然后还会断开 VPN 连接。我想防止这种情况发生。我尝试使用注销后持续存在的屏幕会话,但 VPN 仍然断开连接。

问题是:

  • vpn客户端用来检测注销的可能机制是什么
  • 如何阻止 VPN 客户端断开连接(我无法修改 Cisco 连接配置文件 XML)

我确实有系统的根访问权限。

login vpn
  • 1 1 个回答
  • 240 Views

1 个回答

  • Voted
  1. Best Answer
    Philipp F
    2021-09-27T23:42:36+08:002021-09-27T23:42:36+08:00

    在更深入地分析了 vpn 客户端的行为后,我发现它不查找进程或其父进程,而只是跟踪建立 VPN 连接时的所有登录会话。

    这意味着,如果您在连接 VPN 时打开了 2 个登录会话 A 和 B,并且您关闭了其中任何一个,VPN 将断开连接。

    我的解决方案是在与客户端连接之前从 utmp 中删除会话(utmp 基本上是运行wor时显示的内容)。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

相关问题

  • “sort”和“uniq”对 authorized_keys 文件做了什么坏事?

  • libnss-pgsql2 - getent 组失败

  • 使用 agetty 配置登录提示

  • GNOME3/GDM 第一次登录失败但第二次登录成功

  • Openconnect 在 Arch Linux 中无法连接

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve