본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP 백틱 — 셸 명령 실행 완전 정리

by 왕진 2026. 6. 26.
반응형

 

 

Web Development · PHP

PHP 백틱 —
` 셸 명령 실행

PHP 안에서 운영체제 명령을 실행하고 결과 받기
시작 오늘 분석할 코드

리눅스/Mac의 ls -laF현재 디렉토리 파일 목록을 가져와 화면에 출력한다. PHP는 백틱(`)으로 셸을 직접 실행할 수 있다.

<?php $filelist = `ls -laF`; // $filelist = `dir`; // Windows의 경우 print "<PRE>"; print $filelist; print "</PRE>"; ?>
가능한 출력 예 (실제로는 시스템마다 다름)
total 24 drwxr-xr-x 3 user staff 96 Apr 30 12:00 ./ drwxr-xr-x 8 user staff 256 Apr 30 11:50 ../ -rw-r--r-- 1 user staff 300 Apr 30 12:00 operators8.php* -rw-r--r-- 1 user staff 150 Apr 30 11:55 index.html drwxr-xr-x 2 user staff 64 Apr 30 11:30 images/

용어 핵심 키워드
` ` (백틱)감싼 문자열을 셸 명령으로 실행
shell_exec()백틱과 동일 기능 — 명시적 함수
exec()실행 + 종료코드 받기
system()실행 + 직접 출력
<PRE>고정폭 폰트 + 공백/줄바꿈 보존
보안 위험⚠ 사용자 입력으로 셸 실행은 절대 X

1 백틱이란?

백틱(`)은 키보드의 ESC 옆 키 (~ 와 같이 있음). 이 기호 두 개로 감싼 문자열을 PHP는 셸 명령으로 실행하고 그 결과 문자열을 반환한다.

// 두 코드는 같은 결과 $result = `ls -la`; $result = shell_exec("ls -la");

2 셸 명령은 OS마다 다르다
  • Linux/Mac: ls -laF, pwd, whoami
  • Windows: dir, cd, echo

본 코드의 ls는 Linux/Mac용. Windows 서버라면 dir로 바꿔야 한다.


3 <PRE> 태그가 필요한 이유

ls의 출력에는 여러 공백과 줄바꿈이 있다. 일반 HTML은 공백을 합치고 \n을 무시한다. <pre> 태그로 감싸면 공백/줄바꿈 그대로 보존된다.

  • 고정폭 폰트로 표시 — 줄이 정렬돼 보임
  • 여러 공백을 그대로 유지 — 표 정렬 깨지지 않음
  • 줄바꿈(\n)이 화면에서도 줄바꿈으로 보임

 

반응형

 

4 보안 — 절대 사용자 입력을 그대로 X
최악의 보안 취약점 — 사용자 입력을 검증 없이 백틱에 넣으면 임의 코드 실행 (RCE) 공격에 노출된다.
// ❌ 절대 하지 말 것 $file = $_GET['name']; $out = `cat $file`; // 사용자가 ?name=foo;rm -rf / 보내면 → 서버 파일 삭제 // ✅ 입력 검증 필수 $file = basename($_GET['name']); if (!preg_match('/^[a-z0-9_.-]+$/', $file)) { die("Invalid filename"); } $out = `cat /var/data/$file`;

5 4가지 셸 실행 함수
// 1) 백틱 — 결과만 받음 $out = `ls`; // 2) shell_exec — 백틱과 동일 (명시적) $out = shell_exec("ls"); // 3) exec — 결과를 배열로 + 종료코드 exec("ls", $lines, $code); // 4) system — 결과를 직접 출력 system("ls"); // print 없이도 화면에 나옴

6 자주 하는 실수 / 주의
  • php.ini의 disable_functions — 보안상 백틱과 shell_exec이 비활성화된 호스팅이 많음
  • safe_mode (PHP 5.3까지) — 같은 이유로 차단
  • 웹 서버 사용자 권한 — Apache의 사용자(보통 www-data)로만 실행 가능
  • 경로 명시/usr/bin/ls처럼 절대 경로가 안전
  • OS 의존 코드는 이식성 ↓

7 더 안전한 대안

대부분의 경우 PHP 자체 함수로 같은 일을 할 수 있다.

// ❌ 셸 ls $files = `ls /home/user`; // ✅ PHP 함수 — OS 독립, 안전 $files = scandir("/home/user"); // 또는 glob, FilesystemIterator 등

핵심 한 줄 요약

` ` (백틱)셸 명령 실행 + 결과 반환
shell_exec()동일 기능 — 명시적
<pre>셸 출력 정렬 보존
OS 의존ls(Linux) vs dir(Win)
보안 위험사용자 입력 절대 X
안전한 대안scandir / glob / 자체 PHP 함수
호스팅 차단disable_functions로 막힘 흔함

Tags

#PHP #백틱 #shell-exec #셸명령 #보안위험 #scandir #glob #disable_functions #시스템호출 #백엔드 #CSS #HTML #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, 백틱, shell-exec, 셸명령, 보안위험, scandir, glob, disable_functions, 시스템호출, 백엔드, CSS, HTML, 웹개발, 티스토리
반응형

댓글