Mahmudullah Riyad hit an unbeaten 43 to help Bangladesh edge out Sri Lanka by two wickets in a bad-tempered Twenty20 and enter the final of the tri-series in Colombo on Friday.
Chasing 160 for victory in a virtual semi-final, Mahmudullah steered the team home with a six on the penultimate ball but not before a heated exchange of words between the players of the two sides.
The Tigers will take on India in the final on Sunday.
Drama unfolded when Mustafizur Rahman missed two bouncers from Isuru Udana in the final over and was run out but the Bangladesh players contested the call, saying it was a no ball due to its height.
Skipper Sakib al Hasan looked furious on the boundary and even waved to call the batsmen back to the pavilion. But sanity prevailed at the R Premadasa Stadium and Bangladesh erupted after getting the winning runs.
It was a crucial third-wicket partnership between opener Tamim Iqbal, who made 50 off 42 balls, and Mushfiqur Rahim, who hit 28, that set up the win for the Tigers.
Mystery spinner Akila Dananjaya claimed two wickets.
Earlier Kusal Perera and Thisara Perera struck gritty half-centuries to lift the hosts to 159-7 after being put into bat first.
The left-handed pair of Kusal (61) and Thisara (58) counter-attacked after Sri Lanka were reduced to 41-5.
Pace spearhead Mustafiz claimed two wickets.
The tournament commemorates 70 years of Sri Lankan independence.
Want stories like this in your inbox?
Sign up to exclusive daily email
More Stories from South Asia