征南大将军岑彭,自领兵到陇地后,只在津乡驻兵,防御蜀军。津乡临近江关,蜀兵占据江关后,堵塞水陆,负隅顽抗。岑彭多次率兵前去攻打,因江关地势险要,始终没有攻下。光武帝于是派大司马吴汉,率同刘隆、臧宫、刘歆三将,调发荆州六万士兵、五千匹马抵达荆门,与岑彭会师。
岑彭曾备有战舰数十艘,水兵不下两千名。吴汉说水兵无用,只会多费粮食,准备酌量把他们遣回去。岑彭认为蜀兵势力正盛,只有靠水战才能深入。二人起了争执,特写信到洛阳,请皇上定夺。光武帝传令说:“大司马不习惯用水战,荆门之事交给岑彭。”岑彭见皇上支持自己,更加兴奋,立即下令军中,先登上浮桥者,必有重赏。俗语说得好,重赏之下,必有勇夫。偏将鲁奇应征前往,鼓棹直上。碰巧东风猛吹,鲁奇的船队顺势向前,直逼浮桥。蜀兵瞧见后,一齐前来截击。鲁奇拼死战斗,并且令随从的士兵点燃火把,扔到桥上。那桥楼是木材修造的,一经点燃,便无法控制。浓烟烈焰挡住了蜀兵的视线,再加上岑彭等率领众舰顺风并进,所向披靡,蜀兵大乱,淹死了几千人。蜀大司徒任满被鲁奇一刀砍死。蜀南郡太守程泛,下桥逃跑,被刘隆擒获。只有蜀翼江王田戎死里逃生,回到江州。
岑彭等人进入江关,禁止士兵掳掠,沿途百姓争相归附。岑彭举荐刘隆为南郡太守,并给鲁奇记下首功。光武帝依从岑彭的建议,并封岑彭为益州牧守。岑彭进军江州,探知城内有很多粮草,料想不容易攻下,便只留偏将冯骏围攻,自己领兵直指垫江,攻破平曲,取得粮米数十万斛,分给各军。大司马吴汉攻克夷陵,筹备数百艘船只,随后进发。护军中郎将来歙、虎牙大将军盖延等,也领兵进入蜀地。公孙述封王元为大将军,让他带领环安屯兵河池。凑巧来歙、盖延杀到,蜀军大败,王元与环安狼狈逃回。来歙等捣破下辨城,继续领兵前进,走到夜深时,才安营住下。不料黎明时分,来歙忽然觉得身上奇痛无比,慌忙用手捂胸,感觉胸膛上有东西。仔细一看,竟是一把亮晃晃的匕首,匕首已经插入胸前,血流不止。盖延听说后,飞奔过来,见来歙遭到毒手,不禁潸潸泪下。来歙叱责盖延:“虎牙为何这样呢!今天我被刺客所伤,无法报国,所以叫你来嘱咐军事,你反而在这里哭泣,成何体统!”盖延勉强忍住眼泪,仔细听从来歙的遗命。来歙让从吏取来纸和笔,动手写信。写到最后一句时,实在耐忍不住,就把笔扔去,抽出胸口的匕首,大叫一声,气绝身亡。盖延痛哭一场,替他棺殓,立即派人拿着来歙的书信,上奏朝廷。光武帝看到书信后,痛哭流涕,追封来歙为征羌侯,赐谥节侯。另派扬武将军兼天水太守马成接任,然后部署六军,亲自征伐蜀地。公孙述听说御驾亲征,急忙派部将王元、延岑、吕鲔、公孙恢等人,屯兵广汉及资中要塞,又派侯丹率领两万多人,防守黄石。岑彭令臧宫领兵五万,从涪水到平曲截住延岑,自己领兵到江州袭击侯丹,出其不意地把他赶走。然后又快速行军,日夜不停,走了两千多里,直抵武阳。
武阳守吏已经逃走,只留下一座空城,被岑彭占住。岑彭再派精兵攻打广都,势如破竹,无人敢挡。公孙述在成都,以为汉兵还在平曲,离他很远。不料岑彭从黄石进兵,几天就到了广都。公孙述不禁惊慌万分,把手杖扔在地上,跺着脚大呼:“汉军如此迅速,莫非是神兵不成?”说完,立即招募兵马防守广都,并让延岑等率兵回来支援。延岑正屯兵沅水,与臧宫相持不下。臧宫因兵多粮少,正进退两难,恰逢光武帝派人给岑彭营中送去战马七百多匹。臧宫得到这个消息后,急中生智,假传诏令,截住这七百匹马,让骑兵骑着马,举着旗,登山大喊。然后亲自指挥战船,逆流而上,两岸夹着步兵、骑兵,逼近蜀营。延岑刚接到成都的警报,忐忑不安,又见汉军水陆夹攻,更加惊慌。登高远望,对面山上又有许多骑兵从高处冲下,不知道有多少兵马。蜀兵见大势不妙,回头就跑,延岑也急忙逃奔。臧宫从后面追击,蜀兵怎敢还手?只管向前奔跑。逃得越快,死得越多,所有粮草,都送给了汉军。
延岑带着数十个骑兵逃回成都。臧宫来到平阳乡,收得降兵十万多人。就连一向主战的王元,此时也束手无策,只得率兵投降。光武帝连得捷报,认为不必亲自前往,下令返回都城。忽然有急报传来,说征南大将军舞阴侯岑彭,被公孙述派人刺死。岑彭治军有方,光武帝满心盼望他能扫平成都,突然听说他被刺死,当然悲伤,就将邛谷王任贵进献的东西全部赐给岑彭的妻子,并赐岑彭谥曰壮侯,然后令大司马吴汉即日进军讨伐。吴汉接到诏令,便从夷陵出发,率三万人来到鱼涪津。公孙述已派魏党、公孙永在津口坚守。吴汉指挥将士,一鼓作气,将他击退,乘胜围攻武阳。公孙述的女婿史兴前来支援,被痛击一阵,史兴只身逃跑。
光武帝令吴汉直取广都。吴汉奉命捣入广都城,守兵全部逃跑。光武帝虽然多次得到捷报,但还担心成都兵马太多,难免有一番打斗,于是招降公孙述。公孙述却没有投降的意思,甚至江州被冯骏所夺、田戎已被擒去,他还想坚持到底,不肯回头。光武帝见公孙述不肯投降,又传话给吴汉:“成都虽然被围,但守兵还有十多万,不可轻敌!你坚守广都,不要与他争锋,等他走投无路,再去攻击,自然容易攻下!”吴汉急于邀功,不肯听从,率领武威将军刘尚,兵分两路逼近成都。然后上奏朝廷,讲述进兵的情况,说很快就可以攻下成都。光武帝大惊失色,连忙下令让他退回广都。只因为路途遥远,命令还没有到,吴汉已被公孙述围住,险些全军覆没。后来朝使到来,吴汉看了光武帝的信,不禁咋舌,于是留刘尚拒敌,自己领兵回到广都,并详细奏明战况。光武帝又传话说:“你回广都后,公孙述必不敢舍弃刘尚去攻打你。如果他先攻刘尚,你可以从广都赶去支援,彼此相应,公孙述必败无疑。”吴汉遵从旨意,待蜀兵前来攻打,才出去应敌。果然公孙述多次出兵都被击退,吴汉屡战屡胜,再次逼近成都。臧宫的一队人马,攻绵竹、破涪城、斩公孙恢,长驱直入,与吴汉在成都城下会师。
公孙述不知所措,慌忙召来汝宁王延岑,向他问计。延岑回答说:“男儿应当死中求生,怎能束手待毙?如今只有决一死战。”公孙述于是取出财物,招募死士五千人,作为前锋,让延岑统领士兵,随后跟上。一声号令,众人一齐冲出,如疯狗一般,逢人便咬。吴汉见敌兵来势凶猛,立即领军后退,在市桥中拣一块空地,严阵以待。延岑令前锋挑战,自己暗率部众绕到吴汉背后袭击。吴汉顾前不顾后,被延岑冲破后队,搅乱阵势。汉军腹背受敌,当然溃散。好在臧宫率部下支援,蜀兵才知难而退。吴汉检查士兵,只丧失一千多人,不过粮食已经快吃完了,于是命令部下暗中准备船只,打算伺机回去。
谒者张堪奉命到军中慰劳,输送钱帛,在途中又被封为蜀郡太守。他听说军中缺粮,吴汉有心退兵,急忙前去拜见,说公孙述就要灭亡了,不应在此时退兵。吴汉勉强听从张堪的建议,派臧宫屯兵咸门,自己在营中偃旗息鼓,故意示弱,诱使蜀兵出战。大约过了三天,公孙述亲自出战,直攻汉营,令延岑攻打臧宫,两路兵马一齐出发。延岑拼命战斗,三战三胜,臧宫几乎难以支持,忙派人向吴汉求援。吴汉与公孙述已交战半天,不分胜负,不便支援臧宫。但看见公孙述的部下面有饥色,便让护军高午、唐邯,领着一万精锐,向公孙述横扫过去。这支兵马被吴汉留在营中,专等公孙述的部下疲惫时出战。公孙述没料到还有一支生力军,连忙号召将士拦阻,然而已经来不及了。高午猛刺公孙述的胸脯,公孙述疼痛难忍,跌落马下。左右拼死相救,才将他扶到车上,逃回城中。延岑在咸门交战,得知公孙述负伤,当然惶急,急忙鸣金退回,反被臧宫追杀一阵,死伤很多。
延岑进城见公孙述时,公孙述已经晕过去两次,挨到晚上便去世了。第二天早上,延岑觉得无力抵抗,于是开城投降。吴汉进入城中,枭了公孙述的首级,传送洛阳,并将公孙氏的家族全部杀死,将延岑处斩,又把公孙述的宫室付诸一炬,这是建武十二年的事。光武帝听说吴汉屠城,派人斥责吴汉。
蜀地平定后,光武帝让吴汉等人访求当地贤人,封费贻为合浦太守。公孙述的部将程乌、李育,颇有才能,也被光武帝下诏录用。