After the score was tied at 5 at the end of the regulation seven innings for doubleheaders, Billy Hamilton scored on a sacrifice fly by José Abreu to give the Sox a 6-5 lead in the eighth.
Eaton, who missed the four-game series against the Baltimore Orioles while recovering from right hamstring tightness, followed a Yermín Mercedes walk with his fifth home run of the season against reliever James Karinchak.
Cleveland scored once in the bottom of the eighth before Aaron Bummer struck out Yu Chang for the final out to give the Sox their seventh win in eight games.
Home runs were the story early. Sox starter Carlos Rodón surrendered two homers in his first four pitches. César Hernández homered to left on the first pitch. Amed Rosario made it 2-0 with a home run to left on a 1-1 count.
The Sox responded quickly with four runs in the second.
They loaded the bases with one out for Zack Collins, who doubled to right. Mercedes and Eaton scored easily and second baseman Hernández bobbled the relay throw, allowing Leury García to score on the error for a 3-2 Sox lead.
Collins went to third on a groundout. Tim Anderson walked and got picked off, but he was in a rundown long enough to allow Collins to score to make it 4-2.
Hernández hit his second home run of the game in the third. Josh Naylor singled with two outs in the fourth and scored when Chang doubled over Eaton’s head in right to tie the score at 4.
Cleveland starter Triston McKenzie struck out eight consecutive Sox starting with the final out of the third. Yoán Moncada snapped the streak with a single to right with one out in the sixth. Moncada eventually scored on a fielder’s choice.
Cleveland tied it again in the sixth when Bradley Zimmer beat Anderson’s throw to first for a run-scoring infield hit. Rodón allowed five runs on nine hits with eight strikeouts and one walk in six innings.
Eaton had two hits as the Sox extended their lead in the American League Central to 4 1/2 games over second-place Cleveland.