I run several sites off one set of core files using symbolic links. When a core update is released I am not always able to FTP. This script also allows the user to run multiple cron using the public cron link.

File System Setup

Some Directory to hold all of the files (Site Update)
-Settings (file folder)
-CoreSettings.php (Code Below)
-CronSites.php (Code Below)
-Temp (File Folder)
-index.php (code Below)

CoreSettings.php

<?php
//Specify the location of the root directory of drupal relative to the index.php. Example ../../DrupalRoot. You must use the ../ for this.
$DrupalRoot = ' '; 
?>

CronSites.php

<?php
//Set the websites that need to have a cron task run
$sites = array();
$sites[] = ' '; 
$sites[] = ' ';
$sites[] = ' ';
?>

index.php

<?php
$username = "admin"; //This is disabled see the code at the end of the script
$password = "admin";
$nonsense = "supercalifragilisticexpialidocious";

if (isset($_COOKIE['PrivatePageLogin'])) {
   if ($_COOKIE['PrivatePageLogin'] == md5($password.$nonsense)) {

?>
<html>
	<head>
		<title>Update Drupal Core PHP</title>
	</head>
	<body>
	</body>
    <center> 
    <form>
    <input type="button" value="Update the Drupal Core" onClick="window.location.href='index.php?s=runcore'">
	<input type="button" value="Run Cron on Multiple Sites" onClick="window.location.href='index.php?s=runcron'">
    </form>
    
<?php

//Set Settings
include ('Settings/CronSites.php');
include ('Settings/CoreSettings.php');

//Set Error reporting
error_reporting(0); 


//Find out what is going to happen
$Status = $_GET['s'];

$RunCron = 'runcron';
$RunCore = 'runcore';
$Step2 = 'step2';
$load = 'load';
$Done = 'done';

 //Get XML Data for Core and get the most up to date version info
	 file_put_contents("DrupalCore.xml", fopen("http://updates.drupal.org/release-history/drupal/7.x/index.xml", 'r'));
	
	$doc = new DOMDocument;
	$doc->load("DrupalCore.xml");

	$doc2 = $doc->getElementsByTagName('release')->item(0)->nodeValue;
	
	echo "Current Drupal Version: "; echo $doc3 = substr($doc2,0,14);
	echo "<br />";
	echo "<br />";
	//Current Drupal Version DL Link and some other important strings
	$doc3 = substr($doc2,99,48); 
	$doc4 = "$doc3.zip";
	$doc5 = substr($doc3,37,11); 

//Run Cron
if ($Status == $RunCron ) {
	
    //Run the Cron Tasks
    shuffle($sites);
    $ch = curl_init();
    foreach ($sites as $site) {
      curl_setopt($ch, CURLOPT_URL, $site); 
       curl_exec($ch);
      }
	  
     curl_close($ch);
    echo "<script>window.location = 'index.php?s=done'</script>";

//Core Update   
} elseif($Status == $RunCore ) {
	
    //Run Update
	$myDate = date('m.d.Y');

	if (!file_exists("$DrupalRoot/old.$myDate")) {
		mkdir("$DrupalRoot/old.$myDate", 0755, true);
	}
	
  
	//List all of the directories to be copied
	$src = "$DrupalRoot/includes";
	$src2 = "$DrupalRoot/misc";
	$src3 = "$DrupalRoot/modules";
	$src4 = "$DrupalRoot/profiles";
	$src5 = "$DrupalRoot/scripts";
	$src6 = "$DrupalRoot/themes";
	$src7 = "$DrupalRoot/authorize.php";
	$src8 = "$DrupalRoot/cron.php";
	$src9 = "$DrupalRoot/index.php";
	$src10 = "$DrupalRoot/update.php";
	$src11 = "$DrupalRoot/web.config";
	$src12 = "$DrupalRoot/xmlrpc.php";
	$src13 = "$DrupalRoot/CHANGELOG.txt";
	
	//Copy to Old Directory for safe keeping
	$dest = "$DrupalRoot/old.$myDate";

	shell_exec("cp -r $src $dest");
	shell_exec("cp -r $src2 $dest");
	shell_exec("cp -r $src3 $dest");
	shell_exec("cp -r $src4 $dest");
	shell_exec("cp -r $src5 $dest");
	shell_exec("cp -r $src6 $dest");
	shell_exec("cp -r $src7 $dest");
	shell_exec("cp -r $src8 $dest");
	shell_exec("cp -r $src9 $dest");
	shell_exec("cp -r $src10 $dest");
	shell_exec("cp -r $src11 $dest");
	shell_exec("cp -r $src12 $dest");
	shell_exec("cp -r $src13 $dest");
	echo "<H3>Copy Paste completed!</H3>"; //output when done

	//remove the old files and directories
	shell_exec("rm -rf $src");
	shell_exec("rm -rf $src2");
	shell_exec("rm -rf $src3");
	shell_exec("rm -rf $src4");
	shell_exec("rm -rf $src5");
	shell_exec("rm -rf $src6");
	shell_exec("rm -rf $src7");
	shell_exec("rm -rf $src8");
	shell_exec("rm -rf $src9");
	shell_exec("rm -rf $src10");
	shell_exec("rm -rf $src11");
	shell_exec("rm -rf $src12");
	shell_exec("rm -rf $src13");
	
	echo "<H3>Old Files Deleted!</H3>"; //output when done

	//Open Drupal Zip File
	file_put_contents("Tmpfile.zip", fopen($doc4, 'r'));

	$zip = new ZipArchive;
	$res = $zip->open('Tmpfile.zip');
	if ($res === TRUE) {
		$zip->extractTo('Temp/');
		$zip->close();
		echo "<H3>Drupal Zip Extracted</H3>";
		echo"<input type=\"button\" value=\"Copy New Core Files\" onClick=\"window.location.href='index.php?s=step2'\">";
	} else {
	echo "<H3>Drupal Zip Not Extracted</H3>";
	}

	shell_exec("rm -rf Tmpfile.zip");
	

	
	
	//Step 2   
} elseif ($Status == $Step2) {
	//Allow System to Find all files, DO not change this or the rest will not work
	sleep(10);
    
	//Move Drupal files into place

	$src2 = "Temp/$doc5/includes";
	$src22 = "Temp/$doc5/misc";
	$src23 = "Temp/$doc5/modules";
	$src24 = "Temp/$doc5/profiles";
	$src25 = "Temp/$doc5/scripts";
	$src26 = "Temp/$doc5/themes";
	$src27 = "Temp/$doc5/authorize.php";
	$src28 = "Temp/$doc5/cron.php";
	$src29 = "Temp/$doc5/index.php";
	$src210 = "Temp/$doc5/update.php";
	$src211 = "Temp/$doc5/web.config";
	$src212 = "Temp/$doc5/xmlrpc.php";
	$src213 = "Temp/$doc5/CHANGELOG.txt";
	
	//Copy to active drupal directory
	$dest2 = "$DrupalRoot/";

	shell_exec("cp -r $src2 $dest2");
	shell_exec("cp -r $src22 $dest2");
	shell_exec("cp -r $src23 $dest2");
	shell_exec("cp -r $src24 $dest2");
	shell_exec("cp -r $src25 $dest2");
	shell_exec("cp -r $src26 $dest2");
	shell_exec("cp -r $src27 $dest2");
	shell_exec("cp -r $src28 $dest2");
	shell_exec("cp -r $src29 $dest2");
	shell_exec("cp -r $src210 $dest2");
	shell_exec("cp -r $src211 $dest2");
	shell_exec("cp -r $src212 $dest2");
	shell_exec("cp -r $src213 $dest2");
	
	echo "<H3>New Drupal upload completed!</H3>"; //output when done
	
	//clean up
	$srcf = "Temp/drupal-7.31";
	shell_exec("rm -rf $srcf");
	
	echo"<input type=\"button\" value=\"Return Home\" onClick=\"window.location.href='index.php?s=load'\">";
	
//Something Else     
} elseif ($Status == $load) {
    echo "<script type='text/javascript'>alert('Warning: Updating can take a while to run! Do NOT Refresh!');</script>";
	
	//Check Installed Drupal Version
	echo " Currently Installed Drupal Version: "; echo file_get_contents("$DrupalRoot/CHANGELOG.txt",null,null,0,12);
	echo "<br />";
	echo "<br />";
	
	//echo $doc5; get current version as string
	echo "<br />";
	echo "<br />";
	
	echo $doc4; //Shows the must recent release of the drupal core
	echo "<br />";
	echo "<br />";
	echo "Current Drupal Root Directory: "; echo $DrupalRoot;
	echo "<br />";
	
    echo "<br />Cron Site List:";
    echo "<br />";
  
	
    foreach ($sites as $site)
{
    echo "<br />" . $site;
    echo "<br />";
}


} elseif ($Status == $Done) {
   echo "<script type='text/javascript'>alert('All Cron Shouled Have Ran!');</script>";
    echo "<br />Cron Site List:";
    echo "<br />";
    
    foreach ($sites as $site)
{
    echo "<br />" . $site;
    echo "<br />";
}

//Nothing    
} else {

    
}

?>

</center>
</html>
      
<?php
  exit;
   } else {
      echo "Bad Cookie.";
      exit;
   }
}

