This is a script to update a WordPress blog with the latest stable version from Subversion.

How to use:

  1. Download update-wordpress.sh.
  2. chmod u+x path/to/update-wordpress.sh
  3. path/to/update-wordpress.sh -fs ftp_server -wp /path/to/WordPress/on/FTP -ms mysql_server

Some features:

  • Works with plain /bin/sh, so it should work on any Linux / BSD distribution.
  • Flexible - There are input parameters for user names, passwords, and lots more.
  • It will ask for FTP and MySQL passwords (-FP and -MP parameters) only if these are not provided

update-wordpress.sh

 #!/bin/sh # # $Id: update-wordpress.sh 393 2008-06-19
10:29:18Z vengmark $ # # NAME # update-wordpress.sh - Update WordPress to latest
stable version. # # SYNOPSIS # update-wordpress.sh [options] # # DESCRIPTION #
Backs up the database and the most relevant files (.htaccess, robots.txt # and
wp-config.php) before updating. # # Uses instructions from #
http://codex.wordpress.org/Installing/Updating_WordPress_with_Subversion to #
get the latest stable version of WordPress and copy it to an FTP server. # # For
security reasons, the script will ask for all necessary passwords if # you don't
provide them on the command line. # # OPTIONS # -v Verbose output # -q Quiet
(non-interactive) # -fs FTP server host name (mandatory) # -wp WordPress path on
FTP server (mandatory) # -fp FTP server port # -fu FTP user # -FP FTP password #
-ms MySQL server host name (mandatory) # -mp MySQL server port # -mu MySQL user
# -MP MySQL password # -wd WordPress database name # -wv WordPress version # -b
Where to put the WordPress backup files # # BUGS # Should detect the newest
security release (i.e., highest X for versions # 2.5.X), perhaps from
http://svn.automattic.com/wordpress/tags/. # # Email bugs to victor dot engmark
at gmail dot com. Please include the # output of running this script in verbose
mode (-v). # # COPYRIGHT AND LICENSE # Copyright (C) 2008 Victor Engmark # #
This program is free software: you can redistribute it and/or modify # it under
the terms of the GNU General Public License as published by # the Free Software
Foundation, either version 3 of the License, or # (at your option) any later
version. # # This program is distributed in the hope that it will be useful, #
but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for
more details. # # You should have received a copy of the GNU General Public
License # along with this program. If not, see <http://www.gnu.org/licenses/>. #
################################################################################
# Init PATH="/usr/bin:/bin" # Hard-code values here if you don't want to provide
parameters backup_dir="${HOME}/.backup/WordPress" # FTP ftp_host= ftp_port=21
ftp_user=`whoami` # MySQL mysql_host= mysql_port=3306 mysql_user=`whoami` #
WordPress wordpress_repository=http://svn.automattic.com/wordpress/tags/
wordpress_version="2.5.1" wordpress_path= wordpress_database=wordpress
cmdname=`basename $0` #Error messages errm_unknown="Unknown error in $cmdname"
#Code 1 #Code 2 is reserved: http://www.faqs.org/docs/abs/HTML/exitcodes.html
usage="Usage: ${cmdname} [-v] [-q] -fs ftp_server -wp wordpress_path [-fp
ftp_port] [-fu ftp_user] [-FP ftp_password] -ms mysql_server [-mp mysql_port]
[-mu mysql_user] [-MP mysql_password] [-wd wordpress_database] [-wv
wordpress_version] [-b backup_dir]" #Code 3 # Process parameters until [ $# -eq
0 ] do case $1 in -v) verbose=1 shift ;; -q) quiet=1 shift ;; -fs) if [ -z "$2"
] then echo "$usage" >&2 exit 3 fi ftp_host=$2 shift 2 ;; -fp) if [ -z "$2" ]
then echo "$usage" >&2 exit 3 fi ftp_port=$2 shift 2 ;; -fu) if [ -z "$2" ] then
echo "$usage" >&2 exit 3 fi ftp_user=$2 shift 2 ;; -FP) if [ -z "$2" ] then echo
"$usage" >&2 exit 3 fi ftp_password=$2 shift 2 ;; -ms) if [ -z "$2" ] then echo
"$usage" >&2 exit 3 fi mysql_host=$2 shift 2 ;; -mp) if [ -z "$2" ] then echo
"$usage" >&2 exit 3 fi mysql_port=$2 shift 2 ;; -mu) if [ -z "$2" ] then echo
"$usage" >&2 exit 3 fi mysql_user=$2 shift 2 ;; -MP) if [ -z "$2" ] then echo
"$usage" >&2 exit 3 fi mysql_password=$2 shift 2 ;; -wp) if [ -z "$2" ] then
echo "$usage" >&2 exit 3 fi wordpress_path="${2%\/}" shift 2 ;; -wd) if [ -z
"$2" ] then echo "$usage" >&2 exit 3 fi wordpress_database=$2 shift 2 ;; -wv) if
[ -z "$2" ] then echo "$usage" >&2 exit 3 fi wordpress_version=$2 shift 2 ;; -b)
if [ -z "$2" ] then echo "$usage" >&2 exit 3 fi backup_dir="${2%\/}" shift 2 ;;
*) #Unknown parameter if [ $verbose ] then echo "Unknown parameter: $1" >&2 fi
echo "$usage" >&2 exit 3 ;; esac done # Check input values if [ ! $ftp_host ] ||
[ ! $mysql_host ] || [ ! $wordpress_path ] then echo "$usage" >&2 exit 3 fi if [
-z "$mysql_password" ] && [ $quiet ] then echo "Please provide the database
password with the \"-MP\" parameter" >&2 echo "$usage" >&2 exit 3 fi if [ -z
"$ftp_password" ] && [ $quiet ] then echo "Please provide the FTP password with
the \"-FP\" parameter" >&2 echo "$usage" >&2 exit 3 fi # Check for necessary
programs for application in bzip2 mysqldump ncftp svn do if [ ! `which
$application` ] then echo "Please install application '$application' first." >&2
error_found=1 fi done if [ $error_found ] then exit 1 fi # Build necessary
variables from input
wordpress_repository="${wordpress_repository}${wordpress_version}" # Summarize
settings if [ $verbose ] then echo "Running $cmdname at `date`." echo echo
"Backup directory: ${backup_dir}" echo echo "FTP connection:
${ftp_user}@${ftp_host}:${ftp_port}" echo "WordPress FTP path:
${wordpress_path}" echo echo "MySQL connection:
${mysql_user}@${mysql_host}:${mysql_port}" echo "WordPress database:
${wordpress_database}" echo echo "New WordPress version: ${wordpress_version}"
echo "WordPress repository: ${wordpress_repository}" echo fi clean_up() { if [
$verbose ] then echo "Cleaning up." fi rm -Rf $temp_dir } debug() { if [ -z "$1"
] then echo "debug function syntax: debug \$command_name \$error_code" clean_up
exit 1 fi if [ $2 -ne 0 ] then echo "$1 failed with error code $2." exit 1 elif
[ $verbose ] then echo "$1 succeeded." fi } if [ $verbose ] then echo "Creating
the temporary folder." fi temp_dir=`mktemp -t -d ${cmdname}.XXXXXXXXXX` || debug
"mktemp" $? if [ ! -e $backup_dir ] then if [ $verbose ] then echo "Creating the
backup folder." fi mkdir -p $backup_dir debug "mkdir" $? fi # Back up database
if [ -z "$mysql_password" ] then echo -n "Enter MySQL password: " stty -echo
read mysql_password stty echo echo fi # Enable showing the string to the user
before executing dummy_password=PASSWORD mysqldump_command="mysqldump
--host=$mysql_host --opt --password="$dummy_password" --port=$mysql_port
--user=$mysql_user $(if [ $verbose ]; then echo '-v'; fi;)
--result-file=${backup_dir}/WordPress.sql $wordpress_database" if [ $verbose ]
then echo "MySQLdump command:\n$mysqldump_command" fi mysqldump_command=$(echo
$mysqldump_command | sed "s/${dummy_password}/${mysql_password}/") # Insert
password in command # Run backup $mysqldump_command debug "mysqldump" $? #
Download latest stable WordPress release svn_dir=${temp_dir}/svn
svn_command="svn export $(if [ ! $verbose ]; then echo '--quiet'; fi;)
$wordpress_repository $svn_dir" if [ $verbose ] then echo "Subversion
command:\n$svn_command" fi $svn_command debug "svn" $? # Back up user files if [
-z "$ftp_password" ] then echo -n "Enter FTP password: " stty -echo read
ftp_password stty echo echo fi ncftp <<EOD open -u "$ftp_user" -p
"$ftp_password" -P $ftp_port "$ftp_host" lcd $backup_dir cd $wordpress_path get
.htaccess get robots.txt get wp-config.php lmkdir wp-content lcd wp-content
lmkdir uploads lcd uploads cd wp-content/uploads get -R * quit EOD debug "ncftp"
$? # Make sure the site is ready to update if [ ! $quiet ] then echo -n "Please
deactivate all your WordPress plugins, then press Enter to continue." read dummy
fi # Update WordPress installation ncftp <<EOD open -u "$ftp_user" -p
"$ftp_password" -P $ftp_port "$ftp_host" lcd $svn_dir cd $wordpress_path put -R
* quit EOD debug "ncftp" $? echo "Backup and update finished. To complete the
installation, please go to the upgrade page (e.g.,
http://example.com/wordpress/wp-admin/upgrade.php)" clean_up # End if [ $verbose
] then echo "${cmdname} completed at `date`." fi exit 0