孙恩初起于隆安三年(公元399年)十月,年底即被刘牢之、谢琰之军赶人海岛。东晋朝廷担心孙恩再度登陆,即命令谢琰率领徐州刺史府文武兼任会稽太守、都督五郡诸军事,驻守在海岸线。果然,第二年,隆安四年五月,孙恩真的再度从海岛率军朝会稽杀来。
孙恩之所以能够卷土重来,主要与刘牢之、谢琰措置失当有关。刘牢之的北府兵本来就是淮北流民,处于社会的最底层,在进入富庶的会稽等郡后,军纪很坏,当地百姓大失所望,纷纷逃往深山老林避难,郡县为之一空。谢琰都督五郡军事以后,朝廷群臣均认为,谢琰身为宰相之子,又是淝水之战的将帅之一,东土就此可以安定,谢琰本人也十分自负,但他根本不了解东晋各地尤其是经过了孙恩之变以后的东土各郡极端复杂而深刻的社会矛盾。他不仅没有采取有效措施安抚惊恐不安的百姓,反而自恃威名,不把孙恩放在心上。
谢琰手下众将纷纷建议他说∶“强贼就在近海,时刻窥探我们的虚实,寻找卷土重来的机会。我们应当采取宽大政策,分化瓦解他们,给予他们一条改过自新之路。”而谢琰却不同意,他回答道∶“苻坚百万雄师尚且在淮南送死,孙恩狼狈逃归海岛,岂能再次回来如果他胆敢再次登陆,那说明上天不会豢养贼寇,让其速死而已!”
隆安四年五月,也就是孙恩被赶回海岛三四个月以后,他再次率军杀回。这次他首先进攻浃口(浙江宁波镇海区东南甬江口),继而又攻陷了余姚(浙江余姚),接着继续向西,趁势又攻下了上虞(浙江上虞),孙恩所部一直推进到会稽郡首府山阴东北的邢浦,距离山阴仅三十五里。
谢琰命令参军刘宣之率军迎战。刘宣之初战击破了孙恩之军,孙恩向后退去。数日之后,孙恩再次进攻邢浦,上党太守张虔硕战败,孙恩所部士气大振,争先恐后地向山阴扑来。谢琰部将均建议应当持重待敌,严加防守,将水军安排在南湖,设下埋伏,以待敌人,谢琰拒不听从。孙恩军队抵达山阴城下的时候,谢琰尚未进食,他慷慨说道∶“一定要先灭了此寇,我再吃早饭!”于是,飞身上马而出。
谢琰的徐州军队还是有一定的战斗力的。广武将军桓宝担任先锋,他率军一路杀去,给予孙恩所部以迎头痛击,杀伤了很多敌人。可是,由于山阴近郊沟壑纵横,水塘边上的道路狭窄,不便于大部队穿行,谢琰的部队不能有效展开追击,只能沿着田埂鱼贯前行。而孙恩的水军却在战船上射击,将谢琰的追击部队一分为二,致使其首尾不能相顾。冲在前面的谢琰部人数渐少,在千秋亭被返身杀回的孙恩陆军击败。败退中,谢琰帐下都督张猛心生叛意,持刀从背后突然砍倒谢琰的战马,谢琰从马上掉到地上,与长子谢肇、次子谢峻均被叛军所杀,桓宝也在此战中被杀。
谢琰的死引发了普遍的恐慌∶吴兴(浙江湖州)太守庾桓担心百姓响应孙恩,将屠刀伸向了手无寸铁的百姓,诛杀了数千男女;同样恐慌的还有东晋朝堂上的司马元显,他赶紧派遣冠军将军桓不才、辅国将军孙无终、宁朔将军高雅之(刘牢之女婿)等三将率军迎敌。然而,出乎意料的是,孙恩并没有继续从陆路北上与东晋主力决战,而是转兵东南,进攻临海去了。
在接下来的数月之内,晋军由北向南推进,与孙恩多次交手。隆安四年十一月,宁朔将军高雅之在余姚与孙恩所部交战,晋军大败,几乎全军覆没,高雅之逃归山阴。东晋朝廷遂下诏任命刘牢之为镇北将军、都督会稽五郡诸军事,率领北府兵再次东征;命令吴国内史袁山松构筑沪渎垒以防备孙恩进入长江流域。
听说刘牢之率军前来,孙恩又逃入海岛之中。刘牢之驻扎在上虞,分军防守各县,命令参军刘裕率领数百人驻守在句章(宁波鄞州)。句章城是抗击孙恩登陆的最前线,但句章城池很小,城墙很低,而刘裕所部人数又少,每当孙恩从浃口进攻之时,刘裕总是身先士卒,冲在最前面,多次杀退敌人。《宋书·武帝本纪》记载,当时参与东征的各路晋军都军纪松弛,所到之处烧杀抢掠,百姓们深受其苦,只有刘裕的部队纪律严明,为百姓所爱戴。
隆安五年(公元401年)二月一日,孙恩再次从浃口出击,进攻刘裕所部据守的句章,刘裕多次击破孙恩的进攻,孙恩再度退回海上。孙恩看到无法在句章取得突破,同年三月转兵北上,直扑海盐(浙江海盐)。
发现孙恩大军北上后,刘裕率军尾随而至,在海盐旧城构筑防御工事。孙恩水军抵达海盐城外不久,即对晋军发起进攻。当时,海盐城内兵力十分薄弱,刘裕从部队中挑选出数百人组成敢死队,全部脱去铠甲,光着膀子,手中仅持短刀,大开城门,如天神一般狂呼杀出。孙恩的部队突然看到这股凶神恶煞之人,不禁心惊胆战,迟疑间,刘裕等人即杀到眼前,孙恩军个个丢盔卸甲,狼狈而逃。此战晋军斩杀了孙恩大将姚盛。
虽然多次击退孙恩的进攻,但刘裕深知敌众我寡,终难持久,他对此十分忧虑,左思右想,终于想出一条计策。一天深夜,他命令部队全部隐蔽起来,把军旗卷起,装作已经撤军的样子。第二天清晨,刘裕下令大开城门,只让几个老弱病残之人登上城墙。孙恩的士兵远远问道∶“刘裕跑哪去了?”回答∶“昨夜已经离开了。”孙恩信以为真,遂命令大部队弃船,从容登岸。刘裕趁着敌人没有防备,发起突然袭击,再次大破孙恩。
连连失利,孙恩感到无法攻下海盐,就离开海盐,继续北上,而刘裕也率领军队沿着海岸线,边追边打。刘裕临出发的时候,海盐县令鲍陋派儿子鲍嗣之率领一千由吴地人组成的军队,请求担任刘裕军的前锋。
刘裕说道∶“敌人都是精兵,吴人不会作战,如果先锋失利,肯定会连累我军,你们只用在我军后面声援。”鲍嗣之不同意。当夜,刘裕在四面八方安排了多处疑兵,每处不过几个人,携带战鼓、战旗。第二天,孙恩所部一万多人发起进攻。刚一交手,刘裕即下令各处伏兵高举战旗,擂响战鼓,敌人以为漫山遍野均是晋军,赶忙撤退。鲍嗣之率军一路追击,孙恩的士兵们跑着跑着,发现晋军人数并不多,又返身杀来,鲍嗣之被乱军所杀。刘裕且战且退,身边的士兵几乎死伤殆尽。
当时,刘裕感到自己也可能无法幸免,急中生智,猛然间,他想出了一条妙计。当他们逃到原来伏兵埋伏之处时,刘裕让大家都停下来,让他们剥下路边尸体身上的衣服,以示闲暇。追兵见状,不禁疑窦丛生,担心此地还有伏兵。看到敌人犹疑不定,刘裕下令身边的士兵返身朝敌人杀去,攻势成猛,敌人这下都确信刘裕这支部队不过是诱饵,晋军肯定有伏兵,于是就撤退了。
九死—生的刘裕,收拢被打散的部队,也撤退了。