Needing 11 from the final over and two from three balls, the Tigers lost three wickets from the final three balls.
Seven of the nine India batsmen reached double figures, but Suresh Raina's 30 was the top score in their modest 146-7 after they were asked to bat first.
The hosts' second win of the event puts them second in Group 2 but third-placed Australia have a game in hand.
India's final group match is against the Australians in Chandigarh on Sunday, while Bangladesh face the already qualified New Zealand in Kolkata a day earlier.
Bangladesh had lost all four previous T20 encounters with India but seemed destined for a famous victory that would have left all four other teams in the group bidding to join the Kiwis in the semi-finals level on two points.
Wicketkeeper Mushfiqur Rahim had hit successive deliveries in Hardik Pandya's final over to the boundary to leave them on the brink, but India prevailed as captain and wicketkeeper MS Dhoni, who had removed one glove in readiness for the final ball, ran out Mustafizur Rahman and delivered the coup de grace.
Bangladesh captain Mashrafe Mortaza: "We were on top to the last three balls. It's bad luck, we can't do anything about it.
"It's really disappointing for us. Overall, we've played well."
India spinner Ravichandran Ashwin, man of the match for his 2-20: "That's the most we've talked on a cricket field as a team. We've never got together and worried so much.
"I don't think I've got anything left. I'll go back to my room and crash."
India revived their World Twenty20 hopes with a thrilling one-run victory over Bangladesh in Bangalore.