خط فرمان لینوکس

ترجمه فارسی LinuxCommand.org

خط فرمان لینوکس

ترجمه فارسی LinuxCommand.org

Dropbox عصر حجر

my_cloud

اگر شما به یک میزبان راه‌دورِ اجرا کننده یک سرویس‌دهنده پوسته امن(ssh) دسترسی دارید، این اسکریپت یک «Dropbox عصر حجر» فراهم می‌کند. برای استفاده از این اسکریپت شما به یک دایرکتوری به نام cloud در داخل دایرکتوری خانگی خود روی میزبان راه‌دور نیاز دارید. آنوقت می‌توانید فایل‌ها را به دایرکتوری cloud روی میزبان راه‌دور کپی(قرار بدهید)، از آن کپی( دریافت کنید)، فایلهای آن را لیست کرده، و یا حذف نمایید.

مثال‌ها

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

فایل‌های دایرکتوری cloud روی میزبان راه‌دور را لیست می‌کند.

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

فایل ‎.bashrc‎ روی میزبان محلی را به دایرکتوری cloud در میزبان راه‌دور کپی می‌کند.

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

فایل my_file را از دایرکتوری cloud روی میزبان راه‌دور به دایرکتوری جاری در میزبان محلی کپی می‌کند.

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

فایل my_file را از دایرکتوری cloud روی میزبان راه‌دور حذف می‌نماید.

توجه نمایید که اسکریپت فقط فایل‌ها میان سیستم‌ها رامنتقل می‌کند، نه دایرکتوری‌ها را کپی می‌کند، و نه همچون یک سرویس‌گیرنده واقعی ذخیره ابری هم‌گام سازی یک دایرکتوری با دایرکتوری دیگر را فراهم می‌کند.

نکته

برای بهبودبخشی به سهولت استفاده، می‌توانید یک مستعار به فایل ‎.bashrc‎ خودتان اضافه ‌کنید برای آنکه نیاز به مشخص کردن ‎user@host‎ جهت میزبان‌ها را که بارها استفاده می‌کنید برطرف نمایید:

alias mc_remotehost='my_cloud -c me@remotehost'
#!/bin/bash
# ---------------------------------------------------------------------------
# my_cloud - ذخیره و بازیابی فایل‌ها روی سرویس‌دهنده راه‌دور

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

#  این برنامه نرم‌افزار آزاد است: شما می‌توانید آن را تحت شرایط نگارش  
#    گنو یا به انتخاب خودتان هر نگارش پس از آن که GPL‎  شماره 3 مجوز 
#  .توسط بنیاد نرم‌افزارهای آزاد اعلام گردیده، ‏توزیع و یا ویرایش کنید‎

# این برنامه به امید آنکه سودمند باشد توزیع می‌گردد، اما بدون هرگونه‎
#  تعهد حتی تعهد ضمنی کیفیت یا صلاحیت برای یک مقصود خاص. برای جزییات 
#  .ببینید ‎(http://www.gnu.org/licenses/)‎  گنو را در GPL بیشتر مجوز‎

# 	:پیش‌نیازها
# انتظار دارد که میزبان‌های راه‌دور دارای یک دایرکتوری my_cloud
#           .در داخل دایرکتوری خانه کاربر باشند cloud  به نام 

#	 :نحوه کاربرد
# 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...

# :تاریخچه بازبینی
# 2013-12-30  ایجاد گردید new_script اسکریپت ‎3.0‎ به وسیله نگارش
# ---------------------------------------------------------------------------

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

clean_up() { # انجام خانه‌تکانی قبل از خروج
  return
}

error_exit() { # مدیریت خطای مهلک
  echo -e "${PROGNAME}: ${1:-"Unknown Error"}" >&2
  clean_up
  exit 1
}

graceful_exit() { # خروج عادی
  clean_up
  exit
}

signal_exit() { # شده trap اداره سیگنال‌های 
  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 سیگنال‌های
trap "signal_exit TERM" TERM HUP
trap "signal_exit INT"  INT

#	 تجزیه سطر فرمان
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" ;;
    *)  # پردازش شناسه‌ها
        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

# منطق اصلی

# خروج در صورتیکه میزبان راه‌دور تعیین نشده باشد
[[ -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