찾다
백엔드 개발PHP 튜토리얼Linux에서 PHP로 외부 명령을 실행하는 방법

이 글은 주로 Linux에서 PHP가 외부 명령을 실행하는 방법을 소개합니다. 관심 있는 친구들이 참고하면 도움이 될 것입니다.

디렉토리:

1. PHP에서 외부 명령 호출 소개
2. 보안 문제
3. 시간 초과 문제
4. PHP가 Linux 환경에서 명령을 실행할 때 발생하는 문제

1, PHP에서 외부 명령 호출 소개

PHP에서 외부 명령을 호출하려면 1> 특수 함수 호출, 2> 백틱, 3>popen() 함수를 사용하여 프로세스를 엽니다. 달성 방법:

방법 1: PHP에서 제공하는 특수 함수 사용(4개):

PHP는 외부 명령 실행을 위한 4가지 특수 함수를 제공합니다: exec(), system(), passthru(), shell_exec( )

1) exec()

Prototype: string exec ( string $command [, array &$output [, int &$return_var ] )

설명: exec는 시스템 실행 시 결과를 출력하지 않습니다. 외부 명령이지만 결과의 마지막 행을 반환합니다. 결과를 얻으려면 두 번째 매개변수를 사용하여 지정된 배열로 출력하면 됩니다. 이 배열의 한 레코드는 출력 행을 나타냅니다. 즉, 출력 결과가 20줄이면 이 배열에는 20개의 레코드가 있게 됩니다. 따라서 다른 시스템 외부 명령을 호출한 결과를 반복적으로 출력해야 하는 경우 출력 시 배열 unset($output)을 지우는 것이 가장 좋습니다. 혼동을 방지하기 위해 각 시스템 외부 명령의 결과를 확인합니다. 세 번째 매개변수는 명령 실행 상태 코드를 가져오는 데 사용됩니다. 일반적으로 실행이 성공하면 0이 반환됩니다.

<?php
  exec("dir",$output);
  print_r($output);
?>

2) system()

Prototype: string system ( string $command [, int &$return_var ] )

설명: system과 exec의 차이점은 시스템이 외부에 있다는 것입니다. 실행 시스템 명령을 내리면 주어진 명령을 실행하고 그 결과를 출력하고 반환한다. 두 번째 매개변수는 선택사항이며 명령이 실행된 후 상태 코드를 가져오는 데 사용됩니다.

<?php
system("pwd",$result);
print $result;//输出命令的结果状态码
?>

두 번째 매개변수 결과 상태 코드에 대한 간략한 소개:

0이 반환되면 작업이 성공한 것이고,

Bash에서는 치명적인 신호에 오류가 발생하면 bash는 128을 반환합니다. +신호 번호를 반환 값으로 사용합니다.

명령어를 찾을 수 없으면 127이 반환됩니다.

명령을 찾았지만 명령을 실행할 수 없는 경우 126이 반환됩니다.

또한 Bash 자체는 마지막 명령의 반환 값을 반환합니다.

실행 중 오류가 발생하면 0이 아닌 값이 반환됩니다.

치명적 신호 : 128 + signo
명령을 찾을 수 없음 : 127
실행할 수 없음 : 126
쉘 스크립트가 성공적으로 실행됨 : 마지막 명령 종료 상태를 반환
실행 중 치명적 : 0이 아닌 값을 반환

3) passthru()

Prototype: void passthru ( string $command [, int &$return_var ] )

설명: passthru와 시스템의 차이점, passthru는 어떤 값도 반환하지 않고 결과를 브라우저에 직접 출력합니다. , 이미지 데이터와 같은 이진 데이터를 출력할 수 있습니다. 두 번째 매개변수는 선택사항이며 상태 코드입니다.

<?php
header("Content-type:image/gif");
passthru("/usr/bin/ppm2tiff /usr/share/tk8.4/demos/images/teapot.ppm");
?>

4) shell_exec()

프로토타입: string shell_exec ( string $cmd )

설명: $cmd

