If ssh access is available, try using
Net::SSH::Expect. You can create a object that keeps the connection open (as long as the object exists) and pipe multiple commands to the host, capturing the output, and parsing as needed. When you kill the object, the connection closes. For multiple hosts, you can use that along with
Parallel::ForkManager for multiple connections at once. At the least, read the docs to see if it fits your needs. Hope that helps.