2015-08-08 201 views
-2

我試圖在Web服務器中加載.php文件時執行shell腳本,我已經一直在努力爭取一段時間,所以我會尋求幫助。使用包裝將shell腳本轉換爲C代碼

我到目前爲止已經試過是使包裝在這篇文章解釋說:Execute root commands via PHP

但我無法真正得到它的工作使得包裝紙執行shell腳本,即使腳本工作當從具有root權限的控制檯執行時。

所以我能找到的唯一的解決辦法是使用「系統(」「)作爲使用系統(」「)

我真的不知道這是否是可能的shell代碼轉換爲C代碼,是什麼shell腳本用於檢查在端口12321中運行的進程的PID,然後將其終止。

單獨運行shell腳本,所以我詢問是否有人知道是否可以轉換爲C,這裏是我想轉換的shell腳本:

#!/bin/sh 

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

這裏是包裝正在使用pper.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

歡迎來到Stack Overflow。請儘快閱讀[關於]頁面。請注意,您的問題可以合法地關閉爲'off-topic',因爲_Questions尋求調試幫助(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及重現它的最短代碼在問題本身。沒有明確問題陳述的問題對其他讀者無用._請參閱如何創建MCVE([如何創建最小,完整和可驗證示例?](http://stackoverflow.com/help/mcve)) 。 –

+2

請注意,由於您的'main()'忽略了它的參數,所以應該將其定義爲'int main(void)'。 'setuid(0);'只會在程序已經以root權限運行的情況下執行任何操作;目前還不清楚是否有必要。你忽略'system()'返回的狀態。你還沒有解釋過,但大概你用'fuser','awk'和'kill'顯示的腳本是你的'/ var/www/html/scrip/debugport/testversion.sh'文件中的腳本?而使用'scrip'而不是'script'是故意的?看起來很奇怪,shebang是'#!/ bin/bash',但你用'/ bin/sh'顯式地運行命令。 –

+0

「作爲執行shell腳本似乎不工作」...不工作如何?你得到什麼錯誤?你真的想要解決什麼問題?你的C代碼不工作? – larsks

回答

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; 
} 
+0

我不能夠感謝你,這很棒,謝謝! PD:偉大的是有人幫助,而不是downvoting ... – JR1

+0

有人知道我怎麼可以將其轉換爲C代碼? 屏幕-S teamspeak -X東西 「停止 」 我想這樣的:系統( 「在/ usr/bin中/屏幕-S teamspeak -X東西」 停止 「」); PD:在停止後有一個ENTER鍵很重要,因此它可以工作。 – JR1