<?php
$output = shell_exec(&#39;ls -lart&#39;);
echo "<pre class="brush:php;toolbar:false">$output
"; ?>

명령을 직접 실행하세요. 방법 2: 역방향 skimming No.

프로토타입: 시스템 외부 명령을 실행하기 위한 백틱 `(같은 키에 ~ 사용)

설명: 이 방법을 사용하여 시스템 외부 명령을 실행하는 경우 shell_exec 기능을 사용할 수 있는지 확인하고, 그렇지 않으면 이 방법을 사용하세요. 백틱은 시스템 외부 명령을 실행하는 데 사용할 수 없습니다.

<?php
  echo `dir`;
?>

방법 3: popen() 함수를 사용하여 프로세스

프로토타입: 리소스 popen( 문자열 $command , 문자열 $mode )

설명: 명령과 상호 작용할 수 있습니다. 이전에 소개한 방법은 단순히 명령을 실행할 수만 있을 뿐 명령과 상호 작용할 수는 없습니다. 예를 들어, 시스템 사용자를 추가할 때 su를 호출하여 현재 사용자를 루트 사용자로 변경해야 하는 경우가 있습니다. su 명령은 명령줄에 루트 암호를 입력해야 합니다. 이 경우 앞에서 언급한 방법을 사용하는 것은 당연히 불가능합니다.

popen() 함수는 프로세스 파이프를 열어 주어진 명령을 실행하고 읽고 쓸 수 있는 파일 핸들을 반환합니다. 반환 값은 파일 포인터를 반환하는 fopen() 함수와 동일합니다. 열기(읽기 또는 쓰기)에 단일 모드를 사용하지 않는 한 pclose() 함수를 사용하여 닫아야 합니다. 이 포인터는 fgets(), fgetss(), fwrite()에 의해 호출될 수 있습니다. 오류가 발생하면 FALSE를 반환합니다.

<?php
error_reporting(E_ALL);
 
/* Add redirection so we can get stderr. */
$handle = popen(&#39;/path/to/executable 2>&1&#39;, &#39;r&#39;);
echo "&#39;$handle&#39;; " . gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);
?>

2. 보안 관련 사항:

WEB 프로그램 개발에는 기본적으로 PHP가 사용되기 때문에 보안은 사람들이 중요하게 생각하는 부분이 되었습니다.

그래서 PHP 설계자는 PHP에 안전 모드라는 문을 추가했습니다.

php.ini에서 safe_mode = On으로 설정

如果运行在安全模式下,那么PHP脚本中将受到如下四个方面的限制:

执行外部命令
在打开文件时有些限制
连接MySQL数据库
基于HTTP的认证

在安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在php.ini文件中用safe_mode_exec_dir指令,或在编译PHP 是加上–with-exec-dir选项来指定,默认是/usr/local/php/bin。

当你使用这些函数来执行系统命令时,可以使用escapeshellcmd()和escapeshellarg()函数阻止用户恶意在系统上执行命令,escapeshellcmd()针对的是执行的系统命令,而escapeshellarg()针对的是执行系统命令的参数。这两个参数有点类似addslashes()的功能。

三、关于超时问题

当执行命令的返回结果非常庞大时,可以需要考虑将返回结果输出至其他文件,再另行读取文件,这样可以显著提高程序执行的效率。

如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是在等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是把命令的输出重定向到另外一个文件或流中,如:

<?php
system("/usr/local/bin/order_proc > /tmp/abc ");
?>

但我调用的DOS命令需要几分钟的时间,而且为了批处理不能简单的把结果写入文件了事,要顺序执行以下的程序

PHP设置了调用系统命令的时间限制,如果调用命令超时,虽然这个命令还是会被执行完,但PHP没有得到返回值,被终止了(最可恨的是,不显示任何错误)

修改php.ini并重启Apache以允许系统命令运行更长的时间

max_execution_time = 600

四、关于PHP运行linux环境中命令出现的问题

php一般是以apache用户身份去执行的,也可能是www用户,把apache加入到存储你文件的父文件夹属组里去,然后改该父文件夹权限为775,这样属组成员就有写的权限,而apache属于这个组就可以改写该目录下所有文件的权限。

例如:chown www:www dirName

这样dirName目录才能被php所控制

注意:改apache/php的运行用户方法不安全

另外即使文件或目录已经是www,php的安全设置也都照顾到,一些自己安装linux的命令仍然可能无法运行,例如我曾经安装的ffmpeg软件,原因就是linux的运行权限问题,即使ffmpeg有www权限设置,但由于ffmpeg所依赖的库文件是不允许www用户运行,所以php运行此程序仍然会报127或126错误,通过 ldd 命令可以查看ffmpeg命令依赖的库情况。

这个时候就必须对ffmpeg的依赖库经行设置。具体方法属于linux管理中的话题,这里不就讨论了。

以上就是本文的全部内容,希望对大家的学习有所帮助。


相关推荐:

linux后台运行node服务指令步骤方法

Linux中正则表达式使用详解

php获取linux命令结果的方法

위 내용은 Linux에서 PHP로 외부 명령을 실행하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오Apr 13, 2025 am 12:20 AM

PHP는 현대 웹 개발, 특히 컨텐츠 관리 및 전자 상거래 플랫폼에서 중요합니다. 1) PHP는 Laravel 및 Symfony와 같은 풍부한 생태계와 강력한 프레임 워크 지원을 가지고 있습니다. 2) Opcache 및 Nginx를 통해 성능 최적화를 달성 할 수 있습니다. 3) PHP8.0은 성능을 향상시키기 위해 JIT 컴파일러를 소개합니다. 4) 클라우드 네이티브 애플리케이션은 Docker 및 Kubernetes를 통해 배포되어 유연성과 확장 성을 향상시킵니다.

PHP 대 기타 언어 : 비교PHP 대 기타 언어 : 비교Apr 13, 2025 am 12:19 AM

PHP는 특히 빠른 개발 및 동적 컨텐츠를 처리하는 데 웹 개발에 적합하지만 데이터 과학 및 엔터프라이즈 수준의 애플리케이션에는 적합하지 않습니다. Python과 비교할 때 PHP는 웹 개발에 더 많은 장점이 있지만 데이터 과학 분야에서는 Python만큼 좋지 않습니다. Java와 비교할 때 PHP는 엔터프라이즈 레벨 애플리케이션에서 더 나빠지지만 웹 개발에서는 더 유연합니다. JavaScript와 비교할 때 PHP는 백엔드 개발에서 더 간결하지만 프론트 엔드 개발에서는 JavaScript만큼 좋지 않습니다.

PHP vs. Python : 핵심 기능 및 기능PHP vs. Python : 핵심 기능 및 기능Apr 13, 2025 am 12:16 AM

PHP와 Python은 각각 고유 한 장점이 있으며 다양한 시나리오에 적합합니다. 1.PHP는 웹 개발에 적합하며 내장 웹 서버 및 풍부한 기능 라이브러리를 제공합니다. 2. Python은 간결한 구문과 강력한 표준 라이브러리가있는 데이터 과학 및 기계 학습에 적합합니다. 선택할 때 프로젝트 요구 사항에 따라 결정해야합니다.

PHP : 웹 개발의 핵심 언어PHP : 웹 개발의 핵심 언어Apr 13, 2025 am 12:08 AM

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 ​​있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP : 많은 웹 사이트의 기초PHP : 많은 웹 사이트의 기초Apr 13, 2025 am 12:07 AM

PHP가 많은 웹 사이트에서 선호되는 기술 스택 인 이유에는 사용 편의성, 강력한 커뮤니티 지원 및 광범위한 사용이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 거대한 개발자 커뮤니티와 풍부한 자원이 있습니다. 3) WordPress, Drupal 및 기타 플랫폼에서 널리 사용됩니다. 4) 웹 서버와 밀접하게 통합하여 개발 배포를 단순화합니다.

과대 광고 : 오늘 PHP의 역할을 평가합니다과대 광고 : 오늘 PHP의 역할을 평가합니다Apr 12, 2025 am 12:17 AM

PHP는 현대적인 프로그래밍, 특히 웹 개발 분야에서 강력하고 널리 사용되는 도구로 남아 있습니다. 1) PHP는 사용하기 쉽고 데이터베이스와 완벽하게 통합되며 많은 개발자에게 가장 먼저 선택됩니다. 2) 동적 컨텐츠 생성 및 객체 지향 프로그래밍을 지원하여 웹 사이트를 신속하게 작성하고 유지 관리하는 데 적합합니다. 3) 데이터베이스 쿼리를 캐싱하고 최적화함으로써 PHP의 성능을 향상시킬 수 있으며, 광범위한 커뮤니티와 풍부한 생태계는 오늘날의 기술 스택에 여전히 중요합니다.

PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?Apr 12, 2025 am 12:13 AM

PHP에서는 약한 참조가 약한 회의 클래스를 통해 구현되며 쓰레기 수집가가 물체를 되 찾는 것을 방해하지 않습니다. 약한 참조는 캐싱 시스템 및 이벤트 리스너와 같은 시나리오에 적합합니다. 물체의 생존을 보장 할 수 없으며 쓰레기 수집이 지연 될 수 있음에 주목해야합니다.

PHP의 __invoke 마법 방법을 설명하십시오.PHP의 __invoke 마법 방법을 설명하십시오.Apr 12, 2025 am 12:07 AM

\ _ \ _ 호출 메소드를 사용하면 객체를 함수처럼 호출 할 수 있습니다. 1. 객체를 호출 할 수 있도록 메소드를 호출하는 \ _ \ _ 정의하십시오. 2. $ obj (...) 구문을 사용할 때 PHP는 \ _ \ _ invoke 메소드를 실행합니다. 3. 로깅 및 계산기, 코드 유연성 및 가독성 향상과 같은 시나리오에 적합합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.