使用包装器将shell脚本转换为C代码

时间:2015-08-08 18:06:27

标签: c shell ubuntu

我正在尝试在网络服务器中加载.php时执行shell脚本,我已经在这方面苦苦挣扎了一段时间,所以我会请求帮助。

到目前为止我尝试过制作一个包装器,如本文所述:Execute root commands via PHP

但我无法真正让它工作使包装器执行shell脚本,即使脚本在从具有root权限的控制台执行时仍然有效。

所以我能找到的唯一解决方案是使用“system(”“)将shell代码转换为C代码,如同使用system(”“)

我真的不知道是否可能,shell脚本用来做的是检查端口12321中运行的进程的PID然后将其终止。

shell脚本单独工作,所以我问是否有人知道是否可以转换为C,这是我要转换的shell脚本:

#!/bin/sh

pid=$(/bin/fuser -n tcp 12321 | /usr/bin/awk '{print $1}');
/bin/kill -9 $pid;

以下是正在使用的wrapper.c,用于执行我的机器中调用的上述代码(testversion.sh),但我不知道为什么,不起作用。

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

    int main (int argc, char *argv[]) {
        setuid (0);
        system ("/bin/bash /var/www/html/scrip/debugport/testversion.sh");
        return 0;
    }

由于这似乎不起作用,有人有办法在C代码中执行它吗?

1 个答案:

答案 0 :(得分:0)

试试这个。除非以root身份运行,否则此代码只能终止同一用户拥有的进程。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>

#define PORT_TO_LOOK_FOR  "12321"
#define DO_NOT_KILL_BELOW  2 /* I am just putting 2 here, you can increase this */

int main(void) {

  FILE *fp;
  char buf[11] = {0};
  pid_t pid;

  /* Open the command for reading. */
  fp = popen("lsof -t -i tcp:" PORT_TO_LOOK_FOR, "r");
  if (fp == NULL) {
    printf("Could not run lsof.\n");
    exit(1);
  }
  else {
    fgets(buf, sizeof(buf)-1, fp);
    pclose(fp);

    pid = (pid_t)atoi(buf);
    if( pid < 1) {
      printf("Either no one is listening on port " 
        PORT_TO_LOOK_FOR " or u don't have the "
        "necessary permission.\n" );
      exit(1);
    }
    else if( pid < DO_NOT_KILL_BELOW ) {
      printf("The PID we got was not safe to kill.\n");
      exit(1);
    }

    if( kill(pid, SIGKILL) != 0 ) {
      perror("kill");
    }
  }

  return 0;
}