Bangladesh, chasing 147 for victory in the Group Two match, needed 11 runs off the last over bowled by seamer Hardik Pandya and made the perfect start as Mushfiqur Rahim (11) smashed fours off the first two balls on Thursday morning.
However, it then lost three wickets in four deliveries as a jubilant India team scraped over the line to climb to second in the table while its opponents remained bottom following a third defeat.
India, under pressure after losing to New Zealand in their opening match, was put in to bat at the start of the day and lost both openers in quick succession.
Virat Kohli (24) and Suresh Raina (30) steadied the ship by adding 50 for the third wicket but a disciplined performance by Bangladesh’s bowlers held India in check as it posted a modest total of 7 for 146.
Media player: “Space” to play, “M” to mute, “left” and “right” to seek.
VIDEO: India’s astonishing final-over win (ABC News)
The home spinners then took control with Bangladesh unable to get to grips with Raina, Ravichandran Ashwin and Ravindra Jadeja.
Ashwin struck with his second ball, removing Mohammad Mithun for 1.
Fellow opener Tamim Iqbal (35), back in the side after food poisoning, and Sabbir Rahman (26) shared a stand of 44 before both were stumped by Mahendra Singh Dhoni.
Ashwin then picked up the important wicket of Shakib Al Hasan (22) while Jadeja bowled Mashrafe Mortaza for 6.
Mahmudullah hit back with a quickfire 18 and Soumya Sarkar struck a run-a-ball 21 to haul Bangladesh within sight of victory.
However, a thrilling final over saw Mushfiqur caught at deep mid-wicket by Shikhar Dhawan.
Mahmudullah was also snapped up by Jadeja in the deep off the next ball and, needing one run to take the game into a super over, Bangladesh number 11 Mustafizur Rahman was run out by keeper Dhoni after completely missing a wide delivery.