然孙恩部众终究只是乌合之众,短短三四个月,刘牢之成功渡江,孙恩被逼率其所虏略的二十多万民众撤回海岛。
但第二年,孙恩再次率部众攻浃口,入余姚,破上虞,抵山阴县北面的邢浦。
可是被谢琰参军刘宣之击退,不久再度进军邢浦,并逼近会稽,守城的谢琰出战,却不料战死。
谢琰身为谢安次子,乃东晋顶级高门之后,战死的消息传至建康,朝野震惊。
愤怒的谢氏强行要求朝廷出兵平叛,不然自己轻往。
司马元显恰好想要拉拢谢氏,便派重兵前往镇压,遣桓不才、孙无终和高雅之领兵往之。
几个月后,孙恩在余姚大败高雅之,但刘牢之及后却再次击败孙恩。
孙恩被迫再度逃入海岛。
司马元显本以为孙恩之乱就此平复。
不料,第二年,孙恩第三次从海岛登陆,又一次攻破浃口,转进句章。
这一次因为被刘牢之提前预判,久久不能攻克,最终撤回海岛。
同年,孙恩四度登陆,这次转攻海盐,不料被刘牢之麾下参军刘裕击退。
不甘心的孙恩又想要夜袭,又被刘裕识破击败,只得转攻吴国内史袁山松守的沪渎。
之后一路高歌猛进,进至京口,图取东晋京师建康。
这时,控制了东晋西面的桓玄趁机声称勤王起兵,实则想要以兵上洛,被司马元显多次拒绝。
好在刘裕在丹徒以少胜多,大败孙恩,大量孙恩部众堕海或堕崖,令孙恩狼狈登船逃走。
没了孙恩的威胁,司马元显立即下诏命桓玄解严。
不过桓玄趁着这段时间,大量进行军事调动,更建立了武宁郡和绥安郡,分别安置迁徙的蛮族以及招集的流民。
完全控制了江州及其以西的所有晋土,并对东面实施了战略封锁,完全阻断了长江中上游,对建康的漕运,使得东土陷入饥乏。
这时候,孙恩再度出海,重整兵力再进建康,这次因为重兵都在西面,防备桓玄,所以司马元显亲自率兵拒战,却屡战不利。
好在豫州刺史司马尚之援救及时,孙恩乘虚掩袭建康的图谋失败,于是至新洲后就撤退,北走郁州。
随后,孙恩在郁州曾击败来攻的高雅之并俘虏他。
然及后又遇到前来讨伐的刘裕部,多场战事后孙恩大败,实力锐减,于是一路连战连败,沿海南逃,直至遁入大海,凭借船坚之利,返回海岛。
得到朝廷大军东去,特别是最精锐的北府军都被调去讨伐孙恩,中枢空虚。
桓玄立即亲自率兵东下,起初还担心自己抗拒朝命,害怕手下士兵都不会为他所用。
然而过了寻阳仍未见朝廷军队,于是十分高兴,士气亦上升,移檄上奏司马元显之罪。
之后,又于姑孰击败了司马尚之,夺取了历阳,距离建康仅仅十多里。
恐惧之下的司马元显害怕被桓玄瓮中捉鳖,于是登上海船,做出随时跑路的准备。
另一面又急调北府军前来抵抗。
而此时掌控北府军的刘牢之担忧自己击败桓玄后,出现狡兔死走狗烹,将会不容于司马元显,竟与其手下北府军向桓玄投降。