xp_cmdshell (MS SQL Server 2005)

 | SQL
2009. 8. 12. 06:18

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)를 참조하십시오.

사용 권한

CONTROL SERVER 권한이 필요합니다.

1. 실행 파일의 목록 반환

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

EXEC master..xp_cmdshell 'dir *.exe'

2. Windows net 명령 사용

다음 예에서는 저장 프로시저에서 xp_cmdshell을 사용하는 것을 보여 줍니다. 이 예에서는 net send를 사용하여 SQL Server 인스턴스가 종료될 것을 사용자에게 알리고 net pause를 사용하여 서버를 일시 중지한 다음 net stop을 사용하여 서버를 종료합니다.

CREATE PROC shutdown10
AS
    EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server 
        shutting down in 10 minutes. No more connections 
        allowed.', no_output
    EXEC xp_cmdshell 'net pause sqlserver'
    WAITFOR DELAY '00:05:00'
    EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server 
        shutting down in 5 minutes.', no_output
    WAITFOR DELAY '00:04:00'
    EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server 
        shutting down in 1 minute. Log off now.', no_output
    WAITFOR DELAY '00:01:00'
    EXEC xp_cmdshell 'net stop sqlserver', no_output

3. 출력 반환 안 함

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

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

4. 반환 상태 사용

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

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

5. 파일에 변수 내용 기록

다음 예에서는 @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

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

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

DECLARE @cmd sysname, @var sysname
SET @var = 'dir/p'
SET @cmd = @var + ' > dir_out.txt'
EXEC master..xp_cmdshell @cmd
Posted by ProjectGhost
BLOG main image
by ProjectGhost

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

Total :
Today : Yesterday :