A century from wicketkeeper Kyle Verreynne powered South Africa to 308 all out and a first-innings lead of 202 on Tuesday in the first Test against Bangladesh in Mirpur.
Kagiso Rabada then took two quick wickets as Bangladesh were reduced to 19-2 at tea on the second day, still needing 183 to avoid an innings defeat.
Shadman Islam was first to go, caught at short leg in the third over.
Three balls later, Mominul Haque edged and Wiaan Mulder took a sharp catch at third slip.
Verreynne was last man out in South Africa’s first innings after scoring eight fours and two sixes in his 114.
He put on 119 for the seventh wicket with Mulder, who made 54, in reply to Bangladesh’s first innings of 106.
It was South Africa’s highest seventh-wicket stand against Bangladesh, after the pair resumed at 140-6 at the start of play.
Dane Piedt, dismissed lbw for 32 by Mehidy Hasan Miraz, partnered Verreynne in a stand of 66 runs for the ninth wicket.
Bangladesh quick bowler Hasan Mahmud took two wickets in two balls in the 65th over, the only spot of brightness in a morning session where South Africa added 103.
A sharp delivery on off stump induced Mulder to edge to Shadman Islam at slip, then Hasan sent Keshav Maharaj’s off stump flying with a reverse-swinging delivery that ducked back late to beat the bat.
Hasan finished with 3-66 and Mehidy 2-63, finally wrapping up the innings when Verreynne was stumped after facing 144 balls.
On Monday, South Africa quick bowler Kagiso Rabada had become the fastest to reach 300 Test wickets as Bangladesh collapsed after winning the toss and choosing to bat.
Rabada reached the landmark in 11,817 balls, beating the previous best by Pakistan’s Waqar Younis of 12,602 deliveries.
Left-arm spinner Taijul Islam passed 200 Test wickets as he finished with 5-122, only the second Bangladeshi to achieve the feat after Shakib Al Hasan.
Bangladesh have never beaten South Africa in a Test and second of the two-match series begins in Chattogram on October 29.