Subversion Repositories php-qbpwcf

Rev

Rev 183 | Rev 226 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 183 Rev 218
Line 550... Line 550...
550
	#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
550
	#escapeshellcmd=>http://php.net/manual/en/function.escapeshellcmd.php
551
	#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
551
	#escapeshellarg=>http://php.net/manual/en/function.escapeshellarg.php
552
	#備註:
552
	#備註:
553
	#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
553
	#不是所有指令都能用apache的身份執行,目前已知java,javac指令無法執行,使用root身份可能會被selinux阻擋.
554
	#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
554
	#若使用的 command、argu 參數,含有 ~ 則會被視為字串,若有需要其於 shell 中代表的家目錄位置,可用 fileAccess::tildeToPath 來進行轉換.
555
	#疑似檢查要執行的指令是否存在的shell script會有異常報錯,目前抓不到原因,但不影響執行結果.
-
 
556
	*/
555
	*/
557
	public static function callShell(&$conf){
556
	public static function callShell(&$conf){
558
		
557
		
559
		#初始化要回傳的結果
558
		#初始化要回傳的結果
560
		$result=array();
559
		$result=array();
Line 877... Line 876...
877
		$PATHS=$spiltString["dataArray"];
876
		$PATHS=$spiltString["dataArray"];
878
		
877
		
879
		#預設沒有找到程式
878
		#預設沒有找到程式
880
		$cmdFound=false;
879
		$cmdFound=false;
881
		
880
		
-
 
881
		#如果指令為 "if"
-
 
882
		if($result["cmd"]==="if"){
-
 
883
		
-
 
884
			#則其為 bash 提供的控制敘述,一定存在,不用檢查.
-
 
885
			$cmdFound=true;
-
 
886
		
-
 
887
			}#if end
-
 
888
		
882
		#如果要執行的程式有指定位置
889
		#如果要執行的程式有指定位置
883
		if(strpos($result["cmd"],"/")!==false){
890
		else if(strpos($result["cmd"],"/")!==false){
884
		
891
		
885
			#要運行的指令
892
			#要運行的指令
886
			$cmd="targetToCheck='".$result["cmd"]."';".PHP_EOL."if [ -f \${targetToCheck} ]; then".PHP_EOL."exit;".PHP_EOL."else".PHP_EOL."exit 1;".PHP_EOL."fi";
893
			$cmd="if [ -f ".escapeshellarg($result["cmd"])." ]; then".PHP_EOL."exit;".PHP_EOL."else".PHP_EOL."exit 1;".PHP_EOL."fi";
887
			
894
			
888
			#初始化輸出
895
			#初始化輸出
889
			$output=array();
896
			$output=array();
890
			
897
			
891
			#執行指令
898
			#執行指令
Line 918... Line 925...
918
		
925
		
919
			#針對每個 $PATHS
926
			#針對每個 $PATHS
920
			foreach($PATHS as $path){
927
			foreach($PATHS as $path){
921
			
928
			
922
				#要運行的指令
929
				#要運行的指令
923
				$cmd="targetToCheck='".$path."/".$result["cmd"]."';".PHP_EOL."if [ -f \${targetToCheck} ]; then".PHP_EOL."exit;".PHP_EOL."else".PHP_EOL."exit 1;".PHP_EOL."fi";
930
				$cmd="if [ -f ".escapeshellarg($path."/".$result["cmd"])." ]; then".PHP_EOL."exit;".PHP_EOL."else".PHP_EOL."exit 1;".PHP_EOL."fi";
924
				
931
			
925
				#初始化輸出
932
				#初始化輸出
926
				$output=array();
933
				$output=array();
927
				
934
				
928
				#執行指令
935
				#執行指令
929
				exec($cmd,$output,$status);
936
				exec($cmd,$output,$status);
Line 932... Line 939...
932
				#debug
939
				#debug
933
				$fh=fopen("/tmp/external::callShell.log","a");
940
				$fh=fopen("/tmp/external::callShell.log","a");
934
				fwrite($fh,PHP_EOL."start".PHP_EOL);
941
				fwrite($fh,PHP_EOL."start".PHP_EOL);
935
				fwrite($fh,$result["cmd"].PHP_EOL);
942
				fwrite($fh,$result["cmd"].PHP_EOL);
936
				fwrite($fh,$cmd.PHP_EOL);
943
				fwrite($fh,$cmd.PHP_EOL);
937
				fwrite($fh,print_r($ouput,true).PHP_EOL);
944
				fwrite($fh,print_r($output,true).PHP_EOL);
938
				fwrite($fh,$status.PHP_EOL);
945
				fwrite($fh,$status.PHP_EOL);
939
				fwrite($fh,PHP_EOL."end".PHP_EOL);
946
				fwrite($fh,PHP_EOL."end".PHP_EOL);
940
				fclose($fh);
947
				fclose($fh);
941
				*/
948
				*/
942
			
949
			
-
 
950
				#debug
-
 
951
				#var_dump(__LINE__,$cmd,$output,$status);
-
 
952
			
943
				#如果執行正常
953
				#如果執行正常
944
				if($status===0){
954
				if($status===0){
945
				
955
				
946
					#代表有找到程式
956
					#代表有找到程式
947
					$cmdFound=true;
957
					$cmdFound=true;
Line 2984... Line 2994...
2984
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2994
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2985
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("enablePrintDescription","printDescription","argu","escapeshellarg","username","password","useScript","logFilePath","inBackGround","sameShell");
2995
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("enablePrintDescription","printDescription","argu","escapeshellarg","username","password","useScript","logFilePath","inBackGround","sameShell");
2986
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
2996
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double"); 
2987
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","array","array","array","array","array","string","string","string","string");
2997
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("array","array","array","array","array","array","string","string","string","string");
2988
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,"null"代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2998
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,"null"代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2989
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,null,null,null,null,null,null,null,null,"false");
2999
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,null,null,array(),null,null,null,null,null,"false");
2990
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
3000
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2991
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
3001
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
2992
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3002
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2993
		unset($conf["variableCheck::checkArguments"]);
3003
		unset($conf["variableCheck::checkArguments"]);
2994
		
3004
		
Line 3016... Line 3026...
3016
			$result["error"]=$checkResult;
3026
			$result["error"]=$checkResult;
3017
			
3027
			
3018
			#回傳結果
3028
			#回傳結果
3019
			return $result;
3029
			return $result;
3020
			
3030
			
3021
			}#if end			
3031
			}#if end
3022
				
3032
				
3023
		#有幾個 $conf["command"] 就執行幾次
3033
		#有幾個 $conf["command"] 就執行幾次
3024
		for($i=0;$i<count($conf["command"]);$i++){
3034
		for($i=0;$i<count($conf["command"]);$i++){
3025
			
3035
			
3026
			#如果 $conf["argu"] 存在
3036
			#如果 $conf["argu"] 存在
Line 3116... Line 3126...
3116
					#設置 $conf["external::callShell"]["username"] 參數為 $conf["username"] 的第一個元素
3126
					#設置 $conf["external::callShell"]["username"] 參數為 $conf["username"] 的第一個元素
3117
					$conf["external::callShell"]["username"]=$conf["username"][0];
3127
					$conf["external::callShell"]["username"]=$conf["username"][0];
3118
					
3128
					
3119
					}#if end
3129
					}#if end
3120
				
3130
				
3121
				}#if end	
3131
				}#if end
3122
			
3132
			
3123
			#如果 $conf["password"] 存在
3133
			#如果 $conf["password"] 存在
3124
			if(isset($conf["password"])){
3134
			if(isset($conf["password"])){
3125
				
3135
				
3126
				#如果 $conf["password"] 為 array 型態,且其元素數量等於 $conf["command"] 的元素數量
3136
				#如果 $conf["password"] 為 array 型態,且其元素數量等於 $conf["command"] 的元素數量
Line 3137... Line 3147...
3137
					#設置 $conf["external::callShell"]["password"] 參數為 $conf["password"] 的第一個元素
3147
					#設置 $conf["external::callShell"]["password"] 參數為 $conf["password"] 的第一個元素
3138
					$conf["external::callShell"]["password"]=$conf["password"][0];
3148
					$conf["external::callShell"]["password"]=$conf["password"][0];
3139
					
3149
					
3140
					}#if end
3150
					}#if end
3141
				
3151
				
3142
				}#if end	
3152
				}#if end
