Dec 24, 2008

Ubuntu 软件备份与清理

备份快速设置已下载的部分软件包,以便重装系统再次使用,免去重新下载的时间
tar cizvf backup.tar.gz /var/cache/apt/archives --exclude=/var/cache/apt/archives/partial/* --exclude=/var/cache/apt/archives/lock  重装系统,设置好源列表后,导入已备份的软件包即可,操作方法:sudo apt-get update && sudo tar xzvf backup.tar.gz -C /  清理 sudo apt-get clean  rm -rf ~/.thumbnails/fail/gnome-thumbnail-factory/*   

Dec 15, 2008

django 生成 下载 csv 文件

django生成并下载 csv文件:

import csv

download(request, qstr):
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment;filename=%s.csv' %qstr
    writer = csv.writer(response)
    csvtitle = [u'姓名'.encode('GBK'), u'手机号'.encode('GBK'), u'商品名称'.encode('GBK'), u'售出数量'.encode('GBK'), u'单价(RMB)'.encode('GBK'), u'日期'.encode('GBK')]
    writer.writerow(csvtitle)
    return response

pyExcelerator django 创建可供下载的 excel


pyExcelerator 创建excel的代码大概如下:

from pyExcelerator import *
wb = Workbook()
ws = w.add_sheet('Sheet1')
ws.set_show_headers = 0
header = ['姓名', '手机号码', '商品名称', '售出数量', '单价(RMB)', '日期']
header = [x.decode('utf8') for x in header]
for i in range(len(header)):
    ws.write(0, i, header[i])
wb.save()

在django中提供下载:
from pyExcelerator import *

xlsname = 'test.xls'
w = Workbook()
ws = w.add_sheet('Sheet1')
ws.set_show_headers = 0
header = ['姓名', '手机号码', '商品名称', '售出数量', '单价(RMB)', '日期']
header = [x.decode('utf8') for x in header]
for i in range(len(header)):
    ws.write(0, i, header[i])
w.save(xlsname)

response = HttpResponse(mimetype='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment;filename=%s' %xlsname
response.write(w.savestream())
return response

注意,Workbook类中是没有savestream方法的,参考http://blog.csdn.net/kernelspirit/archive/2008/10/26/3147888.aspx

修改pyExcelerator代码

Workbook的savestream方法:
def savestream(self):
    import CompoundDoc

    doc = CompoundDoc.XlsDoc()
    return doc.savestream(self.get_biff_data())

CompoundDoc.XlsDoc的savestream方法:
def savestream(self, stream):
    # 1. Align stream on 0x1000 boundary (and therefore on sector boundary)
    padding = '\x00' * (0x1000 - (len(stream) % 0x1000))
    self.book_stream_len = len(stream) + len(padding)

    self.__build_directory()
    self.__build_sat()
    self.__build_header()

    s = ""
    s = s + str(self.header)
    s = s + str(self.packed_MSAT_1st)
    s = s + str(stream)
    s = s + str(padding)
    s = s + str(self.packed_MSAT_2nd)
    s = s + str(self.packed_SAT)
    s = s + str(self.dir_stream)
    return s

Mysql 批量删除数据表

#!/usr/bin/env python
#coding: utf-8
import MySQLdb

def droptables(tablename):
    remainTable = []
    db = MySQLdb.connect(host = 'localhost',
                        user = 'test',
                        passwd = 'test',
                        db = 'test')
    cursor = db.cursor()
    while True:
        cursor.execute('show tables like "%s%%"' % tablename)
        tables = cursor.fetchall()
        if len(tables) == 0:
            break
        for x in tables:
            try:
                cursor.execute('drop table %s' %x)
                db.commit()
            except:
                #print x
                continue
    cursor.close()
    db.close()

if __name__ == '__main__':
    tablename = 'droptest_'
    droptables(tablename)

Dec 4, 2008

Windows下的Apache Php Mysql 环境搭建

使用软件:
Apache、Php、Mysql

配置:
1. Apache:
编辑httpd.conf
DocumentRoot "E:/Program Files/Apache Group/web"

# < 和 字母之间没有空格
< Directory "E:/Program Files/Apache Group/web" >

LoadModule php5_module "E:/Program Files/Apache Group/PHP/php5apache2.dll"

DirectoryIndex index.html index.html.var index.htm index.php

AddDefaultCharset GB2312

AddType application/x-httpd-php .php .phtml .php3 .php4


2. Php:
把Php目录下的 php.ini-dist 重命名为 php.ini,然后拷贝到 %systemRoot% 下
复制Php目录下的 php5ts.dll,libmysql.dll 到 %systemRoot%\system32下

extension_dir = "E:\Program Files\Apache Group\PHP\ext"

extension=php_dba.dll
extension=php_dbase.dll
extension=php_gd2.dll
extension=php_imap.dll
extension=php_mysql.dll
extension=php_mysqli.dll

C# 操作 Excel

// 连接字符串
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;";
strConn += "Extended Properties='Excel 8.0;HDR=No; IMEX=1;';";
strConn += "data source=" + xlsPath;

// 查询语句
string cmdText = "SELECT * FROM [Sheet1$]";

OleDbConnection connDB = new OleDbConnection(strConn);
OleDbCommand cmdDB = new OleDbCommand(cmdText, connDB);
OleDbDataReader drdr;

// 打开Excel表格
connDB.Open();

// 执行 sql语句
drdr = cmdDB.ExecuteReader();


if(drdr.Read())
{
..............

drdr.GetValue(i)

...............

}

把文本文件中的数据导入 MS SQL Server 2005

在查询分析器中执行下面的命令:
use NumberLocation;
BULK INSERT Fixed From 'E:\code\DB\fixedbook-sort.txt' With
(FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')

其中 use 是先进入 数据库 NumberLocation
*.txt 是要导入的文本文件
FIELDTERMINATOR 是字段分隔符
ROWTERMINATOR 行分隔符

MS SQL Server 函数及运算

1. 改变列标题
=, AS
SELECT 'database' = db_name();
SELECT id AS UserId FROM student;

2. 增加一列
SELECT au_fname, au_lname, 'Identification Number: ', au_id FROM
authors;

3. 算术运算 (+、-、*、/、%)
%只能用于 INT, SMALLINT, TINYINT
SELECT title, price, 'price -3' = price -3

4. 数学函数 (ABS, SIN, COS, TAN, PI(), RAND(), SIGN(), SQRT(), SQUARE(),
CEILING(38/3), EXP(2.0), LOG(10) ...)
SELECT LOG(10)
SELECT 69/8

5. 字符串函数
SELECT ascii('abc')
SELECT 'SQL' + 'Server' + '2005'
SELECT char(36)
SELECT charindex('Server', 'SQL Server 2005')
SELECT lower('ABC')
SELECT upper('cde')
SELECT replicate('MSSQL-', 10)
SELECT substring('1234567890', 5, 3)
SELECT len('hello world')
SELECT stuff('1234567890', 3, 2, '-abcdefghigk-')

6. 日期和时间函数 (GETDATE(), DATEADD())
SELECT GETDATE()

7. 系统函数 (DB_NAME(), USER_NAME(), SUSER_NAME(), ISNUMERIC(), ISDATE(), )
ISNUMERIC(title_id):如果是数字类型,返回1;如果是日期、字符串或者
其他数据类型,返回0

8. 数据类型强制转换
SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales FROM titles
WHERE CONVERT(char(20), ytd_sales) LIKE '3%'

C# 从Web网站下载文件

// 给出文件的url和文件下载后的文件绝对路径
// 从服务器下载文件
// 成功返回 true,否则返回false
// using System.Net;

private bool DownloadFile(string url, string strfile)
{
HttpWebRequest hwr = null;
Stream ns = null;

FileStream fs = new FileStream(strfile, FileMode.Create);
int nReadSize = 0;
byte[] abytes = new byte[1025];

try
{
hwr = (HttpWebRequest)WebRequest.Create(url);
ns = hwr.GetResponse().GetResponseStream();
nReadSize = ns.Read(abytes, 0, 1024);
while (nReadSize > 0)
{
fs.Write(abytes, 0, nReadSize);
nReadSize = ns.Read(abytes, 0, 1024);
}
fs.Close();
ns.Close();
}
catch (Exception eer)
{
MessageBox.Show(eer.Message);
fs.Close();
File.Delete(strfile);
return false;
}

return true;
}

Error: The INF file contains Unicode characters that could not be converted correctly to ANSI

用vs 2005 制作wince cab安装包时,vs 2005提示:
Error: The INF file contains Unicode characters that could not be
converted correctly to ANSI

解决方法:
1、在部署的安装包项目的属性中,一定要把"manufacturer"(制造商)项填写成
英文或数字,不能为中文。此时的"属性"不是选中项目后右键中的属性,而中选中
项目后,按F4键出现的发生窗口。
把其中的manufacturer项的值改为非中文。

2、因为制作的安装包程序有"快捷方式",所以在"文件系统"窗口中把"快捷方式"
的名称也要改为非中文。

3、注意将程序生成的EXE的文件名也要改成英文的

文件被数字签名策略拒绝(File was rejected by digital signature policy)

安装 Windows Mobile 6 Professional SDK Refresh.msi ,报错 "文件被数字签
名策略拒绝(File was rejected by digital signature policy) "

这个错误产生的原因据说是:"当运行安装程序时,Windows Installer 会验证程序
包的数字签名以确保程序包没有被篡改。这时整个程序包被加载到内存中,计算机
必须拥有程序包大小所需的足够连续内存。如果计算机没有足够的连续内存,则会
出现错误。由于出现错误,Windows Installer 将无法验证是否对该程序包正确地
进行了签名。"

解决:
修改
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Safer\CodeIdentifiers
注册表项下面的 PolicyScope 的注册表值,将值从0 改为 1

VS 2005 没有找到MFC80UD.DLL,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题

"Visual Studio 2005用向导生成的项目,在运行时可能会遇到找不到MFC80UD.dll
的问题。

解决方法:
通过修改项目属性->清单工具->输入输出,把"嵌入清单"选"否",.然后编译、链
接、运行即可

使用 Grub For Dos

以前大多用WinGrub 也用过两次Grub4dos

WinGrub容 易,有GUI自己设置一下就OK

Grub4dos其 实也很容易

  解压
  放系统盘
  把grldr拷贝到系统盘根目录
  修改boot.ini ,最后一行添加:
  C:\grldr="Grub4Dos"

Ubuntu 8.04 LAMP 搭建

软件安装:
sudo apt-get install apache2 php5 libapache2-mod-php5 mysql-server
libapache2-mod-auth-mysql libapache2-mod-auth-mysql

设置域名,编辑/etc/apache2/httpd.conf 添加
ServerName ox0spy.org

匹配ip地址的python正则表达式

pattern =
'^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$'

Python 文件操作

1. 常规操作 -file 类
常用于文件读写操作
常用方法: file, open, read, readline(), readlines(),write(),
writelines(), seek(), tell(),flush(), close()
属性:name, mode, isatty, closed

2. 获取文件信息:os, stat, time
os.stat()
os.lstat()

stat模块获取详细文件信息

fileStats = os.stat(filename)
fileInfo = {
'Size' : fileStats [ stat.ST_SIZE ],
'LastModified' : time.ctime ( fileStats [ stat.ST_MTIME ] ),
'LastAccessed' : time.ctime ( fileStats [ stat.ST_ATIME ] ),
'CreationTime' : time.ctime ( fileStats [ stat.ST_CTIME ] ),
'Mode' : fileStats [ stat.ST_MODE ]
}

3. 通过os.path获取一些文件信息
文件是否存在、是否是一个目录、...
获取文件大小、创建、访问、修改时间

4. 目录操作
os.listdir(dir)
os.mkdir(dir)
os.rmdir(dir)
os.mkdirs(dirs) # mkdir -p
os.rmdirs(dirs) # rm -r

5. 对不同类型的文件进行操作:fnmatch
import os, fnmatch

for filename in os.listdir('.'):
if fnmatch.fnmatch(filename, '*.py'):
print open(filename).read()
elif fnmatch.fnmatch(filename, '*.sh'):
print filename
elif fnmatch.fnmatch(filename, '?.txt'):
print 'Text file :', filename

*代表匹配所有字符,?匹配一个任意字符

在"fnmatch"模块,我们可以创建正则表达式来应用,只要通过 "re" 模块:
import fnmatch
import os
import re
filePattern = fnmatch.translate ( '*.txt' )
for fileName in os.listdir ( '/' ):
if re.match ( filePattern, fileName ):
print 'Text file.'


如果想从一个目录下搜索一种类型的所有文件,使用glob:
glob(pathname)
Return a list of paths matching a pathname pattern.

#!/usr/bin/env python
import glob
for filename in glob.glob('[0-9].txt'):print filename


6. 序列化数据
pickle, cpickle

#!/usr/bin/env python
import pickle
fileHandle = open('pickleFile.txt', 'w')
thisList = ['This', 2, 'is', 1, 'a', 'test']
pickle.dump(thisList, fileHandle)
fileHandle.close()

解序列
#!/usr/bin/env python
import pickle
fileHandle = open('pickleFile.txt', 'r')
thisList = pickle.load(fileHandle)
fileHandle.close()

7. 内存文件:StringIO, cStringIO

a small tip : print >> f, a_string 等价于 f.write(a_string + '\n')

windows 命令行、批处理资源

http://www.ss64.com/nt/
http://www.sysinternals.com/
http://www.nirsoft.net/
http://www.diamondcs.com.au/

Django manage.py 能做什么

创建项目
django-admin startproject projectName

在创建的项目下有:__init__.py, manage.py, settings.py, urls.py

下面主要看看manage.py 的用途:
manage.py 提供一些简单的管理功能,有:
1) 创建应用
./manage.py startapp appName

2) 验证models.py 书写是否正确
./manage.py validate

3) 根据models.py打印用于创建表的sql 语句
./manage.py sqlall dbName

4) 根据models.py创建表
./manage.py syncdb

5) ./manage.py shell 类似于 执行 python

6) ./manager.py dbshell 类似于 mysql -u username -p (其中username 是
settings.py 中设置的)

python md5

import md5
hash = md5.new()
hash.update('test')
hash.hexdigest()

调用Django 日期控件

<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="/media/js/core.js"></script>
<script type="text/javascript" src="/media/js/calendar.js"></script>
<script type="text/javascript"
src="/media/js/admin/DateTimeShortcuts.js"></script>

<input name="date" value="{%now "Y-m-d"%}" class="vDateField" type="text"
id="query_date" size="10" />

Dec 3, 2008

校内网 相册 批量 下载

校内网 相册 批量下载

python 练手
环境ubuntu 8.04
windows 用户应该会产生乱码,可以自己在程序中几个关键位置加上
.decode('UTF-8').encode('GBK')

功能:
1. 下载校内指定用户的全部相册
2. 下载指定用户的某一个指定相册



============== 很傻,很天真的分割线 ================


代码:

http://ox0spy.googlepages.com/xiaonei.py

Dec 2, 2008

苏格拉底与失恋者的对话

失恋者:"我失恋了。"

苏格拉底:"哦,这很正常。如果失恋了没有悲伤,恋爱大概也就没有什么味道
了。可是,年轻人,我怎么发现你对失恋的投入甚至比你对恋爱的投入还要倾心呢?"

失恋者:"到手的葡萄给丢了,这份遗憾,这份失落,您非个中人,怎知其中的酸
楚啊。"

苏格拉底:"丢了就丢了,何不继续向前走去,鲜美的葡萄还有很多。"

失恋者:"我要等到海枯石烂,直到她回心转意向我走来。"

苏格拉底:"但这一天也许永远不会到来。"

失恋者:"那我就用自杀来表示我的诚心。"

苏格拉底:"如果这样,你不但失去了你的恋人,同时还失去了你自己,你会蒙受
双倍的损失。"

失恋者:"您说我该怎么办?我真的很爱她。"

苏格拉底:"真的很爱她?那你当然希望你所爱的人幸福?"

失恋者:"那是自然。"

苏格拉底:"如果她认为离开你是一种幸福呢?"

失恋者:"不会的!她曾经跟我说,只有跟我在一起的时候,她才感到幸福!"

苏格拉底:"那是曾经,是过去,可她现在并不这么认为。"

失恋者:"这就是说,她一直在骗我?"

苏格拉底:"不,她一直对你很忠诚的了。当她爱你的时候,她和你在一起,现在
她不爱你,她就离去了,世界上再也没有比这更大的忠诚。如果她不再爱你,却要
装着对你很有感情,甚至跟你结婚、生子,那才是真正的欺骗呢。"

失恋者:"可是,她现在不爱我了,我却还苦苦地爱着她,这是多么不公平啊!"

苏格拉底:"的确不公平,我是说你对所爱的那个人不公平。本来,爱她是你的权
利,但爱不爱你则是她的权利,而你想在自己行使权利的时候剥夺别人行使权利的
自由,这是何等的不公平!"

失恋者:"依您的说法,这一切倒成了我的错?"

苏格拉底:"是的,从一开始你就犯错。如果你能给她带来幸福,她是不会从你的
生活中离开的,要知道,没有人会逃避幸福。"

失恋者:"可她连机会都不给我,您说可恶不可恶?"

苏格拉底:"当然可恶。好在你现在已经摆脱了这个可恶的人,你应该感到高兴,
孩子。"

失恋者:"高兴?怎么可能呢,不过怎么说,我是被人给抛弃了。"

苏格拉底:"时间会抚平你心灵的创伤。"

失恋者:"但愿我也有这一天,可我第一步应该从哪里做起呢?"

苏格拉底:"去感谢那个抛弃你的人,为她祝福。"

失恋者:"为什么?"

苏格拉底:"因为她给了你忠诚,给了你寻找幸福的新的机会。"

说完,苏格拉走了。

----------
*祝你幸福*
----------

2008 11 29
给家里打个电话,我妈一接电话就说你是不是病了

然后和我妹聊了很久

2008 11 30

找了点做老师的感觉
(王亮, 温锴) 宁大 10:30

2008 12 1

勾起宋泽的伤心事,内疚啊,还好早上说不辞职了
给Yang打电话,好像手机没在身边

给水水打,他愣要我再给xx打个电话

贺伟也是,聊了n久,后来说俺一根经,后来和朋友继续喝酒
(王亮, 杜娜, 毛毛, 茄哥, 唐莉) 紫园 良田路 0:30


Nov 29, 2008

校内相册批量下载

很爽的东西。。。



o(∩_∩)o...



使用:

1. 下载一个用户的所有相册(包括头像相册)




如图:

-e 邮箱

-p 密码

-u 你想下载那个家伙的 用户id

比如:http: //xiaonei.com/getuser.do?id=221427773,那么 -u 就是 221427773


2. 想在一个用户的某一个相册



其他参数和上面的一样,就是多了一个 -a

-a 指定这个用户的具体相册

比如:http://photo.xiaonei.com/getalbum.do?id=255545234&owner= 221427773,

那么 -a 就是 上面url id的值,255545234

Nov 28, 2008

Thanksgiving Day

sms
make an appointment
dinner
walk
ice cream
go home

比去年的感恩节快乐多了!

Nov 14, 2008

Python Mysql中文解决方案

1. 安装时设置Mysql字符集为utf8
1)查看字符集支持
show character set;
2)查看字符集相关变量
show variables like "character_set%";
3)设置默认字符集为utf8 (这在Ubuntu上做的, Windows改my.ini)
修改/etc/mysql/my.cnf, 在[client]和[mysqld]下加上: default-character-set=utf8
/etc/init.d/mysql
注: 设置连接mysql时使用utf8,可以在[mysqld]下加上: init_connect='SET NAMES utf8'

2. cmd中查询时,先 set names gbk; 然后就可以正常显示汉字了

这样做是由于Windows cmd中无法显示utf8编码的汉字;如果你在Linux shell中就不需要这条命令了

3. 用MySQLdb:
db = MySQLdb.connect(host = 'localhost',
user = 'wap',
passwd = 'wap',
db = 'wap',
charset = 'utf8')

4. 读取GBK编码的文件
line = f.readline().decode('GBK')
注: 函数 decode( char_set )可以实现 其它编码到 Unicode 的转换
函数 encode( char_set )实现 Unicode 到其它编码方式的转换

5. 程序中使用字符串时,前面加上 u,如:
s = u'hello'

Nov 12, 2008

Windows搭建Python Apache Django Mysql环境

软件: Python、 Apache、mod_python、Mysql、MySQL-python

按上面的顺序安装就可以了

然后配置下apache,在httpd.conf中
把DocumentRoot、相应的Directory设置成web根目录
加一行:LoadModule python_module modules/mod_python.so
在把下面的东西加到最后:
<Location "/">
SetHandler python-program
PythonPath "['F:\web\django'] + sys.path"
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE wap.settings
PythonDebug On
</Location>

<Location "/includes/">
SetHandler None
</Location>

<LocationMatch "\.(jpg|gif|png)$">
SetHandler None
</LocationMatch>

Oct 21, 2008

C# 读取gb2312文本文件

StreamReader objReader = new StreamReader(strFilename,System.Text.Encoding.GetEncoding("gb2312"));

如果不加第二个参数,读出来的中文是乱码

Python 自动搜索可用ip并设置

Python设置IP Address,用的是 qujinlong123@gmail.com 的,详见:用Python 干实事(一)自动修改Windows的IP、网关和DNS设置


我添加了搜索功能

# -*- coding: GB2312 -*-

# FileName: modify_ip.py
# Author  : ox0spy
# Email   : ossteerer@gmail.com
# Date    : 2008-10-21

# 程序的前两个函数是qujinlong123@gmail.com实现的,这里借用下


import _winreg
from ctypes import *

def    ModifyIpAddress(ipAddress, subnetMask, gateway, dnsServer):
    netCfgInstanceID = None
   
    hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, \
                           r'System\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}')
   
    keyInfo = _winreg.QueryInfoKey(hkey)
   
    # 寻找网卡对应的适配器名称 netCfgInstanceID
    for index in range(keyInfo[0]):
        hSubKeyName = _winreg.EnumKey(hkey, index)
        hSubKey = _winreg.OpenKey(hkey, hSubKeyName)
   
        try:
            hNdiInfKey = _winreg.OpenKey(hSubKey, r'Ndi\Interfaces')
            lowerRange = _winreg.QueryValueEx(hNdiInfKey, 'LowerRange')
   
            # 检查是否是以太网
            if lowerRange[0] == 'ethernet':
                driverDesc = _winreg.QueryValueEx(hSubKey, 'DriverDesc')[0]
                # print 'DriverDesc: ', driverDesc
                netCfgInstanceID = _winreg.QueryValueEx(hSubKey, 'NetCfgInstanceID')[0]
                # print 'NetCfgInstanceID: ', netCfgInstanceID
                break
   
            _winreg.CloseKey(hNdiInfKey) # 关闭 RegKey
        except WindowsError, e:
                            pass
                # print r'Message: No Ndi\Interfaces Key'
           
        # 循环结束,目前只提供修改一个网卡IP的功能
        _winreg.CloseKey(hSubKey)
   
    _winreg.CloseKey(hkey)
   
    if netCfgInstanceID == None:
        print '修改IP失败 - 没有找到网络适配器'   
        exit()
   
    # print netCfgInstanceID
   
    # 通过修改注册表设置IP
    strKeyName = 'System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\' + netCfgInstanceID
   
    # print strKeyName
   
    hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, \
                           strKeyName, \
                           0, \
                           _winreg.KEY_WRITE)
   
    try:
        _winreg.SetValueEx(hkey, 'IPAddress', None, _winreg.REG_MULTI_SZ, ipAddress)
        _winreg.SetValueEx(hkey, 'SubnetMask', None, _winreg.REG_MULTI_SZ, subnetMask)
        _winreg.SetValueEx(hkey, 'DefaultGateway', None, _winreg.REG_MULTI_SZ, gateway)
        _winreg.SetValueEx(hkey, 'NameServer', None, _winreg.REG_SZ, ','.join(dnsServer))
    except WindowsError:
        print 'Set IP Error'
        exit()
   
    _winreg.CloseKey(hkey)
    return netCfgInstanceID
   
# 调用DhcpNotifyConfigChange函数通知IP被修改
def Notify(netCfgInstanceID, ipAddress, subnetMask):
    DhcpNotifyConfigChange = windll.dhcpcsvc.DhcpNotifyConfigChange

    inet_addr = windll.Ws2_32.inet_addr

    # DhcpNotifyConfigChange 函数参数列表:
    # LPWSTR lpwszServerName,  本地机器为None
    # LPWSTR lpwszAdapterName, 网络适配器名称
    # BOOL bNewIpAddress,      True表示修改IP
    # DWORD dwIpIndex,         表示修改第几个IP, 从0开始
    # DWORD dwIpAddress,       修改后的IP地址
    # DWORD dwSubNetMask,      修改后的子码掩码
    # int nDhcpAction          对DHCP的操作, 0 - 不修改, 1 - 启用, 2 - 禁用
    DhcpNotifyConfigChange(None, \
                       netCfgInstanceID, \
                       True, \
                       0, \
                       inet_addr(ipAddress[0]), \
                       inet_addr(subnetMask[0]), \
                       0)


def Pin(ip = '192.168.1.1'):
    """ ping -n 1 ip"""
   
    import os
    if os.system("ping -n 1 %s >nul" % ip) == 0:
        return True
   
    return False   
               
def GetConfInfo(filename = 'conf.ini'):
        import re, sys
        try:
                f = open(filename, 'r')
                lines = [line.split('#')[0].strip() for line in f.readlines()]
                f.close()

                if len(lines) >= 6:
                        # ip网段
                        network = lines[0]
                        pattern = '^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$'
                        if not re.search(pattern, network):
                                print '网段设置错误,请修改配置文件网段信息'
                                sys.exit(2)
                        network = network.split('.')
                        network.pop()
                        network = '.'.join(network)
                        # print 'network : ', network
                        # 开始ip
                        startIp = int(lines[1])
                        if (startIp < 1 or startIp > 254):
                                print '开始ip设置错误, ip :', startIp
                                sys.exit(3)
                        # 结束ip
                        endIp = int(lines[2])
                        if endIp < 2 or startIp > 255:
                                print '结束ip设置错误'
                                sys.exit(4)
                        # 子网掩码
                        subnetMask = lines[3]
                        # 默认网关
                        gateway = lines[4]
                        if not re.search(pattern, gateway):
                                print '默认网关设置错误'
                                sys.exit(5)
                        # dns
                        dnsServ = lines[5]
                        if not re.search(pattern, dnsServ):
                                print 'dns服务器设置错误'
                                sys.exit(6)
                else:
                        print '配置文件有误,请修正后重试'
                        sys.exit(1)
                     
        except IOError, e:
                print '确定配置文件名为 : %s' % filename
                sys.exit(7)

        return [network, startIp, endIp, subnetMask, gateway, dnsServ]

Info = GetConfInfo()
if not Info:
        sys.exit()

network, startIp, endIp, subnetMask, gateway, dnsServ = Info
if startIp == endIp:
        endIp += 1
       
ipAddress = ['%s.%s' % (network, i) for i in range(startIp, endIp)]
subnetMask = [subnetMask]
gateway = [gateway]
dnsServer = [dnsServ]
url = 'http://ox0spy.blogspot.com'

MessageBox = windll.user32.MessageBoxA

for ip in ipAddress:
    ip = [ip]
    # print 'IP Address : ', ip
    netCfgInstanceID = ModifyIpAddress(ip, subnetMask, gateway, dnsServer)
    Notify(netCfgInstanceID, ip, subnetMask)
    if Pin(url):
        # print '可用Ip地址 :', ip[0]
        msg = '可用Ip地址 : %s o(∩_∩)o...' % ip[0]
        MessageBox(0, msg, 'Good luck', 0)
        break;
else:
        msg = '没有可用ip,换个网段试试 ^_^'
        MessageBox(0, msg, 'sorry', 0)

ttylinux Tips

1. ttylinux 引导程序安装
环境:vmware平台上装ttylinux
以前用vmware装完redhat等其他linux后,安装程序会自动把引导程序装好的,但ttylinux不同,它的引导程序必须自己手动 安装。
其实,非常简单
#installer mbr /dev/hdc /dev/hda
注:我只虚拟出一个硬盘,没有任何分区。
更多可以参考:http://www.minimalinux.org/ttylinux/docs/user_multi/node16.html

2. ttylinux 联网
///这完全是我的机器配置,不同isp提供的很多东西都是不一样的
 
I、设置ip addr、netmask、BROADCAST (我用的是静态ip)
#cp /etc/network.d/sample  /etc/network.d/interface.eth0
#vi /etc/network.d/interface.eth0
内容如下:
# network interface configuration file sample
# change settings and rename to interface.devname, i.e. interface.eth0
# network device name
INTERFACE="eth0"
# set to "yes" to use DHCP instead of the settings below
DHCP="no"
# interface settings
# IP address
IPADDRESS="192.168.18.18"
# netmask
NETMASK="255.255.255.0"
# gate way
#GATEWAY=192.168.18.1
# broadcast address
BROADCAST="192.168.18.255"
 
II、添加默认网关
#route add default gw 192.168.18.1
 
III、设置DNS 
#vi etc/resolv.conf
内容如下:
nameserver      219.146.0.130
nameserver      61.233.154.33
search localdomain
 
IV、编辑/etc/hosts,便于和我的win 2003、redhat互联
 
V、ttylinux不支持ftp,不过文件传输可以使用scp,tftp
  
     scp命令格式:
     scp local_files username@hostname:path/to/file
     scp username@hostname:path/to/file local_file
     例如:
     scp ./*.html jhou@www.nctu.edu.tw:www/portfolio/2005/
     就是将本地目前所在目录中的所有 .html 文件拷贝到 athena 的个人网页空间的 portfolio/2005/ 次目录中。
     tftp命令格式:
     tftp -i ip put/get files
     注:put 上传;get 下载
          files就是你要传输的文件

Jul 8, 2008

Windows CE开发入门

from  ox0spy.blogspot.com
by     ossteerer@gmail.com
// 声明下:俺是初学者,有问题的地方还请高手斧正

网上有一些Windows CE开发入门的文章,但我看的头很晕,所以决定写篇自己的学习过程~

1. 简单介绍下Windows CE: (来源于百度百科)
      WindowsCE是微软公司嵌入式、移动计算平台的基础,它是一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它 是精简的Windows 95,Windows CE的图形用户界面相当出色。
      其中CE中的C代表袖珍(Compact)、消费(Consumer)、通信能力(Connectivit)和伴侣(Companion);E代表电子 产品(Electronics)。与Windows 95/98、Windows NT不同的是,Windows CE是所有源代码全部由微软自行开发的嵌入式新型操作系统,其操作界面虽来源于Windows 95/98,但Windows CE是基于WIN32 API重新开发、新型的信息设备的平台。Windows CE具有模块化、结构化和基于Win32应用程序接口和与处理器无关等特点。Windows CE不仅继承了传统的Windows图形界面,并且在Windows CE平台上可以使用Windows 95/98上的编程工具(如Visual Basic、Visual C++等)、使用同样的函数、使用同样的界面风格,使绝大多数的应用软件只需简单的修改和移植就可以在Windows CE平台上继续使用。Windows CE并非是专为单一装置设计的,所以微软为旗下采用Windows CE作业系统的产品大致分为三条产品线,Pocket PC(掌上电脑)、Handheld PC(手持设备)及Auto PC。

2. 现在的问题就是我们怎么开始开发Windows CE应用程序——搭建开发环境
    2.1、选择开发工具
     我选择eVC4(eMbedded Visual C++ 4.0)做开发工具,因为eVC4和VC 6.0很像,容易上手,而且与vs 2005相比非常小巧。

     软件下载:
      eVC4:http://www.microsoft.com/downloa ... &displaylang=en
      eVC4 sp4:http://www.microsoft.com/downloa ... &displaylang=en
      Windows Mobile 5.0 Pocket PC SDK:http://www.microsoft.com/downloa ... &displaylang=en
     Localized Windows Mobile 5.0 Pocket PC Emulator Images:http://www.microsoft.com/downloa ... &displaylang=en

     下载完毕,按这个顺序装完这4个软件,开发环境就ok了,就可以写个Hello World测试下了.

3. 第一个测试程序
  3.1 创建工程   
      打开eVC4,File --> New ,新建一个 "WCE Application" 工程,填好Project name、Location并选择CPU类型.
我只在模拟器中运行这个程序,所以我只选择了Win32 (WCE X86)
注:不管选择哪种CPU,Win32 (WCE emulator)都是必须要选择的.

       点OK进入下一步,然后,选择"An empty project" 建一个空工程(没有任何附加代码)
       怎么样,和VC 6.0 中创建工程很像吧~

  3.2 编写程序
        File --> New, 新建个C/C++源文件(即:C/C++ source file),在File处填写该文件的文件名hello,然后在刚才建的hello.cpp文件中输入下面的代码:
// hello.cpp - A sample "Hello World " program.

#include <windows.h>

// Program entry point

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
{
    MessageBox(NULL, TEXT("Hello World!"), TEXT("hello"), MB_OK);

    return 0;
}


现在按 F7 编译该程序,如果没有错误,就可以按 Ctrl+F5执行程序。在模拟器中可以看到程序执行结果.如下图:
点击在新窗口查看全图 CTRL+鼠标滚轮放大或缩小

4. 总结
     本文简单的介绍了Windows CE,并教你如何搭建开发环境,最后写了一个Hello World程序。有了这些基础我们就可以开始学习Windows CE程序开发了。

    推荐一本我最近正在看的书: Programming Microsoft Windows CE .NET, Third Edition.pdf (1.09 MB)

Jun 20, 2008

Tips

1. 校内相册支持批量上传,一次最多可上传60张。该工具只支持IE,Firefox中不可用

2. Google的Picasa 相册可以批量下载,有两种方法,都需要先安装Picasa
    a. 查看网页源代码,搜索“下载相册”,然后把url  copy到地址栏 回车
    b. 用Picasa Webalbums Assistant:可以通过指定Picasa用户名或图片地址来批量下载位于Google Picasa上某一相册中的图片
        官方网址:http://picasawebalbumsassistant.googlepages.com/ [需翻墙]
        下载地址:下载地址1 | 下载地址2 | 大小:806K

        Google 真是个好东西啊,太强大了。。。

May 23, 2008

使用Ubuntu Live CD 安装 grub

   一机器光驱不好用了,而且硬盘上没有任何系统。现在要在上面安装rhel5,一共五张盘,害怕装到第n(n < 5)张时光驱罢工
   手头上有没有空闲光驱,拆机器上的太麻烦
   故,选择硬盘安装
   但总要有个程序先把系统引导起来,如wingrub、grub4dos等,没有安装windows,wingrub显然就pass了
   正好手边有张Ubuntu Live CD,就用它了。
   用Live CD将系统引导起来,进入ubuntu。
   $ sudo grub
   grub> root (hd0,0)
   grub> setup (hd0,0)

    Checking if "/boot/grub/stage1" exists... no
    Checking if "/grub/stage1" exists... no

   Error 15: File not found

   grub>quit

   $ grub --version  // 查看grub版本
     grub (GNU GRUB 0.97)

    我把另一个系统中的/boot/grub 拷贝到 hda1中,现在就可以用上面的 root,setup命令将grub安装到这个系统上了。
    然后,只需把rhel的5个iso文件和vmlinuz、initrd.img拷贝到hda1中,重启机器,开始安装rhel5


  

 

May 16, 2008

Pentest - Tools

From : Tr4c3’s blog

Packet Shaper:
Nemesis: a command line packet shaper
Packit: The Packet Toolkit - A network packet shaper.
Hping by Antirez: a command line TCP/IP packet shaper
Sing: stands for ‘Send ICMP Nasty Garbage’; sends fully customizeable ICMP packets
Scapy: a new python-based packet generator

Password Cracker/Login Hacker:
John the Ripper: a well-known password cracker for Windows and *nix Systems
Djohn: a distributed password cracker based on “John the Ripper
Cain & Abel: an advanced password recovery tool for windows systems. It sniffs the network packets an cracks authentication brute-force or with dictionary attacks.
Project RainbowCrack: Advanced instant NT password cracker
Rainbowtables: The shmoo group provides pre-generated rainbow tables for bittorrent download. The tables are generated with RainbowCrack (see above).
Windows NT password recovery tool by Peter Nordahl
THC-Dialup Login Hacker by THC. It tries to guess username and password against the modem carrier. As far as I know the only available dialup password guesser for *NIX.
Hydra by THC: a multi-protocol login hacker. Hydra is also integrated with Nessus.
Medusa: parallel network login auditor
THC imap bruter: a very fast imap password brute forcer
x25bru: a login/password bruteforcer for x25 pad
Crowbar: a generic web brute force tool (Windows only; requires .NET Framework)
MDCrack-NG: a very fast MD4/MD5/NTLMv1 hash cracker; works optionally with precomputed hash tables

Advanced Sniffers:
Wireshark (formerly known as Ethereal): an open source network protocol analyzer
Dsniff by Dug Song: a combination of very useful sniffer and man-in-the-middle attack tools
Ettercap: a multipurpose sniffer/interceptor/logger for switched LAN environments
aimsniffer: monitors AOL instant messager communication on the network
4G8: a tool ,similar to ettercap, to capture network traffic in switched environments
cdpsniffer: Cisco discovery protocol (CDP) decoding sniffer

Port Scanner / Information Gathering:
nmap: the currently most well-known port scanner. Since version 3.45 it supports version scans. Have a look at PBNJ for diffing different nmap scans.
ISECOM released their nmap wrapper NWRAP, which shows all known protocols for the discovered ports form the Open Protocol Resource Database
Nmap::Scanner: Perl output parser for nmap
Amap by THC: An advanced portscanner which determines the application behind a network port by its application handshake. Thus it detects well-known applications on non-standard ports or unknown applications on well-known ports.
vmap by THC: version mapper to determine the version (sic!) of scanned daemons
Unicornscan: a information gathering and correlation engine
DMitry (Deepmagic Information Gathering Tool): a host information gathering tool for *nix systems
Athena: a search engine query tool for passive information gathering

Security Scanner:
Nessus - In version 2 an OpenSource network scanner. Version 3 is only available in binary form and under a proprietary license.
OpenVAS: a fork of Nessus 2.2.5 (formerly known as GNessUs)
Nessj: a java based nessus (and compatibles) client (formerly known as Reason)
Paul Clip from @stake released AUSTIN, a security scanner for Palm OS 3.5+.

Webserver:
Nikto: a web server scanner with anti IDS features. Based on Rain Forest Puppies libwhisker library.
Wikto: a webserver assessment tool (Windows only; requires .NET framework)
WSDigger: a black box web pen testing tool from Foundstone (Windows based)
Metis: a java based information gathering tool for web sites

Fingerprinting:
SinFP: a fingerprinting tool which requires only an open tcp port and sends maximum 3 packets
Winfingerprint: much more than a simple fingerprinting tool.It scans for Windows shares, enumerates usernames, groups, sids and much more.
p0f 2: Michal Zalewski announced his new release of p0f 2, a passive OS fingerprinting tool. p0f 2 is a completely rewrite of the old p0f code.
xprobe2: a remote active operating system fingerprinting tool from Ofir Arkin and the xprobe2 team
Cron-OS: an active OS fingerprinting tool based on TCP timeout behavior. This project was formerly known as “RING” and is now published as a nmap addon.

Proxy Server:
Burp proxy: an interactive HTTP/S proxy server for attacking and debugging web-enabled applications
Screen-scraper: a http/https-proxy server with a scripting engine for data manipulation and searching
Paros: a man-in-the-middle proxy and application vulnerability scanner
WebScarab: a framework for analyzing web applications. One of it’s basic functionality is the usage as intercepting proxy.

War Dialers:
IWar: a classic war dialer, now also with VOIP (IAX2) support. One of a few wardialers for *nix operation systems, and the only with VOIP functionality (to my knowledge)
THC-Scan: a war dialer for DOS, Windows and DOS emulators

Malware / Exploit Collections:
packetstormsecurity.org: Huge collections of tools and exploits
ElseNot Project: The project tries to publish an exploit for each MS Security Bulltin. A script kiddie dream come true.
Offensive Computing: Another malware collection site
Securityforest: try the ExploitTree to get a collection of exploit code; have a look at the ToolTree for a huge list of pentest stuff

Databases / SQL:
sqlninja: a tool to exploit sql injection vulnerabilities in web applications with MS SQL Servers (alpha stage)
CIS Oracle Database Scoring Tool: scans Oracle 8i for compliance with the CIS Oracle Database Benchmark
SQLRecon: an active and passive scanner for MSSQL server. Works on Windows 2000, XP and 2003.
absinthe: a gui-based tool that automates the process of downloading the schema & contents of a database that is vulnerable to Blind SQL Injection (see here and here).
SQL Power Injector: a GUI based SQL injector for web pages (Windows, .Net Framework 1.1 required, Internet Explorer 5.0+ required)

Voice over IP (VOIP):
vomit (voice over misconfigured internet telephones): converts Cisco IP phone conversations into wave files
SiVuS: a VOIP vulnerability scanner - SIP protocol (beta, Windows only)
Cain & Abel: mostly a password cracker, can also record VOIP conversations (Windows only)
sipsak (SIP swis army knife): a SIP packet generator
SIPp: a SIP test tool and packet generator
Nastysip: a SIP bogus message generator
voipong: dumps G711 encoded VOIP communications to wave files. Supports: SIP, H323, Cisco Skinny Client Protocol, RTP and RTCP
Perl based tools by Thomas Skora: sip-scan, sip-kill, sip-redirectrtp, rtpproxy and ipq_rules
rtptools: a toolset for rtp recording and playing

Networkbased Tools:
yersinia: a network tool designed to take advantage of some weakeness in different network protocols (STP, CDP, DTP, DHCP, HSRP, 802.1q, VTP)
Netsed: alters content of network packets while forwarding the packets
ip6sic: a IPv6 stack integrity tester

VPN:
ike-scan: an IPSec enumeration and fingerprinting tool
ikeprobe: ike scanning tool
ipsectrace: a tool for profiling ipsec traffic in a dump file. Initial alpha release
VPNMonitor: a Java application to observer network traffic. It graphically represents network connections and highlights all VPN connections. Nice for demonstrations, if somewhat of limited use in a real pen test.
IKECrack:an IKE/IPSec cracker for pre-shared keys (in aggressive mode authentication [RFC2409])
DNSA: DNS Auditing tool by Pierre Betouin
Hunt: a session hijacking tool with curses GUI
SMAC: a Windows MAC Address Modifying Utility. Supports Windows 2000 and XP.
The WebGoat Project: a web application written in Java with intentional vulnerabilities. Supports an interactive learning environment with individual lessons.
TSCrack: a Windows Terminal Server brute forcer
Ollie Whitehouse from @stake released some new cellular phone based pentesting tools for scanning (NetScan, MobilePenTester). All tools require a Sony Ericsson P800 mobile phone. Unfortunately, @stake seems no longer to support much of their free security tools. So, use instead the alternativ download links above.
THC-FuzzyFingerprint: generates fuzzy fingerprints that look almost nearly equal to a given fingerprint/hash-sum. Very useful for MITM attacks.
BeatLM, a password finder for LM/NTLM hashes. Currently, there is no support for NTLM2 hashes. In order to get the hashes from network traffic, try ScoopLM.
THC vlogger: a linux kernel based keylogger
The Metasploit Framework: an “advanced open-source platform for developing, testing, and using exploit code”.
ATK (Attack Tool Kit): a comination of security scanner and exploit framework (Windows only)
Pirana: an exploitation framework to test the security of email content filters. See also the whitepaper
PassLoc: a tool which provides the means to locate keys within a buffer. Based on the article “Playing hide and seek with stored keys” by Adi Shamir.
Dl-Hell: identifies an executables dynamic link library (DLL) files
DHCPing: a security tool for testing dhcp security
ldapenum: a perl script for enumeration against ldap servers.
Checkpwd: a dictionary based password checker for oracle databases
NirCmd from NirSoft: a windows command line tool to manipulate the registry, initiate a dialup connection and much more
Windows Permission Identifier: a tools for auditing user permissions on a windows system
MSNPawn: a toolset for footprinting, profiling and assesment via the MSN Search. Windows-only, .NET required
snmpcheck:a tool to gather information via snmp. Works on Linux, *BSD and Windows systems.
pwdump6: extract NTLM and LanMan hashes from Windows targets


May 14, 2008

如何在网络上实时监测地震 [转]

From : http://www.bigsea.com.cn

四川7.8级地震,且5级以上余震不断。
如果您有四川的亲友,请及时联系,唯望大家平安。
长久以来,地震基本上是只能监测不能预测的。
在此介绍一些网上监测地震的方法(昨天cnBeta也是通过他们向大家提供技术情报 的):

1. IRIS 监测图
该图列出监测到的地震
http://www.iris.edu/seismon/bigmap/index.phtml

2. USGS 地震记录
该网页列出一周内的2.5级以上的地震记录
http://earthquake.usgs.gov/eqcenter/rec ... s_all.html

3. Opera Widget: EarthQuakes Map
该 Opera Widget 显示全球范围内一周内发生的地震,实时更新。(需配合 Opera 使用)
http://widgets.opera.com/widget/5178/

May 13, 2008

西夏省嵬城遗址

银川嵬城遗址所在地点   于惠农县庙台乡省嵬村,为党项族首领李德明于北宋天圣二年(1024年)所筑。遗址为正方形,边长600米,设东南两城门,墙体为黄土夯实,残墙最高 1.5米。1965年,宁夏博物馆在此挖掘出唐、宋、西夏等朝钱币、古陶瓷器及铁器,已被列为宁夏回族自治区重点文物保护单位。 关于省嵬城的建筑,史料记载不多。《明一统志》载:省嵬城在河东,河东废城也。《嘉靖宁夏新志》载:"省嵬城,河东废城也,未详其始。"《宁夏府志》 载:"嵬城遗址在省嵬山下,西南去府(今银川市)东北一百四十里,逾黄河。"吴广成《西夏书事》载:"天圣(北宋)二年(公元1024年) 春二月,德明做省嵬城于定州(西夏将银川以北为定州)。"这些记载虽简,但却载明了省嵬城遗址的所在地点。

  西夏王朝是以党项羌族为主体建立起的多民族国家政权,于1032年(宋天圣10年)建国,1227年被成吉思汗所灭,历时近200年。李元昊的 祖上拓跋思恭曾为唐朝镇压黄剿领导的农民起义军立下战功,被唐僖宗赐姓李,至他的祖父李继迁、父亲李德明都受到重用。李元昊这位军事天才不赞成父亲德明向 宋称臣。老辣的德明当时鉴于时机不成熟,对儿子说:"吾久用兵疲矣,吾族三十年衣锦绮,此宋恩也,不可负!"元昊顶撞道:"衣皮毛,事畜牧,蕃性祈便。英 雄之生,当王耳,何锦绮为?"雄心壮志可见一斑。

  元昊建国后,升兴州首府为兴庆府(今银川市),之后的年代里组织创制西夏文字。西夏文形体方正,结构复杂,笔画较多,约有6000字左右,字体 有草、篆、隶、楷等。西夏崇尚佛教,把佛教定为国教,规定每一季第一个月的朔日(初一)为"圣节"。让官民届时烧香拜佛,不惜用行政手段来推行佛教,并接 受汉文化及吐藩、回鹘文化,从而逐渐形成了自己的西夏文化体系。宋代欧阳修曾就元昊治国有方进行过评价:"威能畏其下,恩能死其人。"

  1032年西夏王李德明卒,其子元昊嗣位,首先去掉唐、宋时期所赐给的李、赵姓氏,自号嵬名氏,自标吾祖"可汗"(即天子的意思)。李德明用自 己祖先嵬名氏(党项羌的姓名)给建起的省嵬城取名。其意可谓深谋远虑,确有自称一统的想法。嵬城遗址曾出土一具秃发瓷制人 头。元昊曾于明道二年(1033)下令秃发。这件文物弥足珍贵。

地址: 在省嵬山下,西南去府(今银川市)东北一百四十里,逾黄河

西夏的衰落和灭亡 (公元1206—1227年)

来源: http://www.yellowsheepriver.com               

  天庆十三年(公元1206年)一月,仁孝的侄子、镇夷郡王安全,勾结纯祐的母亲
罗氏,发动宫廷政变,废黜纯祐,做了第七代皇帝。久觎皇位的安全,"天资暴
狠,心术险鸷",金朝开始不予承认,但是在罗氏的多次请求下,才勉强给予"册
封"。襄宗安全篡位以后,改变长期与金盟好的政策,依附日渐强大的蒙古,对金
进行了长达十余年的战争,夏、金双方在经济和军事上都受到严重损伤,西夏国内
的阶级矛盾也进一步激化。这时,蒙古迅速崛起,加紧南下侵扰。这种内外形势,
导致了西夏的衰落和灭亡。


一、夏、金关系的破裂和战争
  西夏和金朝之间的睦邻友好关系,始于崇宗乾顺末年(夏元德六年,公元1124
年)。在此之后八十多年,金和西夏之间虽有一些小的磨擦,但基本上维持着比较
和好的关系。两国之间的使节往来频繁,政治上互相支持,经济上互通有无,这种
关系对双方都有好处。安全篡位后,改变国策,依附日渐强大的蒙古,与金之间开
始了长期的战争,使西夏面临严重威胁的局势。
  公元十一、十二世纪时,在今蒙古草原及其周围,散居着许多游牧部落,如蒙
兀部,塔塔儿部、乃蛮部、汪古部等。其中蒙兀即蒙古部。蒙古部贵族铁木真在公
元十二世纪末至十三世纪初,联合一些部落击败、兼并另一些部落,于公元1206年
结束了蒙古草原上长期分裂的局面,在斡难河即位为蒙古大汗,尊号成吉思汗。蒙
古汗国统一成一支强大的力量后,以成吉思汗为首的蒙古贵族,开始向外扩张和掳
掠,首当其冲的便是西夏和金。
  夏应天四年(公元1209年)九月,蒙古军队围攻西夏都城,安全向金朝求援。金
朝因也遭到蒙古的侵扰,不能自保,没有派兵援救。西夏受到蒙古的打击以后,安
全慑于蒙古的强大,企图将矛头引向金朝。蒙古兵退后的第二年八月,安全发兵万
余骑,攻打金朝的葭州(今陕西佳县境),从此,夏、金关系正式宣告破裂。
  夏皇建二年(公元1211年)七月,齐王遵顼(xǖ音须)发动宫廷政变,废黜襄宗安
全,自立为帝。神宗遵项是宗室齐王彦宗之子。尽管史书上说他"端重明粹,少力
学,长博通群书,工隶篆",纯祐时曾以"廷试进士,唱名第一",嗣齐王爵,并擢
升为大都督府主。实际上,他却是一个比安全明智不了多少的昏君。遵项夺得帝位
以后,全盘承袭了从安全开始的亡国政策,妄图乘蒙古攻金的机会,掳掠财物,扩
大领土,对金的战争越来越频繁,规模也越来越大。遵顼嗣位伊始便遣万余骑攻打
金朝的东胜城(今内蒙古托克托),金朝西南路马军万户纥烈石鹤寿及时赶来救
援,夏兵败退。十一月,遵顼又以兵万余攻打金军事要地平凉府(今甘肃平凉
县),由于金朝早有准备,围城时又听到金有援兵万人即将赶到,遂匆忙解围而
去。夏光定三年(公元1213年)元月,夏兵攻破金保安州(今陕西志丹县),进围庆阳
府(今甘肃庆阳县)。八月,乘金静难节度使乌林答琳患病的机会,攻破邠州(今陕
西彬县)。十一月,金朝内乱,遵顼乘机出兵攻打会州。十二月,又以万余骑攻破
巩州(今甘肃陇西县),进围平凉府,被金兵击败。
  光定四年(公元1214年)秋,遵顼令吐蕃路招讨使万庆义勇派人到南宋西和州
(今甘肃西和县西),约宋制置使董居谊出兵,夹击金朝,遭到南宋的拒绝。光定五
年(公元1215年)一月,金朝边境官吏派兵侵扰夏境,金主得悉后怕事态扩大,立即
派使臣向遵项赔情道歉,但遵项不肯罢休,出兵攻金积石州 (今青海贵德县),接
着又进攻环州。十月,遵顼集聚右厢精兵八万余人,破金临洮府(今甘肃临谭县西
南),然后退兵转攻金绥德境内的克戎、绥平诸地。十二月,遵顼派兵和金国叛将
程陈僧一起再攻临洮府,遭到金兵痛击。光定六年(公元1216年)九月,遵顼派人联
络蒙古军队,合兵攻打金延安、代州等地,并攻陷潼关。同年冬,遵顼派兵四万余
围攻金定西城,被金兵打败,死二千余人。
  金朝遭到西夏的连续攻击,忍无可忍,于十二月分兵两路,发起反击。右监军
陀满胡土门、延安总管古里古石伦率兵攻西夏的盐、宥、夏诸州;庆阳总管庆山
奴、知平凉府移刺塔不也攻西夏的威、灵、会等州。遵项面对金朝的两路攻势,分
兵抵抗,夏、金双方势均力敌,出现了相持不下的局面。光定七年(公元1217年)
一月,遵顼以三万余骑随蒙古兵攻金平阳府(今山西临汾市西南)。金兵顽强抵
抗,蒙古兵大败。西夏只得退兵,途经宁州(今甘肃宁县),遭到金将庆山奴的伏
击,大败而归。遵顼附庸蒙古、合兵攻金的策略,不仅不能消除蒙古的威胁,反而
把自己降为被蒙古役使的地位。十二月,蒙古军队再度围困西夏都城,遵顼仓皇出
逃。可是,遵顼仍未能从中吸取教训。
  光定八年(公元1218年)五月,遵顼又以步骑三千余人,引蒙古兵由葭州入鄜、
延,遭到金兵的沉重打击。遵顼不甘心,又先后两次派人到四川,请南宋出兵攻
金,再次遭到拒绝。光定十年 (公元1220年)二月,夏兵攻金朝镇戎军,接着又攻
新泉城(今甘肃靖远县西南)。金兵则入夏宥州,围神堆府(今陕西靖边县西),杀
夏兵二千余,缴获各种牲畜三千多。八月,遵顼遣万余兵攻破会州,金主命陕西行
省与夏议和。遵顼拒绝议和,于九月派兵三万,乘胜破西宁州(今青海西宁市),围
定西州(今甘肃定西县南)。接着,又遣枢密使宁子宁、嵬名公辅率兵二十万,进攻
金军事要地巩州,久攻不下,死伤者数以万计。光定十一年(公元1221年) 三月,
蒙古木华黎部渡过黄河,攻西夏河西诸堡,守将无力抵抗,纷纷投降。面对蒙古大
兵压境,遵项急忙派监府塔海设宴招待蒙古军队,并派塔哥、甘普等人率兵五万归
木华黎指挥,随蒙古军进攻金朝,使西夏进一步紧绑在蒙古的战车上。十月,木华
黎率蒙古、西夏兵破金朝葭州,并围绥德、延安、安塞等城砦。十二月,遵顼得悉
金主令临洮府总管女奚烈古里间等招抚十万大军,准备攻取兴、灵二州,便先发制
人,发兵数十万,分三路向金发起进攻,金边境地区遭到西夏军队的极大蹂躏和破
坏。光定十二年(公元1222年)六月,木华黎和右都监石天应率兵攻金陕西诸州,向
夏国借道,遵顼马上应允,并于十二月出兵配合,至质孤堡被金兵打败。翌年一
月,遵顼派步骑十万,配合木华黎围攻金风翔府(今陕西风翔县),道挫败后,不告
蒙古,先撤兵退还。光定十三年(公元1223年),兴、灵诸州春旱粮食无收,"饥民
相食"。西夏境内的各族人民在战火和自然灾害的袭击下,处于水深火热之中。但
是,以遵顼为首的夏国统治集团,却完全不顾人民的死活,继续全力对金作战。七
月,遵顼令亲军万人攻破金积石州。十月,蒙古为了惩罚风翔之战夏兵不辞而别,
派兵包围积石州,并四出抄掠,将夏兵围困达半个多月;才退兵。蒙古大军的铁拳
又一次打到了遵顼自己的头上。遵顼为保全自己,甘心做蒙古的附庸,但是蒙古对
他却早已失去了兴趣,多次遣使责令他退位,遵顼成了他自己制定的附蒙抗金政策
的牺牲品。在蒙古的逼迫下,遵顼只好于十二月将皇位传给次子德旺,做了西夏历
史上惟一的"上皇"。献宗德旺接位以后,改变遵顼依附蒙古的政策,重新和金朝修
好,共抗蒙古。乾定元年(公元1224年)十月,德旺采纳右丞相高良惠的建议,派使
节到金朝议和。乾定二年(公元1225年)九月,德旺派吏部尚书李仲谔等去金朝讲
和,商定双方相互支援。但这时蒙古已兵临金都城下,金朝危在旦夕,自顾不暇,
早已无力援助西夏,夏国的灭亡也同样已经不可避免。

二、统治阶级内部的矛盾
  面对迅速崛起的蒙古汗国,要使国家继续生存和发展,西夏的国策只能是安定
国内,联合金、宋,共同抗蒙。但是以昏庸腐瞆的襄宗、神宗为首的西夏最高统治
集团,却坚持附蒙抗金的错误政策,造成社会经济凋敞,统治阶级内部的矛盾重
重,这是西夏衰亡的内部原因。在西夏皇室中,以太子德任和梁德懿、高良惠等为
代表,提出联金抗蒙的正确主张,但由于安全、遵顼的反对,这一主张始终没有得
以实现。
  夏光定六年(公元1216年),葩俄、苽藜等各氏族首领汪三郎、青觉儿、阿令结
等人,不满遵顼对金作战的政策,率部投金,并成为英勇抗击夏兵侵扰的名将。夏
光定十三年(公元1223年),遵顼令德任领兵进犯金朝,德任拒绝接受,并对他父亲
说:"金朝的兵势还很强大,不如与金修好,结为盟友。"遵顼不听,训斥说:"你
懂得什么?金朝失去兰州竟无力收复,强盛在哪里?"德任再三劝阻无效;提出弃太
子位,出家为僧的要求。遵顼勃然大怒,下令将德任软禁在灵州。十二月,跟随蒙
古的夏国军队在积石州遭到蒙古兵的围困,遵顼不仅没有从中受到应有的教训,反
而准备集全国十二监军司的兵力,孤注一掷,进攻金朝的巩州。御史中丞梁德懿知
道后,上疏谏阻说:"国家用兵十余年,田野荒芜,民生涂炭,连妇女小孩都知道
国势濒危。而朝廷的大臣们,却终日清歌夜宴,不虑国家危亡。太子以父子之情,
为国家存亡担忧,毅然陈述大计,敬献忠言,反而遭到斥责和废弃,蒙受屈辱和软
禁。这样做合适吗?望国主能抚恤百姓,修睦邻邦。"这番话对维护遵顼的统治,
还是很恳切的。可是遵顼根本听不进去,反而将梁德懿一顿痛骂。梁德懿在悲愤和
失望之余,只好辞官退职稳居。
  安全、遵顼两代对金的长期战争,不仅受到统治阶级内部一部分皇亲贵族的反
对,而且也遭到国内广大人民的强烈憎恶。他们不时采取逃避征兵的办法,使遵顼
点兵不能遽集。在夏、金友好时期,金朝在边境地区,如保安、兰州等地开设榷
场,鼓励和发展两国之间的官方和民间贸易。西夏以自己境内的特产青白盐、牲畜
和皮毛等产品,交换金朝的粮食、铜、丝麻织品、货币和其他物资。同时,西夏还
可以通过赴金朝使节的频繁往来,在金都城公开进行贸易活动,从金国市场上购买
西夏所急需的大量物资。夏、金关系破裂以后,金朝采取关闭榷场、禁绝贸易的手
段回击。
  光定二年(公元1212年)正月,遵顼在下令进犯金朝的同时,又派使节到金都,
企图按照惯例,在会同馆和金人进行贸易,被金朝驱逐出境。夏、金之间的贸易交
往,因西夏推行背金政策而受到禁绝,使西夏在经济上受到很大损失。
  长期的战乱,对西夏国内的生产和人民生活造成极其严重的恶果。西夏对金的
战争,双方互有胜负。在战争中,西夏劳动人民被杀被俘,社会生产力遭到极大破
坏,大量牲畜和其他物资投入战争,致使生产资料严重不足。德旺时的殿中御史针
对西夏社会的经济情况,曾奏疏指出:"自兵兴以后,败卒旁流,饥民四散,若不
招集而安抚之,则国本将危。"又说,"国经兵贸,民不聊生,耕织无时,财用并
乏。"这些话绝不是夸大之词。
  公元1226年蒙古军队攻破应里县(今宁夏中卫县)后,看见夏国"仓库无斗粟尺
帛之储'。由此可见,夏国的社会经济确实已经陷于全面崩溃的绝境。对金朝无休
止的战争,最直接的受害者,自然是生活在社会最底层的广大劳动人民。战争使他
们背井离乡,流离失所,处于深重的灾难之中。特别是光定十三年兴、灵地区大早
不雨,造成 "饥民相食"的悲惨局面。乾定三年又因大旱,河西诸州草木枯死,
人、畜大批死亡。可是,西夏的贵族地主阶级却完全不顾人民的死活,依然挥霍着
朝廷给他们的巨大"赏赍",吮吸劳动人民的血膏,耗费大量资财,"清歌夜宴",纸
醉金迷。对国家的危亡却置若罔闻,无动于衷,"舌结口钳",提不出任何拯救办
法。统治阶级的彻底腐朽,进一步加速了西夏的灭亡。
  由于西夏对金战争造成的国力衰竭,邻境的一些弱小民族也开始乘虚而入。夏
皇建二年(公元1211年),黑塔坦酋长白厮波发兵进攻西夏的河州(甘肃临夏县西
南),安全领兵仓促应战,遭到惨败,以致将公主都丢失在战场上。最后只得向黑
塔坦称臣,以妥协屈辱求得黑塔坦的退兵。西夏这时国力衰落已经不能抵御一个弱
小民族的进攻,更不可能抗御蒙古军队的强大攻势了!

三蒙古的征伐和西夏的灭亡
  夏天庆十二年(公元1205年),蒙古第一次向西夏显示强大的武力。三月,成
吉思汗借口西夏收纳了蒙古仇人,率兵攻破力吉里寨(即应里县),并且纵兵瓜、沙
诸州进行掳掠。西夏统治阶级对蒙古军队的突然进攻束手无策,只得任其躁靖。四
月,成吉思汗退兵经过夏落思城,又"大掠人民及其骆驼而还"。纯祐对成吉思汗灭
亡西夏的企图没有足够的认识,因而当蒙古退兵后,以为从此可以太平,于是下令
大赦国内,做起西夏再度"中兴"的美梦。
  可是,好梦不长,夏应天二年(公元1207年)九月,蒙古又以安全废黜纯祐没有
通报为借口,第二次出兵,攻占了兀剌海城。安全调集右厢各路兵进行抵抗,蒙古
军队在夏境攻掠数月,因粮草接济不上而退兵。
  应天四年(公元1209年),成吉思汗为了消除灭亡金朝的后顾之忧,第三次出
兵征西夏。三月,派兵自黑水城(今内蒙古额济纳旗南)北,由居延海关口攻人河
西。安全遣皇子承祯、大都督府令公高逸率兵五万竭力抵抗,但没有能抵御住蒙古
军队的强大攻势而惨遭失败,高逸被俘后不屈被杀。四月,蒙古兵再度围攻兀剌海
城。太傅西壁氏率兵和蒙古军队进行了激烈的巷战,夏兵战败,城陷。七月,蒙古
军队进攻右厢朝顺军司所在地克夷门。
  西夏在克夷门原有驻兵七万多,安全获悉蒙古军队进攻的消息后,又派嵬名令
公率兵五万增援,夏兵坚守两个多月,城最后还是被蒙古军队攻陷。嵬名令公也做
了蒙古军队的俘虏。蒙古军队乘胜包围中兴府。安全束手无策,只好亲自督军登城
防守。九月,正遇大雨,河水暴涨。成吉思汗派兵筑起堤坝,提高水位,引水灌
城。中兴府被围困达一月之久,城中居民淹死者无数。城墙即将领塌时,突然河水
决堤四溢,蒙古军队也受到洪水的淹溺,才退兵解围。蒙古退兵以后,成吉思汗遣
太傅讹答入城招谕,安全只好纳女求和,蒙古遂放还嵬名令公。
  蒙古和西夏议和后,便集中力量进攻金朝,金在蒙古大军的攻势下,于公1214
年将都城迁至汗京。从公元1216年起,成吉思汗亲率大军开始第一次西征,先后灭
掉了今伊犁河以西的西辽和花利于模王国。蒙古在西征和进攻金朗的过程中,不断
向夏国征兵。西夏"不堪奔命,礼意渐疏",于是又惹怒了蒙古。
  光定七年(公元1217年)十二月,蒙古军队渡过黄河,第四次出征西夏。当蒙古
军队逼近中兴府的时候,遵顼惊恐万状,将太子德任留在都城领兵防守,自己匆忙
逃窜西凉,夏兵无力抵抗,再次向蒙古请降。
  公元1223年,遵顼让位给德旺。德旺想趁成吉思汗亲自率军西征的机会,把漠
北未被蒙古征服的部落联合起来,共同抗击蒙古。当蒙古得悉西夏"阴结外援,蓄
异图"的消息以后,决定调集大军灭亡西夏。
   夏乾定元年(公元1224年)九月,蒙古军队攻破银州,夏兵数万人战死,夏将
塔海被俘后受害。德旺向蒙古表示愿意投降和派遣人质,蒙古才退兵。
  公元1225年,成吉思汗西征胜利,回到漠北。次年二月,成吉思汗借口西夏迟
迟不纳人质,又亲自统兵十万,由北路攻入夏境。先破西夏的军事重镇黑水、兀剌
海等城。接着,蒙古大将阿答赤率军与畏兀儿亦都护合兵攻沙州。夏将籍辣思义领
兵顽强抵抗,蒙古军经过月余的强攻才攻克沙州。五月,蒙古军挥兵南下,先后攻
陷肃州、甘州和西凉府。至此,西夏的右臂河西地区,几乎全部丧失。在蒙古大军
压境、势如破竹的攻势下,夏城连连失守。乾定三年(公元1226年)五月,六十四岁
的上皇遵顼病死,谥曰英文皇帝,庙号神宗。时隔两月,德旺忧悸成疾,也发病而
死,卒年四十六,庙号献宗。德旺死后,献宗的侄子晛(xiàn音现)被拥立继位。
  蒙古军队分成东西两路向西夏都城挺进。八月,西路军越过沙陀(今宁夏中卫
县西),抢占了黄河九渡,攻陷应里。十月,东路军攻破夏州。两路夹击,形成对
西夏政治、经济中心灵、兴地区的钳形攻势。十一月,成吉思汗亲自率领大军围攻
灵州。末主晛遣大将嵬名令公率十万大军紧急赴援,途中校蒙古军队打败。
  德任领固守灵州的夏兵和蒙古军队进行死战,其激烈的程度为蒙古作战以来所
少见。最后因夏兵伤亡惨重而失败。灵州失陷,德任被蒙古军队俘获,不屈被杀。
十二月,蒙古军队攻克盐州川,派兵四处搜索,烧杀抢掠,夏民"免者百无一二,
白骨蔽野"。乾定四年(公元1227年)一月,末主晛以蒙古兵临城下,国势濒危,顾
不得改元,继续使用乾定年号。这时,成吉思汗留一部分兵继续围攻中兴府,自己
带领大部分军队渡黄河进攻积石州,以彻底卡断夏兵的后路。末主晛被蒙古军围困
在中兴府内,一筹莫展,委托右丞相高良惠领兵抵抗。高良惠"内镇百官、外励将
士",领兵在都城日夜拒守,积劳成疾。部下劝他保重,他感叹说:"我身为国臣,
不能消除祸乱,使敌寇深入至此,活着有什么用呢?"最后由于劳累过度而死。闰
五月,成吉思汗回师隆德,因气天炎热,避暑于六盘山,派御帐前首千户察罕赴中
兴府谕降。
  六月间,又发生强烈地震,房屋倒塌,瘟疫流行。被蒙古军队围困达半年之久
的中兴府粮尽援绝,军民多患病,已失去了抵抗的能力,末主哯走投无路,只得派
遣使节向成吉思汗请求宽限一个月献城投降。七月,成吉思汗在清水县(今甘肃清
水县)西江得重病,立下遗嘱:死后暂秘不发丧,夏主献城投降时,将他与中兴府
内所有兵民全部杀掉。不久,末主哯李仲谔、嵬名令公等投降蒙古。蒙古军队带着
末主哯等行至萨里川,成吉思汗病死。蒙古军队为了防止夏主生变,遂遵照成吉思
汗的遗嘱,将末主哯等杀死。建国一百八十九年的西夏王朝终于灭亡。

西夏重大历史事件

来源: http://www.yellowsheepriver.com                 

一、党项与吐蕃、回鹘的斗争

  一○○四年,继迁死,子德明继立,向辽朝报哀。辽朝封德明为西平王。继迁死
前,遗嘱德明,向宋朝进表附宋。一○○五年六月,德明派牙将王晏(音民min)到
宋朝奉表入朝。宋真宗厚加赏赐。宋朝提出七事要德承允,主要是把灵州归还给宋
朝和派子弟人宋宿卫作人质。宋朝开放贸易,许贩青白盐。德明始终不允宋朝的条
件,宋朝只好让步。一○○六年,遣使封授德明定难军节度使、西平王。宋朝又先后
开榷场贸易。夏州天旱歉收,榷场不再禁止夏人买粮。德明时,只是边地部落有过
小的冲突,一般说来,和宋朝始终保持着和好关系。德明的劲敌主要是西方的吐蕃
部落和回鹘。
  一○○四年,吐蕃六谷部潘罗支在击败继迁后,又与宋朝联络,愿率领六谷部及
回鹘兵乘胜攻打党项。继迁统属的党项部落迷般嘱部及日逋吉罗丹部投附者龙族。
继迁出兵攻者龙,潘罗支领兵援助者龙抵抗。迷般嘱部及日通吉罗丹部乘机杀潘罗
支。者龙十三部中,六部归附党项。六谷部落选立潘罗支弟厮铎督为首领附宋,继
续与德明为敌。宋朝加号厮铎督为西凉府六谷大首领。
  一○○八年十月,德明派夏州万子等四部军主率领党项兵攻打西凉府,见六谷部
兵势盛,转而引兵攻打回鹘。回鹘伏兵袭击,万子等败走。一○○九年四月,德明又
派张浦率领精兵二万向回鹘复仇,攻打甘州。甘州回鹘夜落纥可汗领兵拒守,乘间
出兵袭击,张浦大败而回。一○一一年,德明又派西凉人苏守信袭击凉州样丹部。
六谷部厮锋督会集诸部兵迎敌,苏守信败退,据守凉州。一○一六年,甘州回鹘攻
占凉州,苏守信子啰麻弃城走(苏守信已死)。回鹘成为德明的一个严重威胁。
  一○二○年,德明在灵州怀远镇修建都城,从西乎迁到新城,号为兴州。一○二
四年,又在怀远西北省嵬山下建省嵬城,作为兴州的屏障。一○二六年,甘州回鹘
叛辽,辽萧惠兵攻甘州,德明出兵助战,不能战胜,随辽朝退兵。一○二八年,德
明子元昊领兵攻下甘州,又乘胜攻下西凉府,取得对回鹘作战的重大胜利。德明仿
宋朝制度,立元昊为皇太子。一○三○年,瓜州回鹘可汗贤顺也率部投降。德明、元
昊战胜回鹘,党项的历史进入了一个新时期。

二、对宋作战的失败和崇宗皇权的确立

  一○八六年,夏崇宗乾顺继位,年只三岁。惠宗秉常复位时,梁乙埋女(乙通
妹)立为皇后,生乾顺。梁氏一家二后,连续操纵两朝政事。崇宗即位,夏国政权
又归于梁乙通和梁太后兄妹。皇族嵬名阿吴和仁多保忠分掌兵权。嵬名、仁多和粱
氏形成夏国掌握军政的三大家族,展开相互倾轧的角斗。
  梁氏败亡梁氏执政,继续从西部向宋朝进攻。一○八七年五月,梁乙逋与吐蕃
阿里骨部联合,侵宋定西城。阿里骨是董毡的养子。董毡死,阿里骨继为部落首
领。梁乙逋与阿里骨相约,作战得胜,以熙、河、岷三州归吐蕃,兰州及定西城归
夏国。阿里骨攻破洮州,梁乙逋领兵数万出河州,大肆焚掠。在定西城击败宋军,
杀宋都监吴猛。梁乙逋又令仁多保忠率万人攻镇戎军。仁多保忠与梁乙逋不和,出
兵一夜即回军。九月,梁乙通又下令仁多保忠率兵十万入泾、原,围攻镇戎军西
寨。宋兵困守,不敢出战。宋知庆州范纯粹派兵来援,仁多保忠解围而退。
  一○八九年,宋夏议定,宋朝把米脂、葭芦、安疆、浮图等四寨地退给夏国,
夏国把永乐城俘获宋朝人口退还宋朝。宋、夏暂时休战。
  天祐民安三年(一○九二年)正月,夏国得辽朝援助,梁乙通再次出兵攻绥德
城,大掠五十余日而回。三月,夏兵在韦州聚集大兵攻环庆,战败,又遣使向辽求
援。十月,梁太后亲自领兵攻打环州,围攻七日,不下。还军至洪德寨,被宋兵打
得大败。梁太后弃帷帐,改换衣服逃走。夏兵死伤甚多。梁乙速在国内专权,贵族
间的矛盾日益发展。梁太后亲自出战,不让梁乙通领兵。梁乙通对梁太后逐渐不
满,阴谋篡夺。一○九四年十月,夏国大将嵬名阿吴、仁多保忠等率领部众,杀梁
乙通,井杀其全家。
  梁太后亲自掌握兵权,继续对宋侵掠。一○九六年,梁太后和崇宗乾顺领兵号
称五十万,侵入宋鄜延路,攻陷金明寨,献俘给辽国。一○九七年,宋朝在好水川
北修筑城防,号平夏城,以扼制夏国。夏兵破坏修城,不成。宋兵在沿边地带相继
筑堡。夏人愤怒说:"唱歌作乐地,都被汉家占却,以后该怎么办?"一○九八年十
月,梁太后领兵四十万,尽全力攻平夏城,连营百里,造高车运兵填壕而进,又用
飞石激火攻城,昼夜不息。攻城十二日,不能破。夏兵粮食渐乏。一天,大风突
起,冲车折损,梁太后退兵。
  梁太后兵败,十一月再次向辽求援。一○九九年,辽朝派使臣来夏,用药酒害
死梁太后(一说病死)。崇宗乾顺在辽朝支持下,开始亲政。

三、后族与惠宗皇室的争斗

  一○六八年,夏毅宗子秉常(惠宗)即帝位。秉常年仅八岁。太后梁氏执政,
弟梁乙埋为国相。政权为梁氏所掌握。梁氏是著化的汉人,他所代表的不是汉人地
主,而是党项奴隶主的势力。梁氏执政,即在次年宣布废汉礼,改用善礼,夏国统
治集团内部又一次发生斗争。
  梁太后当权,以梁乙埋和大将都罗马尾、贵族罔萌讹组成统治集团,掌握夏国
军政。夏景宗弟嵬名浪遇熟知兵事,毅宗时为都统军,参预国政。以浪遇为代表的
毅宗一系党项贵族不附梁氏。梁大后免浪遇官,徒居下治。次年,浪遇死在贬所。
梁氏对浪遇的压制,反映着后族与皇族的斗争在激烈地展开了。
  梁氏执政,对外与宋朝展开激战,对内与皇族势力反复地搏斗。武胜城之战一
○六九年三月,梁氏向宋朝上表,请以塞门、安远二寨换回绥州。宋朝不许。四
月,夏兵攻宋秦州,破刘沟堡,九月,进攻宋庆州,大掠人户而回。十二月,又攻
顺安、黑水等寨,围绥德城(宋得绥州,筑城后改名绥德)。次年五月,又攻庆
州,大败宋兵。八月,梁乙埋大举攻环、庆,攻大顺城。吐蕃董毡乘机人夏国西
境。梁乙埋退兵。
  天赐礼盛国庆三年(一○七一年)正月,梁乙埋在无定河畔抚宁故县北崖上筑
啰兀城,以扼横山冲要。宋种谔率河东兵来攻,乙埋邀击,宋兵败走。夏国都枢密
使哆腊(哆音侈chǐ)守啰兀城,宋兵来袭,哆腊弃城逃走,宋兵入城。三月,粱
乙埋领兵夺啰兀城。宋兵不战而退。夏兵夺回啰兀。五月,与宋朝谈和。九月,梁
氏又派阿泥(官名)嵬名科荣、吕宁(官名)焦文贵由延州入宋,索取绥州。宋朝
仍不许。一○七二年七月,夏、宋议定,以绥德城外二十里为界,各立封喉。
  绥州定界后,梁氏又采汉人学士景询的建策,谋夺吐蕃部落占据的武胜城。武
胜是夏国入洮河的要路,得武胜便可向西发展。这时,宋朝任命王韶为秦凤路沿边
安抚使。王韶也建策夺取武胜,以扼制西夏。一○七二年闰六月,梁乙埋派兵进攻
武胜,吐蕃守将瞎药战败。武胜城将破。忽然,王韶率领的宋兵到来。夏兵出乎预
料,仓促应战,被宋兵击败。瞎药弃城逃跑。宋王韶兵入据武胜城。宋朝在武胜建
镇洮军,又升为熙州。  一○七三年,王韶部又向河州进军。河州原是吐蕃部落
首领木征的居地。木征早已降附西夏,被王韶击败后,逃到夏国,请求梁氏派兵收
复河州。一○七四年四月,梁乙埋派兵七千人从结河川出援,被王韶击败,夏兵退军。
皇族、后族之争梁氏连败于宋朝,引起夏国内贵族的不满。一○七六年,惠宗秉常
年十六,开始亲政,但梁太后、粱乙埋仍然握有大权。一○八○年,惠宗在皇族支持
下又下令废蕃礼,行汉礼。梁太后、乙埋及后族一系的贵族群起反对,惠宗不理。
惠宗企图恢复毅宗时行汉礼和与宋朝和好的政策,停止对宋的掳掠。一○八一年三
月,汉人将军李清劝惠宗把黄河以南地归还宋朝,夏、宋以黄河为界,与宋议和。
梁太后与乙埋、罔萌讹等设计害死李清。随后又把惠宗囚禁到离故宫五里左右的兴
州的木寨。梁乙埋、罔萌讹等聚集人马,斩断河梁,使惠宗不能与外界通消息,实
际上是后族向皇族再次发动了夺权的政变。
  惠宗被囚,各地拥护皇族的将领拥兵自重,不听粱氏的统治。夏国内部出现了
分裂。保泰军统军禹藏花麻请求宋朝出兵讨伐梁氏。宋朝得知夏国政变,出兵五路
进攻西夏。一○八一年八月,宋李宪部出兵熙河,禹藏花麻以西使城降宋。九月,
李宪攻入兰州。十月。宋种谔部攻米脂。夏米脂守将令介讹遇以城降。宋高遵裕部
出环州,夏清远军守将鬼名讹降宋。梁乙埋率领的大军也被宋刘昌祚部击败。十
一月,宋兵围灵州。
  夏兵在各路战败,梁太后向朝臣问计。一个老将献计说,不须拒战,只要坚壁
清野,纵敌深入,把精兵聚集在兴、灵。派轻兵抄敌军的后路,断绝粮运,宋军无
食,不战自困。梁太后采纳此策,调十二监军司十万精兵驻守兴州要言之地。宋军
围灵州,夏兵出截宋军粮运。宋种谔、王中正等部都因无食溃退。宋高遵裕部围灵
州十八日。梁太后令夏兵决黄河水灌宋营。宋兵冻溺而死者无数,大败而退。
  宋兵进军时,曾攻入银、夏、宥三州,但无力驻守。一○八二年九月,宋神宗
又命给事中徐禧在三州界的永乐川下棒筑永乐城,企图困扼兴州。徐禧等急速建
造,十九天建成。夏国统军叶悖麻、咩讹埋等领六监军司兵三十万屯泾、原北。宋
军建成永乐城后,夏兵发起急攻,宋兵大败,徐禧等将官败死。永乐城被攻陷。宋
士兵、民夫损失近二十万。夏国取得重大的胜利。
  夏国连年对宋战争,停止贸易,对夏国经济带来了损害,物价上涨,财政困
乏。横山一带,农民因战争也不能耕作。梁氏当权,拥护皇族的将领不服,夏国的
统治长期不能稳定。一○八三年闰六月,梁太后又和梁乙埋等谋划,让惠宗秉常恢
复了皇位。
  惠宗复位,随即向宋朝上表谈和,并表请宋朝恢复夏国的旧疆,即把战争中占
去的地区退还给夏国。宋朝不许。
一○八四年初,惠宗发兵八十万围攻兰州,不能攻下,只好退兵。四月,都统军叶
悻麻、副统军咩讹埋又领兵攻安远寨,兵败战死。十月,监军仁多唆丁进攻泾原,
又在静边寨战死。夏国连续进攻不胜,损失甚重。

四、依附金朝和疆域的扩展

  一一一五年,女真族奴隶主的总首领金太祖阿骨打在黑龙江畔建立了全国。我
国的北方从而发生了急剧的变动。新兴的金国展开大规模的对外侵掠,先后消灭了
辽朝和北宋。宋王朝逃到江南。在这个剧烈的变动中,地处西北的夏国依附金国,
扩展了自己的领域。
  一一二○年,金太祖阿骨打攻陷辽上京。金宋约定:金兵迸取辽中京,宋兵攻
取燕京。一一二一年,夏崇宗遣使匣去辽,请求先出兵攻取宋地。辽天祚帝不许。
一一二二年春,金兵攻陷辽中京,进围西京。夏崇宗派兵五千援辽。夏兵未到,西
京已被金攻破。辽天柞帝逃入阴山。五月,夏崇宗派大将李良辅领兵三万援助天祚
帝。夏军至天德军遇金兵数万骑,李良辅击败金兵。六月,李良辅进军宜水。金完
颜娄室、斡鲁军来战,夏兵大败。一一二三年,夏崇宗再发兵救辽,被金兵阻道,
不能前进。辽天祚帝逃往云年。夏崇宗遣使臣迎天祚帝入夏国,金兵陷云内,天祚
帝又逃入夹山。
  辽朝将亡,金将斡离不写信给夏崇宗,说辽国已亡,如辽天祚帝去西夏,擒送
给金,金朝当割地给夏作酬赏。元德六年(一一二四年)正月,夏崇宗奉表降金,
金朝把原属辽朝的西北地带,阴山以南吐禄泊以西之地割让给夏国。三月,夏国向
金上誓表,愿按事辽的旧例事金。金太祖赐夏誓诏,视如藩国。次年辽亡,辽成安
公主在夏国绝食死。
  一一二六年三月,夏崇宗依照金朝割地的许诺,进兵攻占天德、云内、武州及
河东八馆地带。四月,又攻下宋边地的震威城(距府州三百里),杀宋知州朱昭。
  九月,夏国又出兵攻占兰州东北的宋西安州。随后又攻破宋麟州建宁寨,又破
平夏城怀德军,并进攻天都、兰州诸堡,掳掠人畜而去。夏国在金兵侵宋的时机,
乘虚而入,宋朝在夏国边境设下的城堡陆续被夏国攻破了。
  夏国攻下天德,云内等州后不久,又被金完颜宗弼浑占去。夏向金质问。一一
二七年三月,金朝又把陕西北部地割给夏国,以河为界,以抵偿天德、云内。金、
夏在陕西划定分界,确定了夏国的领域。
  一一三六年七月,夏崇宗出兵攻占乐州和西宁州。一一三七年,金朝又接受夏
国的请求,把乐州和积石州、廓州等三州地割给夏国。夏国不断扩展自己的领域,
疆土的广阔为建国以来所未有。