【问题标题】:Use C to exit ssh session to linux使用 C 退出 ssh 会话到 linux
【发布时间】:2016-06-24 04:12:58
【问题描述】:

我正在运行一个通过 ssh 会话运行的程序。这意味着我使用 putty 连接到 linux,程序启动,使用 /etc/bash.bashrc 文件。在某些时候,程序假设结束并随之结束通过 putty 的 ssh 会话应该断开连接。 到目前为止,我用下面的代码做了什么,但它不起作用:程序退出,并停留在 linux shell 中,这意味着腻子已连接。我期望的是命令“退出”来结束腻子 ssh 会话.

 char file_name[20];
 pid_t pid = fork();
        if (pid == 0)
        {
            printf("Starting vi\r\n");
            char external_cmd[200] = "vi ";
            strcat(external_cmd, file_name);
            system(external_cmd);
        } else 
        {
            waitpid(pid,0,0);
            printf("Exit..\r\n");
            system("exit");

        }

感谢您的帮助。

【问题讨论】:

  • “它不起作用”从来都不是一个充分的问题描述。请描述确切的预期行为和观察到的实际行为。
  • 还不清楚。 “留在 Linux shell 中”是什么意思?远程外壳?本地外壳?最好能显示日志。 system 开始一个新进程。所以使用它来运行exit 不会导致当前进程退出。但是,当代码完成运行时,进程应该退出。您没有提供完整的示例,因此不清楚在显示的代码之后会发生什么(如果有的话)(它会在那里结束吗?)。
  • 好的,再次编辑,希望更清楚

标签: c linux ssh


【解决方案1】:

最简单的解决方案是使用exec 启动您的C 程序,以便它替换shell。 SSH 会话会在程序退出时自然结束。

$ exec your_program 

【讨论】:

  • 如果这对您有用,请将其标记为正确答案。
  • 它有效,但不是 100% 我需要的。我需要一种通过 C 程序停止 ssh 会话的方法。我不希望 ssh 会话在程序结束时在所有情况下都停止。在某些情况下,我希望 ssh 会话在 C 程序结束后继续。所以从我的角度来看,答案是不正确的
【解决方案2】:

这段代码没有完成任何事情:

system("exit");

system()runs a child process under sh:

system() 函数的行为就像子进程一样 使用fork() 创建,子进程调用sh 实用程序 使用execl()如下:

execl(<shell path>, "sh", "-c", command, (char *)0);

因此,您对 system() 的调用会启动一个 sh 进程,然后该进程会执行您传递给它的 exit 命令 - 子进程退出,对父进程没有任何作用。

不过,您可以通过使用 getppid() 获取父进程的 PID,然后调用 kill() 来杀死它来杀死父 shell:

#include <unistd.h>
#include <signal.h>
...
pid_t parent = getppid();
kill( parent, SIGKILL );

SIGKILL 可能有点极端——它会立即杀死一个进程,进程没有机会自行清理,但它工作(除非你运行的是非在这种情况下,root setuid 子进程 - 如果您不知道那是什么,请不要担心。)。 SIGTERM 是一个不太极端的信号,但由于它可以被捕获或阻止,因此不能保证结束进程。 SIGINT 等价于CTRL-C 并且也可以工作,但是该进程可以再次捕获或忽略信号。 SIGQUIT 也可以使用,但其目的是让进程退出并转储您可能不想要的核心文件。

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多