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' 之前不需要将其删除。
你的
艾伦
我正在寻找 运行 在我的机器上用 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' 之前不需要将其删除。 你的 艾伦