I rewrote this from somewhere and ended up not needing it, but in case I need it in the future, here it is.
The function ssh to the remote server, issues a su and then runs the command, returning true or false depending on the return code.
function RunRemoteAsRoot($ip, $username, $password, $rootPassword, $commandString)
{
$connection = ssh2_connect($ip, 22);
if (!$connection)
return false;
if (!ssh2_auth_password($connection, $username, $password))
return false;
$stream = ssh2_shell($connection, "vanilla", null, 200);
if ($stream === false)
return false;
stream_set_blocking($stream, true);
if (fputs($stream, "su -\n") === false)
{
fclose($stream);
return false;
}
$line = "";
$output = "";
$returnCode = 1;
while (($char = fgetc($stream)) !== false)
{
$line .= $char;
if ($char != "\n")
{
if (preg_match("/Password:/", $line))
{
// Password prompt.
if (fputs($stream, "{$rootPassword}\n{$commandString}\necho [end] $?\n") === false)
{
return false;
}
$line = "";
}
else if (preg_match("/incorrect/", $line))
{
//Incorrect root password
return false;
}
}
else
{
$output .= $line;
if (preg_match("/\[end\]\s*([0-9]+)/", $line, $matches))
{
// End of command detected.
$returnCode = $matches[1];
break;
}
$line = "";
}
}
fclose($stream);
return ($returnCode == 0);
}