xp_cmdshell(Transact-SQL)

적용 대상:SQL Server

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_

클라이언트에 출력을 반환하지 않음을 지정하는 선택적 매개 변수입니다.

반환 코드 값

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. 자세한 내용은 Surface 영역 구성xp_cmdshell(서버 구성 옵션)를 참조하세요. 사용하면 xp_cmdshell 보안 감사 도구를 트리거할 수 있습니다.

xp_cmdshell 동기적으로 작동합니다. 명령 셸 명령이 완료될 때까지 컨트롤이 호출자에게 반환되지 않습니다. 일괄 처리 내에서 실행되고 오류를 반환하면 xp_cmdshell 일괄 처리가 실패합니다.

xp_cmdshell 프록시 계정

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

를 실행하여 프록시 계정 자격 증명을 sp_xp_cmdshell_proxy_account만들 수 있습니다. 인수로 이 저장 프로시저는 Windows 사용자 이름과 암호를 사용합니다. 예를 들어 다음 명령은 Windows 암호sdfh%dkc93vcMt0가 있는 Windows do기본 사용자 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 하면 CONTROL SERVER를 실행할 수 있는 권한이 필요하며, 만든 xp_cmdshell Windows 프로세스는 SQL Server 서비스 계정과 동일한 보안 컨텍스트를 가집니다. SQL Server 서비스 계정에는 사용자가 만든 xp_cmdshell프로세스에서 수행하는 작업에 필요한 것보다 많은 권한이 있는 경우가 많습니다. 보안을 강화하려면 높은 권한의 사용자로 xp_cmdshell 액세스를 제한해야 합니다.

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

  1. 프로세스에 필요한 최소 권한으로 Windows 로컬 사용자 계정 또는 do기본 계정을 만들고 사용자 지정합니다.

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

    참고 항목

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

  3. Management Studio에서 데이터베이스를 master 사용하여 다음 Transact-SQL 문을 실행하여 특정 비 sysadmin 사용자에게 실행할 xp_cmdshell수 있는 기능을 제공합니다. 지정된 사용자가 데이터베이스에 master 있어야 합니다.

     GRANT exec ON xp_cmdshell TO N'<some_user>';
    

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

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

EXEC xp_cmdshell 'whoami.exe';

다른 로그인에 대한 보안 컨텍스트를 확인하려면 다음 Transact-SQL 코드를 실행합니다.

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

예제

A. 실행 파일 목록 반환

다음 예제에서는 디렉터리 명령을 실행하는 확장 저장 프로시저를 보여줍니다 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_out.txt 파일에 변수의 @var 내용을 씁니다.

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;