The world’s top-ranked test bowler claimed three for 30 and part-time spinner JP Duminy picked up three for 27 to peg back Bangladesh after they appeared to be cruising at 180 for three with skipper Mushfiqur Rahim (65) leading from the front.
Nasir Hossain was 13 not out when stumps were drawn immediately after Steyn had bowled Mohammad Shahid.
Steyn reached his personal milestone in the fifth over of the day when opener Tamim Iqbal (6) edged him to Hashim Amla at first slip after the hosts opted to bat first at the Shere Bangla National Stadium.
The paceman, winning his 80th cap, joined compatriot Shaun Pollock (421) in the 400-wicket club.
On a high after winning the ODI series against South Africa and holding them to a rain-affected draw in the first match of the two-test series, Bangladesh fought back well from the early loss of Iqbal.
Imrul Kayes (30) and Mominul Haque (40) put on 69 for the second wicket and looked largely unperturbed by the firepower of the world’s top-ranked test team.
Hit on the helmet by a Morne Morkel delivery, Haque shrugged off the blow to hit six boundaries in a fluent knock before Duminy struck twice.
The off-spinner induced an edge from Haque in his second over and Dane Vilas, making his debut as a replacement for Quinton de Kock behind the stumps, took the catch.
Duminy then trapped Kayes leg before in his next over as Bangladesh slid to 86 for three.
Mushfiqur and Mahmudullah (35) added 94 for the fourth wicket to consolidate Bangladesh’s position on a slow, dry track.
However, once Mushfiqur fell to Dean Elgar after bringing up his 15th test fifty, the home side collapsed by losing four wickets for 31 runs.
(Reporting by Amlan Chakraborty, editing by Tony Jimenez)