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

xp_cmdshell (MS SQL Server 2000)

 | SQL
2009. 8. 3. 09:17

xp_cmdshell

지정한 명령 문자열을 운영 체제 명령 셸로 실행하며 모든 출력을 텍스트의 행으로 반환합니다. 관리자가 아닌 사용자에게 xp_cmdshell을 실행할 수 있는 사용 권한을 부여합니다.

 

참고   Microsoft® Windows® 95 또는 Microsoft Windows 98 운영 체제에서 xp_cmdshell을 실행하는 경우, xp_cmdshell의 반환 코드는 호출된 실행 파일의 종료 코드를 처리하도록 설정되지 않습니다. 반환 코드는 항상 0이 됩니다.

구문

xp_cmdshell {'command_string'} [, no_output]

인수

'command_string'

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

no_output

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

반환 코드 값

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

결과 집합

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

xp_cmdshell 'dir *.exe'

행은 nvarchar(255) 열에서 반환됩니다.

xp_cmdshell 문을 실행하면 다음과 같은 결과 집합이 반환됩니다.

xp_cmdshell 'dir *.exe', NO_OUTPUT

결과는 다음과 같습니다.

명령이 성공적으로 완료되었습니다.
비고

xp_cmdshell은 동기식으로 작업합니다. 명령 셸 명령이 완료될때까지는 제어가 반환되지 않습니다.

사용자에게 실행 권한을 부여하는 경우, 사용자는 Microsoft SQL Server™를 실행하는 계정이 실행에 필요한 특권을 가진 Microsoft Windows NT® 명령 셸에서 모든 운영 체제 명령을 실행할 수 있습니다.

기본적으로 sysadmin 고정 서버 역할의 구성원만이 이 확장 저장 프로시저를 실행할 수 있습니다. 그러나 다른 사용자에게 이 저장 프로시저를 실행할 권한을 부여할 수 있습니다.

sysadmin 고정 서버 역할의 구성원인 사용자가 xp_cmdshell을 호출하면 xp_cmdshell이 SQL Server 서비스가 실행 중인 보안 컨텍스트에서 실행됩니다. 사용자가 sysadmin 그룹의 구성원이 아니면 xp_cmdshell이 SQL Server 에이전트 프록시 계정을 가장하는데 이 계정은 xp_sqlagent_proxy_account를 사용하여 지정합니다. 프록시 계정을 사용할 수 없으면 xp_cmdshell이 실패합니다. 이는 Microsoft® Windows NT® 4.0 및 Windows 2000에 대해서만 적용됩니다. Windows 9.x에서는 xp_cmdshell이 가장하지 않으며 항상 SQL Server를 시작한 Windows 9.x 사용자의 보안 컨텍스트에서 실행됩니다.


참고   이전 버전에서는 xp_cmdshell에 대한 실행 권한을 부여 받은 사용자가 MSSQLServer 서비스의 사용자 계정 컨텍스트에서 명령을 실행하였습니다. SQL Server에 대해 sa 액세스가 없는 사용자가 SQLExecutiveCmdExec Windows NT 계정의 컨텍스트에서 xp_cmdshell을 실행할 수 있도록 구성 옵션을 사용하여 SQL Server를 구성할 수 있습니다. SQL Server 7.0에서는 이 계정을 SQLAgentCmdExec라고 합니다. 이제 sysadmin 고정 서버 역할의 구성원이 아닌 사용자도 구성 변경을 지정하지 않고 이 계정의 컨텍스트에서 명령을 실행할 수 있습니다.

사용 권한

sysadmin 고정 서버 역할의 구성원에 xp_cmdshell에 대한 기본 권한을 실행합니다. 단, 다른 사용자에게도 부여할 수 있습니다.

중요  
MSSQLServer 서비스에 대한 로컬 관리자 그룹의 구성원이 아닌 Windows NT를 사용하기로 선택한 경우에는 sysadmin 고정 서버 역할의 구성원이 아닌 사용자가 xp_cmdshell을 실행할 수 없습니다.
예제
A. 실행 파일의 목록 반환

다음은 디렉터리 명령을 실행하는 xp_cmdshell 확장 저장 프로시저를 보여 주는 예제입니다.

EXEC master..xp_cmdshell 'dir *.exe'
B. Windows NT 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
C. 출력 반환 안함

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

USE master
EXEC xp_cmdshell 'copy c:\sqldumps\pubs.dmp \\server2\backups\sqldumps', 
   NO_OUTPUT
D. 반환 상태 사용

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

DECLARE @result int
EXEC @result = xp_cmdshell 'dir *.exe'
IF (@result = 0)
   PRINT 'Success'
ELSE
   PRINT 'Failure'
E. 파일에 변수 내용 기록

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

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

'SQL' 카테고리의 다른 글

sp_configure  (0) 2009.08.11
sp_executesql  (0) 2009.08.10
TABLE 정리 스크립트  (0) 2009.07.24
프로시저에서 DTS Package 실행하기  (0) 2009.07.23
SQL 기초 3  (0) 2009.06.20
Posted by ProjectGhost

BLOG main image
by ProjectGhost

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

Total :
Today : Yesterday :