3143
				
3153
				
3144
			#如果有設置 $conf["logFilePath"]
3154
			#如果有設置 $conf["logFilePath"]
3145
			if(isset($conf["logFilePath"])){
3155
			if(isset($conf["logFilePath"])){
3146
				
3156
				
3147
				#設置 $conf["logFilePath"] 參數
3157
				#設置 $conf["logFilePath"] 參數
3148
				$conf["external::callShell"]["logFilePath"]=$conf["logFilePath"];
3158
				$conf["external::callShell"]["logFilePath"]=$conf["logFilePath"];
3149
				
3159
				
3150
				}#if end	
3160
				}#if end
3151
				
3161
				
3152
			#如果有設置 $conf["fileArgu"]
3162
			#如果有設置 $conf["fileArgu"]
3153
			if(isset($conf["fileArgu"])){
3163
			if(isset($conf["fileArgu"])){
3154
				
3164
				
3155
				#設置 $conf["fileArgu"] 參數
3165
				#設置 $conf["fileArgu"] 參數
3156
				$conf["external::callShell"]["fileArgu"]=$conf["fileArgu"];
3166
				$conf["external::callShell"]["fileArgu"]=$conf["fileArgu"];
3157
				
3167
				
3158
				}#if end
3168
				}#if end
3159
								
