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

时间:2015-03-16 00:02:50

标签: c ssh

我希望在我的机器上运行C编写的程序,并将其连接到另一台机器上,以杀死在其上运行的程序。

在我的计划中,我尝试过:

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进程。

我似乎无法弄清楚我的过程有什么问题。

2 个答案:

答案 0 :(得分:4)

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

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

但实际上,除非你用fork围绕这些,否则第一个execl如果成功运行将取代当前进程,这意味着第二个和第三个永远不会被调用。 / p>

所以,让我们弄清楚为什么第一个(更有希望的)例子不起作用。

这应该相当于:

/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是否要求输入密码?如果是这样,它就不会起作用。您需要使用公钥。

答案 1 :(得分:0)

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

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

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

谷歌'man pgrep'看看-o和-f做了什么。 -f对于正确定位信号很重要。 'pgrep'返回带尾随\ n的pid但是在将它传递给'kill'之前不需要将其删除。 你的 艾伦