xp_cmdshell(Transact-SQL)

Windows 명령 셸을 생성하고 실행을 위해 문자열로 전달합니다. 모든 출력은 텍스트 행으로 반환됩니다.

항목 링크 아이콘 Transact-SQL 구문 표기 규칙

구문

xp_cmdshell { 'command_string' } [ , no_output ]

인수

  • ' command_string '
    운영 체제로 전달할 명령이 포함된 문자열입니다. command_string은 varchar(8000) 또는 nvarchar(4000)이며 기본값은 없습니다. command_string에는 두 쌍 이상의 큰따옴표가 포함될 수 없습니다. command_string에서 참조하는 프로그램 이름이나 파일 경로에 공백이 있는 경우 한 쌍의 따옴표가 필요합니다. 포함 공백에 문제가 있으면 해결 방법으로 FAT 8.3 파일 이름을 사용하십시오.

  • no_output
    출력이 클라이언트에 반환되지 않도록 지정하는 선택적 매개 변수입니다.

반환 코드 값

0(성공) 또는 1(실패)

결과 집합

다음 xp_cmdshell 문을 실행하면 현재 디렉터리를 나열한 디렉터리를 반환합니다.

EXEC xp_cmdshell 'dir *.exe';
GO

행은 nvarchar(255) 열에서 반환됩니다. no_output 옵션을 사용하면 다음이 반환됩니다.

The command(s) completed successfully.

주의

xp_cmdshell로 생성된 Windows 프로세스는 SQL Server 서비스 계정과 같은 보안 권한을 갖습니다.

xp_cmdshell은 동기식으로 작업합니다. 명령 셸 명령이 완료되기 전에는 호출자에게 컨트롤이 반환되지 않습니다.

xp_cmdshell은 정책 기반 관리를 사용하고 sp_configure를 실행하여 설정하고 해제할 수 있습니다. 자세한 내용은 노출 영역 구성xp_cmdshell 서버 구성 옵션을 참조하십시오.

중요 정보중요

xp_cmdshell을 일괄 처리 내에서 실행하여 오류가 반환되면 일괄 처리가 실패합니다. 이 동작은 기존 버전과 달라진 동작입니다. 이전 버전의 Microsoft SQL Server에서는 일괄 처리가 계속 실행되었습니다.

xp_cmdshell 프록시 계정

sysadmin 고정 서버 역할의 멤버가 아닌 사용자에 의해 호출되는 경우 xp_cmdshell은 **##xp_cmdshell_proxy_account##**라는 자격 증명에 저장된 계정 이름과 암호를 사용하여 Windows에 연결합니다. 프록시 자격 증명이 없으면 xp_cmdshell이 실패합니다.

프록시 계정 자격 증명은 sp_xp_cmdshell_proxy_account를 실행하여 만들 수 있습니다. 이 저장 프로시저는 Windows 사용자 이름과 암호를 인수로 사용합니다. 예를 들어 다음 명령은 Windows 암호가 sdfh%dkc93vcMt0인 Windows 도메인 사용자 SHIPPING\KobeR에 대한 프록시 자격 증명을 만듭니다.

EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR','sdfh%dkc93vcMt0'

자세한 내용은 sp_xp_cmdshell_proxy_account(Transact-SQL)를 참조하세요.

사용 권한

악의적인 사용자가 xp_cmdshell을 사용하여 권한을 승격하려 하는 경우가 있으므로, xp_cmdshell은 기본적으로 사용할 수 없습니다. sp_configure 또는 정책 기반 관리를 사용하여 xp_cmdshell을 사용하도록 설정할 수 있습니다. 자세한 내용은 xp_cmdshell 서버 구성 옵션를 참조하세요.

xp_cmdshell을 처음으로 사용하도록 설정할 때는 실행을 위한 CONTROL SERVER 권한이 필요하며, xp_cmdshell로 만드는 Windows 프로세스는 SQL Server 서비스 계정과 같은 보안 컨텍스트를 포함해야 합니다. SQL Server 서비스 계정에는 xp_cmdshell로 만드는 프로세스를 통해 수행하는 작업에 필요한 것보다 많은 권한이 포함되는 경우가 많습니다. 보안을 강화하려면 높은 권한을 가진 사용자만 xp_cmdshell에 액세스할 수 있도록 제한해야 합니다.