3169
				
3160
			#如果有設置 $conf["inBackGround"]
3170
			#如果有設置 $conf["inBackGround"]
3161
			if(isset($conf["inBackGround"])){
3171
			if(isset($conf["inBackGround"])){
3162
				
3172
				
3163
				#設置 $conf["fileArgu"] 參數
3173
				#設置 $conf["fileArgu"] 參數
3164
				$conf["external::callShell"]["inBackGround"]=$conf["inBackGround"];
3174
				$conf["external::callShell"]["inBackGround"]=$conf["inBackGround"];
Line 3171... Line 3181...
3171
				#設置不執行指令
3181
				#設置不執行指令
3172
				$conf["external::callShell"]["doNotRun"]="true";
3182
				$conf["external::callShell"]["doNotRun"]="true";
3173
			
3183
			
3174
				}#if end
3184
				}#if end
3175
			
3185
			
-
 
3186
			#如果沒有指定是否要 escapeshellarg
-
 
3187
			if(!isset($conf["escapeshellarg"][$i])){
-
 
3188
			
-
 
3189
				#設置為 "false"
-
 
3190
				$conf["escapeshellarg"][$i]="false";
-
 
3191
			
-
 
3192
				}#if end
-
 
3193
			
3176
			#函式說明:
3194
			#函式說明:
3177
			#呼叫shell執行系統命令,並取得回傳的內容.
3195
			#呼叫shell執行系統命令,並取得回傳的內容.
3178
			#回傳結果:
3196
			#回傳結果:
3179
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3197
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3180
			#$result["error"],錯誤訊息陣列.
3198
			#$result["error"],錯誤訊息陣列.
Line 3190... Line 3208...
3190
			#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
3208
			#$conf["enablePrintDescription"],字串,是否要印出$conf["printDescription"]的內容,"true"代表要,"false"代表不要,預設為"false".
3191
			#$conf["enablePrintDescription"]="true";
3209
			#$conf["enablePrintDescription"]="true";
3192
			#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容.
3210
			#$conf["printDescription"],字串,執行該外部程式前要印出來的的文字,預設為$conf["command"]的內容.
3193
			#$conf["printDescription"]="";
3211
			#$conf["printDescription"]="";
3194
			#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".
3212
			#$conf["escapeshellarg"],字串,是否要啟用過濾參數,用了比較安全,但可能會出錯,"true"為啟用,"false"為不啟用,預設為"false".
3195
			#$conf["escapeshellarg"]="false";
3213
			$conf["external::callShell"]["escapeshellarg"]=$conf["escapeshellarg"][$i];
3196
			#$conf["username"],字串,要用什麼使用者來執行,預設為執行apache的使用者,該參數不適用於apache環境.
3214
			#$conf["username"],字串,要用什麼使用者來執行,預設為執行apache的使用者,該參數不適用於apache環境.
3197
			#$conf["username"]="";
3215
			#$conf["username"]="";
3198
			#$conf["password"],字串,與$conf["username"]搭配的使用者密碼,預設不使用密碼,該參數不適用於apache環境.
3216
			#$conf["password"],字串,與$conf["username"]搭配的使用者密碼,預設不使用密碼,該參數不適用於apache環境.
3199
			#$conf["password"]="";
3217
			#$conf["password"]="";
3200
			#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要;"false"代表不要,預設為"false".
3218
			#$conf["useScript"],字串,是否要啟用Linux的script指令來記錄輸出,"true"代表要;"false"代表不要,預設為"false".