my_cloud

This script provides a sort of "stone-age Dropbox" if you have access to a remote host running a secure shell (ssh) server. To use this script you will need a directory named cloud inside your HOME directory on the remote host. You can then copy files to (put), copy files from (get), list files in, and delete files in your cloud directory on the remote host.

Examples

me@linuxbox ~ $ my_cloud -c me@remotehost -l

Lists the files in the cloud directory on the remote host.

me@linuxbox ~ $ my_cloud -c me@remotehost -p .bashrc

Copies the file .bashrc on the local host into the cloud directory on the remote host.

me@linuxbox ~ $ my_cloud -c me@remotehost -g my_file

Copies the file my_file from the cloud directory on the remote host to the current directory on the local host.

me@linuxbox ~ $ my_cloud -c me@remotehost -d my_file

Deletes the file my_file from the cloud directory on the remote host.

Note that the script does not copy directories, only files between systems, nor does it provide syncing of one directory with another like a "real" cloud storage client.

Tip

To improve ease-of-use, you can add an alias to your .bashrc file to eliminate the need for specifying the user@host for hosts you frequently use:

alias mc_remotehost='my_cloud -c me@remotehost'

Listing

#!/bin/bash
# ---------------------------------------------------------------------------
# my_cloud - Store and retrieve files on a remote server

# Copyright 2013, William Shotts <bshotts@users.sourceforge.com>

# 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 at <http://www.gnu.org/licenses/> for
# more details.

# Prerequsites:
# my_cloud expect that remote hosts have a directory named 'cloud'
# within the user's home directory. 

# Usage:
# my_cloud -h|--help
# my_cloud -c|--cloud user@host -l|--list
# my_cloud -c|--cloud user@host -g|--get file...
# my_cloud -c|--cloud user@host -p|--put file...
# my_cloud -c|--cloud user@host -d|--delete file...

# Revision history:
# 2013-12-30  Created by new_script ver. 3.0
# ---------------------------------------------------------------------------

PROGNAME=${0##*/}
VERSION="0.1"

clean_up() { # Perform pre-exit housekeeping
  return
}

error_exit() { # Handle fatal error
  echo -e "${PROGNAME}: ${1:-"Unknown Error"}" >&2
  clean_up
  exit 1
}

graceful_exit() { # Normal exit
  clean_up
  exit
}

signal_exit() { # Handle trapped signals
  case $1 in
    INT)    error_exit "Program interrupted by user" ;;
    TERM)   echo -e "\nnew_script: Program terminated" >&2 ; graceful_exit ;;
    *)      error_exit "new_script: Terminating on unknown signal" ;;
  esac
}

usage() {
  echo -e "Usage: $PROGNAME [-h ]|[-c user@host [-l]|[-g|-p|-d file...]]"
}

help_message() {
  cat <<- _EOF_
  $PROGNAME ver. $VERSION
  Store and retrieve files on a remote server

  $(usage)

  Options:
  -h, --help              Display this help message and exit.
  -c, --cloud user@host   Remote server login, where 'user@host' 
                          is the login name and host.
  -l, --list              List files on remote server
  -g, --get file...       Get file(s) from remote server
  -p, --put file...       Put file(s) on remote server
  -d, --delete file...    Delete file(s) on remote server

_EOF_
  return
}

set_mode() {
  if [[ $mode == "empty" ]]; then
    mode=$1
  else
    error_exit "Only one mode (-l, -g, -p, -d) is allowed."
  fi
}

# Trap signals
trap "signal_exit TERM" TERM HUP
trap "signal_exit INT"  INT

# Parse command-line
mode=empty
file_list=
while [[ -n $1 ]]; do
  case $1 in
    -h | --help)    help_message; graceful_exit ;;
    -c | --cloud)   shift; user_host="$1" ;;
    -l | --list)    set_mode list ;;
    -g | --get)     set_mode get ;;
    -p | --put)     set_mode put ;;
    -d | --delete)  set_mode delete ;;
    -* | --*)       usage; error_exit "Unknown option $1" ;;
    *)  # Process arguments
        case $mode in
          get) file_list="$file_list $user_host:cloud/$1"
            ;;
          put) [[ -f "$1" ]] && file_list="$file_list $1"
            ;;
          delete) file_list="$file_list $1"
            ;;
        esac
        ;;
  esac
  shift
done

# Main logic

# quit if no remote host is specified
[[ -n "$user_host" ]] || error_exit "You must specify a user@host (-c)."
host=${user_host##*@}

case $mode in
  list )  echo -e "\n### Files on host ${host}: ###"
    ssh $user_host 'ls -lA cloud'
    ;;
  get ) echo -e "\n### Getting $file_list from host $host ###"
    scp -p $file_list .
    ;;
  put ) echo -e "\n### Putting $file_list on host $host ###"
    scp -p $file_list $user_host:cloud
    ;;
  delete ) echo -e "\n### Deleting $file_list from host $host ###"
    ssh $user_host "cd cloud && rm $file_list"
    ;;
esac
graceful_exit

© 2000-2014, William E. Shotts, Jr. Verbatim copying and distribution of this entire article is permitted in any medium, provided this copyright notice is preserved.

Linux® is a registered trademark of Linus Torvalds.