xp_cmdshell(Transact-SQL)
Windows 명령 셸을 생성하고 실행을 위해 문자열로 전달합니다. 모든 출력은 텍스트 행으로 반환됩니다.
구문
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
참고 항목
참조
일반 확장 저장 프로시저(Transact-SQL)
sp_xp_cmdshell_proxy_account(Transact-SQL)