Sri Lanka were struggling at 56-4 after being put in to bat, but middle-order batsman Silva (107 not out) came to his team's rescue with a responsible run-a-ball knock in his first match of the series.
The series is tied at 1-1, with one game abandoned due to rain.
The 27-year-old Silva received valuable support from Tillakaratne Dilshan, Russel Arnold and Farveez Maharoof after the Indian seamers had struck early in a match reduced to 47-overs-a-side due to a damp outfield.
He put on 68 for the fifth wicket with Dilshan and 64 for the seventh with Maharoof to prop up the innings. Dilshan and Maharoof each contributed 28.
Silva, playing in only his 14th one-day international, reached his century in the last over with a four off seamer Shanthakumar Sreesanth. He struck one six and 12 fours in his well-paced hundred.
Sri Lanka were earlier rocked by Indian seamers as they lost the four early wickets, including that of hard-hitting Sanath Jayasuriya for 22.
Agarkar did the early damage, removing Jayasuriya and skipper Mahela Jayawardene (one) in successive overs. Zaheer Khan and Sreesanth then grabbed one wicket apiece to put Sri Lanka in deep trouble.
But Silva kept the Indian attack at bay with his sensible knock, once smashing off-spinner Harbhajan Singh for a six and two fours in an over.
Agarkar and Zaheer finished with two wickets apiece.
This is the last match for India and Sri Lanka before the World Cup starts in the Caribbean next month.
Sri Lanka 259 for 7 in 50 overs (Chamara Silva 107, T Dilshan 28, Faravez Maharoof 28; Agarkar 2 for 52, Zaheer 2 for 54, Sehwag 1 for 27, Ganguly 1 for 29) Vs India (yet to bat)