But rain halted India's march to victory just 10 minutes before the break as the visitors were searching for the final wicket to level the series.
The hosts still need 283 runs for victory after R Ashwin (5-42) took his second five-wicket haul to rattle the hosts' batting order.
Ishant Sharma (1-41) opened the bowling from the other end, but the spinners got into their act soon after. Amit Mishra first bowled Dinesh Chandimal (15) with a wonder-ball around his legs in the 28th over.
The hosts somehow managed to cross the 100-mark in the 30th over and were placed at 106/4 after the first hour's play.
Also Read
In the very next over, the 36th bowled by Ishant, Jehan Mubarak (0) edged the first ball he faced to second slip which India skipper Virat Kohli gleefully accepted.
In the 37th over then, Dhammika Prasad (0) stepped out of the crease and mishit one high off Ashwin, holing out to Mishra at midwicket.
Two overs later, Ashwin had his second five-wicket haul of this series when he bowled opener Dimuth Karunaratne (46 runs, 103 balls, 6 fours).
With 14 minutes to go for lunch, Mishra removed Tharindu Kaushal (5), trapping him LBW. But thereafter a sudden rain shower stopped play, forcing the umpires to call for an early lunch.
Sri Lanka lead the three-match series 1-0 after a 63-run win in the first Test at Galle. The third Test begins at the SSC in Colombo on August 28.