Bangladesh will need 354 runs to win the 2nd match against South Africa at Boland Park in Paarl on Wednesday to stay alive in the three-match series.
Sent in to bat first, the Proteas scored 353 for 6 in 50 overs with AB de Villiers making century of 176 off 104 balls, including 15 boundaries and seven sixes.
Villiers was caught by Sabbir Rahman off pace bowler Rubel Hossain at 343/4 in 47.4 overs after sharing 117 off 11.4 overs in the 4th wicket stand with Jean-Paul Duminy following another worthy partnership of 136 off 18 overs with opener Hashim Amla in the 3rd pair.
Rubel got his form back in the match as he scalped four-for -- Villiers, Duminy, Amla and Dane Paterson -- for 62 runs in 10 overs.
Rubel denied Amla back-to-back century dismissing the South Africa's opener at 226/3 in the 36th over.
Amla, who hit unbeaten century of 110 runs in the 1st ODI, was caught behind by keeper Mushfiqur Rahim scoring 85 off 92 balls, including four boundaries.
Star all-rounder Shakib Al Hasan took two quick wickets for Bangladesh when hosts South Africa were on 90 in the 18th over.
Shakib made the 1st breakthrough trapping Quinton de Kock by lbw to break the opening pair of 90 in 17.3 overs and then bowled out skipper Faf du Plessis for duck on the same collection in the last ball of the 18th over. Shakib conceded 60 runs for two wickets in 10 overs.
Kock was out for 46 off 61 balls, including one boundary, while Duminy scored run-a-ball 30 to be another double digit scorer for the side.
Imrul Kayes gave a life to Duminy in 44.3 overs dropping an easy catch at point off skipper Mashrafe Bin Mortaza's full delivery at leg stump at 290/3.