太和三年(229年),蜀相諸葛亮第三次出兵攻魏,並佔據武都(今甘肅隴南武都區)、陰平(今甘肅文縣西北)二郡。太和四年(230年),魏明帝曹叡決定興師伐蜀。升司馬懿任大將軍、加大都督、假黃鉞,與大司馬曹真一起伐蜀。八月,魏明帝命曹真率主力由長安入子午谷,左將軍張郃出斜谷,司馬懿自荊州溯漢水出西城,將兵分三路會攻漢中。司馬懿從西城開拓道路,水陸並進,沿着沔水逆流而上,直達朐忍,攻克新豐縣,駐軍丹口,後遇大雨班師。太和五年(231年)二月,諸葛亮率軍第四次北伐魏國,包圍祁山賈嗣、魏平部,並以木牛流馬運輸糧草,曹叡派司馬懿西駐長安防禦蜀軍。司馬懿留部將費曜、戴陵率4000人守邽,自率主力西救祁山。張郃勸司馬懿分兵駐紮雍、郿兩地,以作大軍後鎮,司馬懿不同意。挺進喻麋,對戰諸葛亮。諸葛亮力挫魏軍。張郃不聽司馬懿勸告,主動出擊,“詔郃督諸將西至略陽,(諸葛)亮還保祁山,郃追至木門,與亮軍交戰,飛矢中郃右膝,薨。”青龍元年(233年),安定保塞匈奴大人胡薄居姿職等叛,司馬懿派遣胡遵等追討並破降。蜀軍退軍後,軍師杜襲、督軍薛悌都預計諸葛亮第二年麥熟時還會入侵,建議趁冬天調運糧草,解決隴右糧少問題。司馬懿認爲:“諸葛亮兩次出祁山,一次攻陳倉,都受挫而返。即使以後他還會出兵,將不再攻城,而是尋求野戰,地點必在隴東,而不會在西側。諸葛亮常以糧少爲恨,回去後必然廣積糧草,我估計沒有三年的積蓄,諸葛亮是不會貿然出兵北伐的。”
青龍二年(234年)二月,蜀相諸葛亮率軍十萬出斜谷伐魏。四月,諸葛亮至郿縣(位於今陝西寶雞),進駐渭水之南。司馬懿率軍渡渭水,背水築壘阻擊。諸將想在渭北與諸葛亮隔水相持,司馬懿說:“百姓積聚的糧秣財物都在渭南,這是必爭之地。”遂渡渭水背水紮營。當時,司馬懿屯兵渭南,郭淮估計諸葛亮一定會爭奪北原,主張先去佔領北原,司馬懿說:“如果諸葛亮跨過渭水登上北原,就可以連兵北山,斷絕隴道,震懾我朝臣民和胡人,此乃國家安危之大患。”很多人不以爲然,但司馬懿認爲如此,讓郭淮屯兵北原。不久,諸葛亮率大軍西行,諸將都認爲諸葛亮想攻西圍。郭淮則認爲,諸葛亮虛張聲勢是要讓魏軍大舉迴應,而他的目標是陽遂。夜裡,蜀軍果然進攻陽遂,因城中早有防備,諸葛亮沒能成功。五月,十萬吳軍攻魏,配合蜀軍作戰,被滿寵所拒。七月,魏明帝曹叡率兵親征,吳軍撤兵。羣臣認爲司馬懿正還在西邊和諸葛亮重兵對峙,車駕可西幸長安,魏明帝則說:“孫權大軍已經撤回,諸葛亮孤軍無援、難成氣候,大將軍司馬懿足以抵擋,我沒有什麼憂慮了。”諸葛亮東進的道路受阻於司馬懿,從渭水前進,又有郭淮阻擋,於是移軍攻取大散關、隴城等地,回師進攻司馬懿。八月,司馬懿以“堅壁拒守,以逸待勞”的指示,與諸葛亮相持百餘日。諸葛亮數次挑戰,司馬懿均堅壁不出,以待其變。諸葛亮便派人給司馬懿送去婦人的服裝,欲激司馬懿出戰,司馬懿仍不出戰。爲平息部屬不滿情緒,司馬懿故意裝怒,上表請戰。曹叡不許,並派骨鯁之臣辛毗杖節來做司馬懿的軍師,以節制他的行動。諸葛亮一來挑戰,司馬懿就要帶兵出擊,辛毗杖節立於軍門,司馬懿便不出兵。蜀將姜維就對諸葛亮說:“辛毗杖節而至,司馬懿不會出戰了。”諸葛亮則說:“彼本無戰情,所以固請戰者,以示武於其衆耳。將在軍,君命有所不受,苟能制吾,豈千里而請戰邪!”
諸葛亮遂分兵屯田,做長久屯駐之準備。司馬懿的三弟司馬孚也來信問前線軍情,司馬懿回信說:“亮志大而不見機,多謀而少決,好兵而無權,雖提卒十萬,已墮吾畫中,破之必矣。”不久,諸葛亮遣使求戰,司馬懿不談軍事,問使者:“諸葛公起居飲食如何,一頓能吃多少米?”使者說:“三四升。”然後對問政事,使者說:“打二十軍棍以上的處罰,都是諸葛公自己閱批。”經過一番不經意的詢問,司馬懿對人說:“諸葛亮將要死了。”果然,諸葛亮於當月病故於五丈原軍中。蜀將秘不發喪,整軍後退。當地百姓跑來報告,司馬懿派兵追擊,蜀將楊儀返旗鳴鼓,做出回擊的樣子,司馬懿以‘窮寇莫追’收軍退回。當時有人傳:“死諸葛走生仲達”,司馬懿聽到笑說:“這是因爲我長於預測活人的事,不長於預測人的生死啊。”第二天,司馬懿到諸葛亮營壘巡視,並贊諸葛亮“天下奇才也”。青龍二年(234年)八月,諸葛亮病故於五丈原(寶雞岐山境內),享年五十四歲。歷時七年的諸葛亮北伐至此結束。蜀漢將領楊儀、魏延在撤軍後爭權,楊儀殺死魏延。司馬懿想乘機攻蜀,魏明帝未準,作罷。青龍三年(235年),司馬懿升任太尉,累增封邑。蜀將馬岱入境侵擾,司馬懿派牛金迎擊,斬蜀軍千餘人。武都氐王苻雙和強端率領其屬下六千餘人來降。
東漢末年軍閥混戰時,公孫度據有遼東。這個割據勢力對曹魏一直時叛時降,保持着半獨立的地位。公孫淵繼爲遼東太守後,對魏更加不遜。魏明帝震怒,派荊州刺史毌丘儉出任幽州刺史,時遼水大漲,毌丘儉不利而還。毌丘儉討伐受阻,使公孫淵更加得意。景初元年(237年),原魏遼東太守公孫淵背叛魏國,自立爲燕王,置列百官,定都襄平(今遼寧遼陽)。[3]公孫淵遣使南通孫權,封拜邊民,誘呼鮮卑,侵擾北方。景初二年(238年)當年正月,司馬懿率牛金、胡遵等步騎四萬,從京師出發,經孤竹,越碣石,六月,進至遼水。公孫淵急令大將軍卑衍、楊祚等人率步騎數萬,依遼水圍塹20餘里,堅壁高壘,阻擊魏軍。司馬懿採用聲東擊西之計,先在南線多張旗幟,佯攻圍塹,吸引敵軍主力,而以主力隱蔽渡過遼水,逼進敵軍的襄平本營,部將不解問其原因。司馬懿說:“敵人堅營高壘,就是想讓我們兵疲糧盡,若攻城,正中其計。古人曰,敵雖高壘,不得不與我戰者,攻其所必救也。現在他們大軍在此,老巢卻空。我直指襄平,敵軍必懼,懼而求戰,破之必矣”。接着整頓陣列前進,敵軍果然出來截擊。司馬懿對諸將說:“我之所以不攻其營,正是要等現在的局面。”於是指揮魏軍痛擊,三戰皆捷,遂乘勝進圍襄平。
當初公孫淵聞魏軍來攻,求救於孫權,孫權也出兵爲其聲援,並給公孫淵寫信:“司馬懿善用兵所向無前,深深爲賢弟感到擔憂啊。”適逢連降大雨,遼水暴漲,平地數尺,魏軍恐懼,諸將思欲遷營。司馬懿下令有敢言遷營者斬,都督令史張靜違令被斬,軍心始安。公孫淵軍乘雨出城,打柴牧馬,安然自若。魏將領請求出擊,司馬懿不允。司馬陳圭曰問司馬懿:“當年攻上庸,八路並進,晝夜不停,故能在一旬半時間裡,攻下堅城,殺了孟達。這次遠道而來,爲什麼行動卻更加緩慢?”司馬懿說:“當年孟達軍隊少而糧食能支持一年,我們的軍隊是孟達的四倍,糧食卻不足一月,以一月糧的軍隊對付有一年糧的軍隊,怎能不速戰速決?以四攻一,即使一半人傷亡,也是可行的,當時不計死傷,正是要爲有限的糧草爭取時間。而今敵兵多我軍少,敵糧少我糧多,又遇大雨,想速戰也不可能。從出兵開始,我就不擔心敵人來進攻,而是怕他們會逃跑。如今敵軍糧草將盡,我軍包圍尚未合攏,若現在搶掠牛馬,會逼他們逃走。兵者詭道,善因事變。他們憑藉人多和大水,雖然飢困,也不肯就擒。這時候更當穩住對方,不能爲得小利而把敵人嚇跑。”司馬懿將計就計,故意示弱。朝廷聽說雨大敵強,不少人請求召還司馬懿。魏明帝卻說:“司馬懿臨危制變,生擒公孫淵指日可待。”
月餘,雨停,水漸退去。魏軍完成對襄平的包圍,晝夜強攻。城內糧盡,死者甚多,其將楊祚等降。當時城中愈發震恐,公孫淵也很驚懼,八月,公孫淵派相國王建、御史大夫柳甫請求解圍,司馬懿斬殺使者,發佈檄文嚴責。公孫淵又派侍中衛演來請求定日期送人質,司馬懿拒絕人質。公孫淵欲從城南突圍,司馬懿縱兵擊破其軍,公孫淵戰死在樑水邊上。入城後,司馬懿下令屠殺十五歲以上男子七千多人,收集屍體,築造京觀。而後他又把公孫淵所任公卿以下一律斬首,殺死將軍畢盛等二千多人,收編百姓四萬戶。
司馬懿釋放了當年被公孫淵篡奪官位的公孫恭,又爲被公孫淵迫害的綸直、賈範等人修了墳墓,表彰他們的後代。下令說:“古代討伐一個國家,僅殺其中頑固兇惡的人而已。各位被公孫淵所連累的人,全部寬恕。中原人願意返回故鄉的,各隨己願。”當時司馬懿軍中有的士兵衣單寒冷,請求發給短襖,司馬懿不給,表示“襦者官物,人臣無私施也”。於是上奏朝廷,把一千多名六十歲以上的士兵解除兵役,送返回鄉。在原定一年的期限內,勝利班師。魏明帝派使者到薊去犒勞部隊,增司馬懿食昆陽縣,前後共二縣。曹魏數十年來遼東問題終於徹底解決。