# 1 Your @cmd contains sudo, but at sudo sub you are calling sudo, so you can remove sudo from commands my @cmd = ( "ls /tmp" , "ls /var" , "ls /usr" ); # 2 You can bucle your commands and execute each of them # You need split by space your command, so system won't interpret arguments as part of the command: sub sudo { my ($label, $ssh, @cmd) = @_; foreach my $c (@cmd) { $ssh->system({stdin_data => "$sudo_passwords{$label}\n"}, 'sudo', '-Skp', '', '--', split " ",$c); } }