if (isset($_GET['p']) && $_GET['p'] == "login") {
   if ($_POST['user'] != $username) {
      echo "Sorry, that username does not match.";
      exit;
   } else if ($_POST['keypass'] != $password) {
      echo "Sorry, that password does not match.";
      exit;
   } else if ($_POST['user'] == $username && $_POST['keypass'] == $password) {
      setcookie('PrivatePageLogin', md5($_POST['keypass'].$nonsense));
      header("Location: $_SERVER[PHP_SELF]?s=load");
   } else {
      echo "Sorry, you could not be logged in at this time.";
   }
}
?>

<center>
<head>
<title>Multiple Drupal Manager</title>
</head>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>?p=login" method="post">
<label><input type="hidden" name="user" id="user" value="admin" /></label><br />
<label>Auth<input type="password" name="keypass" id="keypass" /></label><br />
<input type="submit" id="submit" value="Login" />
</form></center>

What the script does after the update core button is clicked
-Copies the directories that would be deleted for an update to a folder titled "Old" + The current date
-Deletes non essential directories
-Downloads must up to date core and unzips in the Temp directory

Then when the "Copy New Core Files" is clicked
-Script Copies new essential core files
-Deletes the Drupal Core in the Temp Directory

Click "Return Home"
Returns Home with updated information

**This is a beta and has worked on several tests. Please still use at your own risk.