您的位置:首页 > 运维架构 > Shell

xp_cmdshell 用法

2010-04-28 11:30 363 查看
一、简介
xp_cmdshell 扩展存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出。

三、SQL Server 2005中的xp_cmdshell
由于存在安全隐患,所以在SQL Server 2005中, xp_cmdshell 默认是关闭的。
此时,如果执行 xp_cmdshell 将会提示服务未开启:

exec xp_cmdshell 'dir c:/'

消息 15281,级别 16,状态 1,过程 xp_cmdshell,第 1 行
SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。

四、开启xp_cmdshell

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
  
  关闭一样.只是将上面的后面的那个"1"改成"0"就可以了.
  
  EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;

未能找到存储过程 'master..xp_cmdshell'
第一步执行:EXEC sp_addextendedproc xp_cmdshell,@dllname ='xplog70.dll'declare @o int
第二步执行:sp_addextendedproc 'xp_cmdshell','xpsql70.dll'

五 小应用

exec xp_cmdshell 'dir c:/'

output
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
驱动器 C 中的卷没有标签。
卷的序列号是 4B44-2248
NULL
c:/ 的目录
NULL
2009/03/17 16:25 1,024 .rnd
2009/06/22 20:24 <DIR> 2ca0cee524d21bddd225196413
2009/07/22 15:39 <DIR> a
2008/09/01 03:12 74 autoexec.bat
2006/09/19 05:43 10 config.sys
2008/01/21 10:43 <DIR> PerfLogs
2009/07/31 23:28 1,073,741,824 ppsds.pgf
2009/07/29 08:57 <DIR> Program Files
2009/05/27 21:54 20 SSOLib.ini
2009/04/17 11:10 <DIR> SwSetup
2009/08/13 16:48 <DIR> TDDownload
2009/06/18 22:48 <DIR> Temp
2008/10/11 08:24 <DIR> UiTV
2008/10/04 04:58 <DIR> Users
2009/07/30 19:58 <DIR> Windows
5 个文件 1,073,742,952 字节
10 个目录 34,368,856,064 可用字节
NULL

(23 行受影响)

应用2 输出f盘下某文件夹的所有JPG格式的文件

DECLARE @result int
EXEC @result = xp_cmdshell 'dir F:/杂七杂八/photo/*.jpg'
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure'

F:/杂七杂八/photo 的目录
NULL
2009/05/28 19:43 88,931 (~ o ~)Y.jpg
2008/10/06 12:56 85,044 66666.jpg
2008/10/06 12:56 466,826 DSC00040.JPG
2008/10/28 21:35 355,820 http_imgloadCA3DGXKF.jpg
2009/05/07 19:04 83,433 http_imgloadCAG3I0EJ.jpg
2009/05/07 19:04 106,528 http_imgloadCATYBM7V.jpg
2009/02/19 19:18 72,074 ME.jpg
2009/05/28 19:42 76,863 p_large_xoDu_2617d206096.jpg
2008/10/06 12:57 54,716 图像001.jpg
2008/10/06 12:57 25,668 图像005.jpg
2008/10/06 12:57 17,675 图像018.jpg
2008/12/21 17:30 14,769 图像022.jpg
2008/10/06 12:57 14,707 图像025.jpg
2008/10/08 17:34 471,752 新图像.JPG
2008/10/06 12:57 111,465 照片 044.jpg
2008/10/06 12:57 34,878 集体照.jpg
16 个文件 2,081,149 字节
0 个目录 8,026,488,832 可用字节
NULL

(24 行受影响)

Success

应用三:

将变量内容写入文件中

DECLARE @cmd sysname, @var sysname
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > F:/xiaozhu.txt'
EXEC master..xp_cmdshell @cmd

应用四:

将文件内容放到表里

insert into #t
EXEC master.dbo.xp_cmdshell 'dir F:/杂七杂八/photo/*.jpg/b'

这个还是举个例子吧

/*

数据库DBA中有表Table
结构如下:
-------------
id(自增)
path
---------------

path的内容类似这样记录
------------------------------------

200410172013291.jpg
2004101516293326425686.jpg
200412312558clip_image002.jpg
200410141821208.jpg
2004101213222695B6C65F4468C5E0D70242E7C066F154.jpg
20041011163730IMG_0243.JPG
2005720145516fyzw_20057138345.jpg
200578221362005620164840.jpg
20057822520玉照.JPG
20057151752442222.jpg
200578203732英x.jpg
200578164326图片 008.jpg
200581832240.jpg
2005781626123.jpg
20057815392112.jpg
20057815324211111 拷贝.jpg
2004101212359vb2.JPG
2004108134415IMAGE_00482.jpg
2004925232010照片:).jpg
2004106143316t.jpg
20049231033373.jpg
2004922133386.JPG
2004914124416showphoto.jpg
2004911223336photo28.jpg
2004927945224.jpg
2005112819271273499.jpg
2004830144020ldmsapp1.jpg
2005715113135照片 074_调整大小.jpg
……
---------------------------------

有一图片文件夹,里面图片名称就是path的值
(说明:图片文件夹中存在的图片,一定可以在数据库中找到记录)

有什么好方法?如何可以快速地将无图片的path值填为null呢???

图片大约有1000个左右
path中的的记录大约为5万条*/

if object_id('tb') is not null
drop table tb
go
create table tb(id int,path varchar(200))
insert into tb
select 1,' F:/杂七杂八/photo/66666.jpg'
union all
select 2,' F:/杂七杂八/photo/DSCF3831.JPG'

select * from tb

drop table #t
CREATE TABLE #t(filename NVARCHAR(1024));

insert into #t
EXEC master.dbo.xp_cmdshell 'dir F:/杂七杂八/photo/*.jpg/b'

update tb
set path=null
from tb left join #t t
on tb.path like '%'+t.filename+'%'
where filename is null

select * from tb

/*

id path
----------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 F:/杂七杂八/photo/66666.jpg
2 NULL

*/

这里 一个被更新为NULL 因为文件夹里不存在这个照片。。

创建一个文件夹 并且在里面加个MDF

use master
go
if exists (select * from sysdatabases where name='bbsDB')
drop database bbsDB
go
exec xp_cmdshell 'mkdir d:/project'
create database bbsDB
on
(
name='bbsDB_data',
filename='d:/project/bbsDB_data.mdf',
size=10,
filegrowth=20%
)
log on
(
name='bbsDB_log',
filename='d:/project/bbsDB_log.ldf',
size=3,
maxsize=20,
filegrowth=10%
)
go
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: