C: 如何通过 SSH 杀死另一台机器上的进程?

C: How to kill a process on another machine through SSH?

我正在寻找 运行 在我的机器上用 C 编写的程序,并让它通过 SSH 连接到另一台机器以终止上面的 运行ning 程序。

在我的程序中,我尝试过:

system("ssh username@machine.com && pkill sleep && exit");

这将导致我的终端通过 SSH 连接到远程机器,但到此为止。我也试过:

execl("ssh","ssh","username@machine.com",NULL);
execl("pkill","pkill","sleep",NULL);
execl("exit","exit",NULL);

但它不会杀死我的虚拟 sleep 进程 我有 运行ning.

我似乎无法弄清楚我的流程出了什么问题。

您的第二个示例不会执行您想要的操作,因为它将在本地计算机上执行每个 execl。 IE 会

  • 执行ssh usrname@machine.com
  • 执行pkill
  • 执行exit

但是,实际上,除非你用 fork 包围这些,第一个 execl 如果它在 运行 中成功,将完全取代当前进程,这意味着第二个和第三个永远不会被调用。

那么,让我们找出为什么第一个(更有希望的)示例不起作用。

这应该相当于:

/bin/sh -c 'ssh username@machine.com && pkill sleep && exit'

&& exit 是多余的。并且您希望远程计算机上的 pkill 到 运行。因此你想要的东西:

/bin/sh -c 'ssh username@machine.com pkill sleep'

(注意缺少 &&,所以 pkill 在远程机器上是 运行。

这意味着你想要:

system("ssh username@machine.com pkill sleep");

如果这不起作用,请检查上面以 /bin/sh -c 开头的命令是否有效。例如,ssh 是否要求输入密码?如果是这样,它将不起作用。您将需要使用 public 密钥。

总是可以 运行,通过 ssh,命令:

kill $(pgrep -o -f 'command optional other stuff')

让您的远程进程处理 SIGTERM,它可以在其中进行清理。 (包括杀死它启动的任何进程)

Google 'man pgrep' 查看 -o 和 -f 的作用。 -f 对于正确定位信号很重要。 'pgrep' returns 尾随 \n 的 pid,但在将其传递给 'kill' 之前不需要将其删除。 你的 艾伦