我正在尝试在网络服务器中加载.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代码中执行它吗?
答案 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;
}