관리자 외의 사용자가 xp_cmdshell을 사용하고 SQL Server에서 권한이 낮은 계정의 보안 토큰을 사용해 자식 프로세스를 만들 수 있도록 허용하려면 다음 단계를 수행합니다.

  1. 프로세스에 필요한 최소한의 권한을 가진 Windows 로컬 사용자 계정 또는 도메인 계정을 만들고 사용자 지정합니다.

  2. sp_xp_cmdshell_proxy_account 시스템 프로시저를 사용하여 이 최소 권한 계정을 사용하도록 xp_cmdshell을 구성합니다.

    [!참고]

    개체 탐색기에서 서버 이름의 속성을 마우스 오른쪽 단추로 클릭하고 보안 탭에서 서버 프록시 계정 섹션을 확인하는 방법으로 SQL Server Management Studio를 사용해 이 프록시 계정을 구성할 수도 있습니다.

  3. Management Studio에서 master 데이터베이스를 사용해 GRANT exec ON xp_cmdshell TO '<somelogin>' 문을 실행하여 sysadmin이 아닌 특정 사용자에게 xp_cmdshell 실행 기능을 제공합니다. 지정된 로그인은 master 데이터베이스에서 사용자에게 매핑해야 합니다.

이제 관리자가 아닌 사용자가 앞서 구성한 프록시 계정의 사용 권한으로 실행하는 프로세스와 xp_cmdshell을 사용하는 운영 체제 프로세스를 시작할 수 있습니다. CONTROL SERVER 권한이 있는 사용자(sysadmin 고정 서버 역할 멤버)는 xp_cmdshell을 통해 시작되는 자식 프로세스에 대해 SQL Server 서비스 계정의 사용 권한을 계속 받게 됩니다.

운영 체제 프로세스를 시작할 때 xp_cmdshell에서 사용하는 Windows 계정을 확인하려면 다음 문을 실행합니다.

xp_cmdshell 'whoami.exe'

다른 로그인의 보안 컨텍스트를 확인하려면 다음을 실행합니다.

EXECUTE AS LOGIN = '<other_login>' ;
GO
xp_cmdshell 'whoami.exe' ;
REVERT ; 

1. 실행 파일의 목록 반환

다음 예에서는 디렉터리 명령을 실행하는 xp_cmdshell 확장 저장 프로시저를 보여 줍니다.

EXEC master..xp_cmdshell 'dir *.exe'

B. 출력 반환 안 함

다음 예에서는 xp_cmdshell을 사용하여 클라이언트에게 출력을 반환하지 않고 명령 문자열을 실행하는 것을 보여 줍니다.

USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
    \\server2\backups\SQLbcks, NO_OUTPUT';
GO

C. 반환 상태 사용

다음 예에서는 xp_cmdshell 확장 저장 프로시저 또한 상태를 반환하도록 제안합니다. 반환 코드 값은 @result 변수에 저장됩니다.

DECLARE @result int
EXEC @result = xp_cmdshell 'dir *.exe'
IF (@result = 0)
   PRINT 'Success'
ELSE
   PRINT 'Failure'

D. 파일에 변수 내용 기록

다음 예에서는 @var 변수의 내용을 현재 서버 디렉터리에 있는 var_out.txt라는 파일에 기록합니다.

DECLARE @cmd sysname, @var sysname
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > var_out.txt'
EXEC master..xp_cmdshell @cmd

E. 명령 결과를 파일로 캡처

다음 예에서는 현재 디렉터리의 내용을 현재 서버 디렉터리에 있는 dir_out.txt라는 파일에 기록합니다.

DECLARE @cmd sysname, @var sysname
SET @var = 'dir/p'
SET @cmd = @var + ' > dir_out.txt'
EXEC master..xp_cmdshell @cmd

참고 항목

참조

일반 확장 저장 프로시저(Transact-SQL)

sp_xp_cmdshell_proxy_account(Transact-SQL)

개념

xp_cmdshell 서버 구성 옵션

노출 영역 구성