Celtic recovered from their midweek European frustration with a 2-1 Scottish Premiership victory over St Johnstone that should have been more comprehensive.

Neil Lennon's side had performed well in their Champions League Group H opener at San Siro on Wednesday night only to lose 2-0 to Milan but they responded with a first-half onslaught. In a one-sided opening period, the Finnish striker Teemu Pukki, making his first start for his new club, opened the scoring with a drive in the 10th minute with midfielder Charlie Mulgrew adding a second in the 26th minute with fine left-footed shot.

The second half was mostly a nonevent until St Johnstone substitute Liam Caddis, on for David Wotherspoon, bundled in a Dave MacKay cross with nine minutes remaining before another Saints replacement, Stevie May, hit the post in added time with Celtic hanging on for the final whistle.

Lennon made two changes to his side following the trip to Italy. Pukki came in for Georgios Samaras who started on the bench while the wide-man Derk Boerrigter replaced right-back Mikael Lustig, who dropped out of the squad altogether. Tommy Wright made three changes to the St Johnstone lineup that lost at home to Hibs with Brian Easton, Chris Millar and Gary McDonald in, and Tom Scobbie, Nigel Hasselbaink and May dropping to the bench and they took to the field in a Milan-style red and black kit.

The home side's domination of possession from the kick-off was almost total. Saints' 10-man defence situated themselves at the edge of their own penalty area and repelled a series of Celtic attacks.

Anthony Stokes set up the opener when he played a clever ball to Pukki inside the box and from 10 yards out the former Schalke forward drove it low between the legs of the defender Frazer Wright and the goalkeeper Alan Mannus.

An old-fashioned thrashing looked on the cards as wave after wave of green and white attacks threatened to engulf the Perth side. A sweeping move started by full-back Adam Matthews, the game's best player in the first half, ended with Pukki knocking Stokes' cross from wide on the right past the near post.

Celtic's second goal came when Saints midfielder Wotherspoon cut out a Stokes pass only for the ball to spin to Mulgrew, who set himself before drilling it low past Mannus from 25 yards. Five minutes later, with the McDiarmid Park side retreating into their penalty area as Celtic surged forward again, Mulgrew curled a shot from 25 yards just past the post before Boerrigter made a mess of a Stokes cross from six yards, knocking it wide when it appeared easier to score.

The Israel midfielder Nir Biton replaced Matthews for the start of the second half to make his home debut, with Efe Ambrose moving to right-back and Mulgrew going back to the centre of defence alongside Virgil van Dijk. Stokes fired wide from the edge of the penalty area a few minutes into the second period but the match went flat.

St Johnstone had more of the ball without looking as if they would threaten. Samaras replaced Commons on the hour mark before May came on for the Perth midfielder Murray Davidson.

As the match continued to drift aimlessly, May headed a cross from Wotherspoon over the bar with what was Saints' best chance to that point. Stokes then had a header from a Mulgrew corner cleared off the line by MacLean as Celtic looked to finish with a flourish.

However, the ending was at odds with the earlier script. In the 79th minute Celtic's under-worked keeper Fraser Forster had to make a good save from Millar after the St Johnstone midfielder had burst right through the Celtic defence. Celtic let their guard slip even further and allowed the visitors back into the game when MacKay's cross from the right was knocked in from close range by Caddis, who nipped in front of Ambrose to set up a fraught ending for the home side.

As the nerves jangled among the home support, May hit the post in injury time with a glancing header before Forster made a fine save from MacKay as the home side held out for three points that should have been secured by the interval.