Lahiru Thirimanne hit an unbeaten 48 to lead Sri Lanka's strong reply after losing their openers early against India in the rain-hit opening Test on Saturday.
Sri Lanka were 113-2 at tea on the third day with Thirimanne and Angelo Mathews, on 31, building a 79-run stand for the third wicket at Kolkata's Eden Gardens.
The visitors still trail India, who made 172 after being put into bat first, by 59 runs.
Indian seamer Bhuvneshwar Kumar struck early to remove Dimuth Karunaratne, for eight, and Sadeera Samarawickrama, for 23, as Sri Lanka slipped to 34-2 before bouncing back.
Thirimanne looked to make the hosts pay for a dropped catch at first slip by Shikhar Dhawan off paceman Umesh Yadav when the left-handed batsman was on 27.
Thirimanne, who was closing in on his fifth Test fifty before tea, and Mathews combined caution and aggression to keep a persistent Indian attack at bay.
Earlier in the first session, a late-order push by India's lower batsmen saw the hosts get past the 150-run mark, a score that looked unlikely when they were floundering at 128-8.
After overnight batsman Cheteshwar Pujara fell early on 52, vital contributions from Wriddhiman Saha (29), Ravindra Jadeja (22) and a breezy 24 from number-10 Mohammed Shami frustrated Sri Lankan bowlers.
Pace spearhead Suranga Lakmal finished with figures of 4-26 after taking three wickets on day one to justify the visitors' decision to field first.
Dinesh Chandimal's Sri Lanka, despite being underdogs against the top-ranked hosts, are eyeing their first Test win on Indian soil during the three-match series.