午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > 編寫shell腳本將VPS上的數(shù)據(jù)備份到Dropbox網(wǎng)盤的方法

編寫shell腳本將VPS上的數(shù)據(jù)備份到Dropbox網(wǎng)盤的方法

熱門標(biāo)簽:安裝外呼系統(tǒng)費用 寧波智能外呼系統(tǒng)公司 申請公司400電話要注意什么 聯(lián)通電話機器人怎么接 奧維互動地圖標(biāo)注參數(shù) 曲阜400電話辦理 衛(wèi)星地圖標(biāo)注地名 地圖標(biāo)注輻射圖案 電銷機器人 劍魚

看到有人用dropbox備份網(wǎng)站數(shù)據(jù),所以今天也試了一下,記得以前是一個python腳本,這是用的是bash 腳本,利用dropbox的api來上傳下載的,很方便,腳本的地址是Dropbox-Uploader/dropbox_uploader.sh at master · andreafabrizi/Dropbox-Uploader · GitHub ,感謝作者分享這個腳本。

可以到git下載dropbox_uploader.sh,地址為:https://github.com/andreafabrizi/Dropbox-Uploader
或者也可以直接拷貝代碼,保存為dropbox_uploader.sh,注意拷貝的時候最好是復(fù)制到文本編輯器里面,如notepad++之類的

#!/usr/bin/env bash
#
# Dropbox Uploader
#
# Copyright (C) 2010-2014 Andrea Fabrizi andrea.fabrizi@gmail.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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#

#Default configuration file
CONFIG_FILE=~/.dropbox_uploader

#Default chunk size in Mb for the upload process
#It is recommended to increase this value only if you have enough free space on your /tmp partition
#Lower values may increase the number of http requests
CHUNK_SIZE=4

#Curl location
#If not set, curl will be searched into the $PATH
#CURL_BIN="/usr/bin/curl"

#Default values
TMP_DIR="/tmp"
DEBUG=0
QUIET=0
SHOW_PROGRESSBAR=0
SKIP_EXISTING_FILES=0
ERROR_STATUS=0

#Don't edit these...
API_REQUEST_TOKEN_URL="https://api.dropbox.com/1/oauth/request_token"
API_USER_AUTH_URL="https://www2.dropbox.com/1/oauth/authorize"
API_ACCESS_TOKEN_URL="https://api.dropbox.com/1/oauth/access_token"
API_CHUNKED_UPLOAD_URL="https://api-content.dropbox.com/1/chunked_upload"
API_CHUNKED_UPLOAD_COMMIT_URL="https://api-content.dropbox.com/1/commit_chunked_upload"
API_UPLOAD_URL="https://api-content.dropbox.com/1/files_put"
API_DOWNLOAD_URL="https://api-content.dropbox.com/1/files"
API_DELETE_URL="https://api.dropbox.com/1/fileops/delete"
API_MOVE_URL="https://api.dropbox.com/1/fileops/move"
API_COPY_URL="https://api.dropbox.com/1/fileops/copy"
API_METADATA_URL="https://api.dropbox.com/1/metadata"
API_INFO_URL="https://api.dropbox.com/1/account/info"
API_MKDIR_URL="https://api.dropbox.com/1/fileops/create_folder"
API_SHARES_URL="https://api.dropbox.com/1/shares"
APP_CREATE_URL="https://www2.dropbox.com/developers/apps"
RESPONSE_FILE="$TMP_DIR/du_resp_$RANDOM"
CHUNK_FILE="$TMP_DIR/du_chunk_$RANDOM"
TEMP_FILE="$TMP_DIR/du_tmp_$RANDOM"
BIN_DEPS="sed basename date grep stat dd mkdir"
VERSION="0.14"

umask 077

#Check the shell
if [ -z "$BASH_VERSION" ]; then
  echo -e "Error: this script requires the BASH shell!"
  exit 1
fi

shopt -s nullglob #Bash allows filename patterns which match no files to expand to a null string, rather than themselves
shopt -s dotglob #Bash includes filenames beginning with a "." in the results of filename expansion

#Look for optional config file parameter
while getopts ":qpskdf:" opt; do
  case $opt in

  f)
   CONFIG_FILE=$OPTARG
  ;;

  d)
   DEBUG=1
  ;;

  q)
   QUIET=1
  ;;

  p)
   SHOW_PROGRESSBAR=1
  ;;

  k)
   CURL_ACCEPT_CERTIFICATES="-k"
  ;;

  s)
   SKIP_EXISTING_FILES=1
  ;;

  \&;)
   echo "Invalid option: -$OPTARG" >2
   exit 1
  ;;

  :)
   echo "Option -$OPTARG requires an argument." >2
   exit 1
  ;;

 esac
done

if [[ $DEBUG != 0 ]]; then
  echo $VERSION
  set -x
  RESPONSE_FILE="$TMP_DIR/du_resp_debug"
fi

if [[ $CURL_BIN == "" ]]; then
  BIN_DEPS="$BIN_DEPS curl"
  CURL_BIN="curl"
fi

#Dependencies check
which $BIN_DEPS > /dev/null
if [[ $? != 0 ]]; then
  for i in $BIN_DEPS; do
    which $i > /dev/null ||
      NOT_FOUND="$i $NOT_FOUND"
  done
  echo -e "Error: Required program could not be found: $NOT_FOUND"
  exit 1
fi

#Check if readlink is installed and supports the -m option
#It's not necessary, so no problem if it's not installed
which readlink > /dev/null
if [[ $? == 0  $(readlink -m "http://test" 2> /dev/null) == "/test" ]]; then
  HAVE_READLINK=1
else
  HAVE_READLINK=0
fi

#Forcing to use the builtin printf, if it's present, because it's better
#otherwise the external printf program will be used
#Note that the external printf command can cause character encoding issues!
builtin printf "" 2> /dev/null
if [[ $? == 0 ]]; then
  PRINTF="builtin printf"
  PRINTF_OPT="-v o"
else
  PRINTF=$(which printf)
  if [[ $? != 0 ]]; then
    echo -e "Error: Required program could not be found: printf"
  fi
  PRINTF_OPT=""
fi

#Print the message based on $QUIET variable
function print
{
  if [[ $QUIET == 0 ]]; then
	  echo -ne "$1";
  fi
}

#Returns unix timestamp
function utime
{
  echo $(date +%s)
}

#Remove temporary files
function remove_temp_files
{
  if [[ $DEBUG == 0 ]]; then
    rm -fr "$RESPONSE_FILE"
    rm -fr "$CHUNK_FILE"
    rm -fr "$TEMP_FILE"
  fi
}

#Returns the file size in bytes
# generic GNU Linux: linux-gnu
# windows cygwin:  cygwin
# raspberry pi:   linux-gnueabihf
# macosx:      darwin10.0
# freebsd:      FreeBSD
# qnap:       linux-gnueabi
# iOS:        darwin9
function file_size
{
  #Some embedded linux devices
  if [[ $OSTYPE == "linux-gnueabi" || $OSTYPE == "linux-gnu" ]]; then
    stat -c "%s" "$1"
    return

  #Generic Unix
  elif [[ ${OSTYPE:0:5} == "linux" || $OSTYPE == "cygwin" || ${OSTYPE:0:7} == "solaris" ]]; then
    stat --format="%s" "$1"
    return

  #BSD, OSX and other OSs
  else
    stat -f "%z" "$1"
    return
  fi
}

#Usage
function usage
{
  echo -e "Dropbox Uploader v$VERSION"
  echo -e "Andrea Fabrizi - andrea.fabrizi@gmail.com\n"
  echo -e "Usage: $0 COMMAND [PARAMETERS]..."
  echo -e "\nCommands:"

  echo -e "\t upload  LOCAL_FILE/DIR ...> REMOTE_FILE/DIR>"
  echo -e "\t download REMOTE_FILE/DIR> [LOCAL_FILE/DIR]"
  echo -e "\t delete  REMOTE_FILE/DIR>"
  echo -e "\t move   REMOTE_FILE/DIR> REMOTE_FILE/DIR>"
  echo -e "\t copy   REMOTE_FILE/DIR> REMOTE_FILE/DIR>"
  echo -e "\t mkdir  REMOTE_DIR>"
  echo -e "\t list   [REMOTE_DIR]"
  echo -e "\t share  REMOTE_FILE>"
  echo -e "\t info"
  echo -e "\t unlink"

  echo -e "\nOptional parameters:"
  echo -e "\t-f FILENAME> Load the configuration file from a specific file"
  echo -e "\t-s      Skip already existing files when download/upload. Default: Overwrite"
  echo -e "\t-d      Enable DEBUG mode"
  echo -e "\t-q      Quiet mode. Don't show messages"
  echo -e "\t-p      Show cURL progress meter"
  echo -e "\t-k      Doesn't check for SSL certificates (insecure)"

  echo -en "\nFor more info and examples, please see the README file.\n\n"
  remove_temp_files
  exit 1
}

#Check the curl exit code
function check_http_response
{
  CODE=$?

  #Checking curl exit code
  case $CODE in

    #OK
    0)

    ;;

    #Proxy error
    5)
      print "\nError: Couldn't resolve proxy. The given proxy host could not be resolved.\n"

      remove_temp_files
      exit 1
    ;;

    #Missing CA certificates
    60|58)
      print "\nError: cURL is not able to performs peer SSL certificate verification.\n"
      print "Please, install the default ca-certificates bundle.\n"
      print "To do this in a Debian/Ubuntu based system, try:\n"
      print " sudo apt-get install ca-certificates\n\n"
      print "If the problem persists, try to use the -k option (insecure).\n"

      remove_temp_files
      exit 1
    ;;

    6)
      print "\nError: Couldn't resolve host.\n"

      remove_temp_files
      exit 1
    ;;

    7)
      print "\nError: Couldn't connect to host.\n"

      remove_temp_files
      exit 1
    ;;

  esac

  #Checking response file for generic errors
  if grep -q "HTTP/1.1 400" "$RESPONSE_FILE"; then
    ERROR_MSG=$(sed -n -e 's/{"error": "\([^"]*\)"}/\1/p' "$RESPONSE_FILE")

    case $ERROR_MSG in
       *access?attempt?failed?because?this?app?is?not?configured?to?have*)
        echo -e "\nError: The Permission type/Access level configured doesn't match the DropBox App settings!\nPlease run \"$0 unlink\" and try again."
        exit 1
      ;;
    esac

  fi

}

#Urlencode
function urlencode
{
  local string="${1}"
  local strlen=${#string}
  local encoded=""

  for (( pos=0 ; posstrlen ; pos++ )); do
    c=${string:$pos:1}
    case "$c" in
      [-_.~a-zA-Z0-9] ) o="${c}" ;;
      * ) $PRINTF $PRINTF_OPT '%%%02x' "'$c"
    esac
    encoded+="${o}"
  done

  echo "$encoded"
}

function normalize_path
{
  path=$(echo -e "$1")
  if [[ $HAVE_READLINK == 1 ]]; then
    readlink -m "$path"
  else
    echo "$path"
  fi
}

#Check if it's a file or directory
#Returns FILE/DIR/ERR
function db_stat
{
  local FILE=$(normalize_path "$1")

  #Checking if it's a file or a directory
  $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" "$API_METADATA_URL/$ACCESS_LEVEL/$(urlencode "$FILE")?oauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOM" 2> /dev/null
  check_http_response

  #Even if the file/dir has been deleted from DropBox we receive a 200 OK response
  #So we must check if the file exists or if it has been deleted
  if grep -q "\"is_deleted\":" "$RESPONSE_FILE"; then
    local IS_DELETED=$(sed -n 's/.*"is_deleted":.\([^,]*\).*/\1/p' "$RESPONSE_FILE")
  else
    local IS_DELETED="false"
  fi

  #Exits...
  grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"
  if [[ $? == 0  $IS_DELETED != "true" ]]; then

    local IS_DIR=$(sed -n 's/^\(.*\)\"contents":.\[.*/\1/p' "$RESPONSE_FILE")

    #It's a directory
    if [[ $IS_DIR != "" ]]; then
      echo "DIR"
    #It's a file
    else
      echo "FILE"
    fi

  #Doesn't exists
  else
    echo "ERR"
  fi
}

#Generic upload wrapper around db_upload_file and db_upload_dir functions
#$1 = Local source file/dir
#$2 = Remote destination file/dir
function db_upload
{
  local SRC=$(normalize_path "$1")
  local DST=$(normalize_path "$2")

  #Checking if the file/dir exists
  if [[ ! -e $SRC  ! -d $SRC ]]; then
    print " > No such file or directory: $SRC\n"
    ERROR_STATUS=1
    return
  fi

  #Checking if the file/dir has read permissions
  if [[ ! -r $SRC ]]; then
    print " > Error reading file $SRC: permission denied\n"
    ERROR_STATUS=1
    return
  fi

  #Checking if DST it's a folder or if it doesn' exists (in this case will be the destination name)
  TYPE=$(db_stat "$DST")
  if [[ $TYPE == "DIR" ]]; then
    local filename=$(basename "$SRC")
    DST="$DST/$filename"
  fi

  #It's a directory
  if [[ -d $SRC ]]; then
    db_upload_dir "$SRC" "$DST"

  #It's a file
  elif [[ -e $SRC ]]; then
    db_upload_file "$SRC" "$DST"

  #Unsupported object...
  else
    print " > Skipping not regular file \"$SRC\"\n"
  fi
}

#Generic upload wrapper around db_chunked_upload_file and db_simple_upload_file
#The final upload function will be choosen based on the file size
#$1 = Local source file
#$2 = Remote destination file
function db_upload_file
{
  local FILE_SRC=$(normalize_path "$1")
  local FILE_DST=$(normalize_path "$2")

  shopt -s nocasematch

  #Checking not allowed file names
  basefile_dst=$(basename "$FILE_DST")
  if [[ $basefile_dst == "thumbs.db" || \

     $basefile_dst == "desktop.ini" || \

     $basefile_dst == ".ds_store" || \

     $basefile_dst == "icon\r" || \

     $basefile_dst == ".dropbox" || \

     $basefile_dst == ".dropbox.attr" \

    ]]; then
    print " > Skipping not allowed file name \"$FILE_DST\"\n"
    return
  fi

  shopt -u nocasematch

  #Checking file size
  FILE_SIZE=$(file_size "$FILE_SRC")

  #Checking if the file already exists
  TYPE=$(db_stat "$FILE_DST")
  if [[ $TYPE != "ERR"  $SKIP_EXISTING_FILES == 1 ]]; then
    print " > Skipping already existing file \"$FILE_DST\"\n"
    return
  fi

  if [[ $FILE_SIZE -gt 157286000 ]]; then
    #If the file is greater than 150Mb, the chunked_upload API will be used
    db_chunked_upload_file "$FILE_SRC" "$FILE_DST"
  else
    db_simple_upload_file "$FILE_SRC" "$FILE_DST"
  fi

}

#Simple file upload
#$1 = Local source file
#$2 = Remote destination file
function db_simple_upload_file
{
  local FILE_SRC=$(normalize_path "$1")
  local FILE_DST=$(normalize_path "$2")

  if [[ $SHOW_PROGRESSBAR == 1  $QUIET == 0 ]]; then
    CURL_PARAMETERS="--progress-bar"
    LINE_CR="\n"
  else
    CURL_PARAMETERS="-s"
    LINE_CR=""
  fi

  print " > Uploading \"$FILE_SRC\" to \"$FILE_DST\"... $LINE_CR"
  $CURL_BIN $CURL_ACCEPT_CERTIFICATES $CURL_PARAMETERS -i --globoff -o "$RESPONSE_FILE" --upload-file "$FILE_SRC" "$API_UPLOAD_URL/$ACCESS_LEVEL/$(urlencode "$FILE_DST")?oauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOM"
  check_http_response

  #Check
  if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then
    print "DONE\n"
  else
    print "FAILED\n"
    print "An error occurred requesting /upload\n"
    ERROR_STATUS=1
  fi
}

#Chunked file upload
#$1 = Local source file
#$2 = Remote destination file
function db_chunked_upload_file
{
  local FILE_SRC=$(normalize_path "$1")
  local FILE_DST=$(normalize_path "$2")

  print " > Uploading \"$FILE_SRC\" to \"$FILE_DST\""

  local FILE_SIZE=$(file_size "$FILE_SRC")
  local OFFSET=0
  local UPLOAD_ID=""
  local UPLOAD_ERROR=0
  local CHUNK_PARAMS=""

  #Uploading chunks...
  while ([[ $OFFSET != $FILE_SIZE ]]); do

    let OFFSET_MB=$OFFSET/1024/1024

    #Create the chunk
    dd if="$FILE_SRC" of="$CHUNK_FILE" bs=1048576 skip=$OFFSET_MB count=$CHUNK_SIZE 2> /dev/null

    #Only for the first request these parameters are not included
    if [[ $OFFSET != 0 ]]; then
      CHUNK_PARAMS="upload_id=$UPLOAD_IDoffset=$OFFSET"
    fi

    #Uploading the chunk...
    $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" --upload-file "$CHUNK_FILE" "$API_CHUNKED_UPLOAD_URL?$CHUNK_PARAMSoauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOM" 2> /dev/null
    check_http_response

    #Check
    if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then
      print "."
      UPLOAD_ERROR=0
      UPLOAD_ID=$(sed -n 's/.*"upload_id": *"*\([^"]*\)"*.*/\1/p' "$RESPONSE_FILE")
      OFFSET=$(sed -n 's/.*"offset": *\([^}]*\).*/\1/p' "$RESPONSE_FILE")
    else
      print "*"
      let UPLOAD_ERROR=$UPLOAD_ERROR+1

      #On error, the upload is retried for max 3 times
      if [[ $UPLOAD_ERROR -gt 2 ]]; then
        print " FAILED\n"
        print "An error occurred requesting /chunked_upload\n"
        ERROR_STATUS=1
        return
      fi
    fi

  done

  UPLOAD_ERROR=0

  #Commit the upload
  while (true); do

    $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" --data "upload_id=$UPLOAD_IDoauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOM" "$API_CHUNKED_UPLOAD_COMMIT_URL/$ACCESS_LEVEL/$(urlencode "$FILE_DST")" 2> /dev/null
    check_http_response

    #Check
    if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then
      print "."
      UPLOAD_ERROR=0
      break
    else
      print "*"
      let UPLOAD_ERROR=$UPLOAD_ERROR+1

      #On error, the commit is retried for max 3 times
      if [[ $UPLOAD_ERROR -gt 2 ]]; then
        print " FAILED\n"
        print "An error occurred requesting /commit_chunked_upload\n"
        ERROR_STATUS=1
        return
      fi
    fi

  done

  print " DONE\n"
}

#Directory upload
#$1 = Local source dir
#$2 = Remote destination dir
function db_upload_dir
{
  local DIR_SRC=$(normalize_path "$1")
  local DIR_DST=$(normalize_path "$2")

  #Creatig remote directory
  db_mkdir "$DIR_DST"

  for file in "$DIR_SRC/"*; do
    db_upload "$file" "$DIR_DST"
  done
}

#Returns the free space on DropBox in bytes
function db_free_quota
{
  $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" --data "oauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOM" "$API_INFO_URL" 2> /dev/null
  check_http_response

  #Check
  if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then

    quota=$(sed -n 's/.*"quota": \([0-9]*\).*/\1/p' "$RESPONSE_FILE")
    used=$(sed -n 's/.*"normal": \([0-9]*\).*/\1/p' "$RESPONSE_FILE")
    let free_quota=$quota-$used
    echo $free_quota

  else
    echo 0
  fi
}

#Generic download wrapper
#$1 = Remote source file/dir
#$2 = Local destination file/dir
function db_download
{
  local SRC=$(normalize_path "$1")
  local DST=$(normalize_path "$2")

  TYPE=$(db_stat "$SRC")

  #It's a directory
  if [[ $TYPE == "DIR" ]]; then

    #If the DST folder is not specified, I assume that is the current directory
    if [[ $DST == "" ]]; then
      DST="."
    fi

    #Checking if the destination directory exists
    if [[ ! -d $DST ]]; then
      local basedir=""
    else
      local basedir=$(basename "$SRC")
    fi

    local DEST_DIR=$(normalize_path "$DST/$basedir")
    print " > Downloading \"$SRC\" to \"$DEST_DIR\"... \n"
    print " > Creating local directory \"$DEST_DIR\"... "
    mkdir -p "$DEST_DIR"

    #Check
    if [[ $? == 0 ]]; then
      print "DONE\n"
    else
      print "FAILED\n"
      ERROR_STATUS=1
      return
    fi

    #Extracting directory content [...]
    #and replacing "}, {" with "}\n{"
    #I don't like this piece of code... but seems to be the only way to do this with SED, writing a portable code...
    local DIR_CONTENT=$(sed -n 's/.*: \[{\(.*\)/\1/p' "$RESPONSE_FILE" | sed 's/}, *{/}\

{/g')

    #Extracting files and subfolders
    TMP_DIR_CONTENT_FILE="${RESPONSE_FILE}_$RANDOM"
    echo "$DIR_CONTENT" | sed -n 's/.*"path": *"\([^"]*\)",.*"is_dir": *\([^"]*\),.*/\1:\2/p' > $TMP_DIR_CONTENT_FILE

    #For each entry...
    while read -r line; do

      local FILE=${line%:*}
      local TYPE=${line#*:}

      #Removing unneeded /
      FILE=${FILE##*/}

      if [[ $TYPE == "false" ]]; then
        db_download_file "$SRC/$FILE" "$DEST_DIR/$FILE"
      else
        db_download "$SRC/$FILE" "$DEST_DIR"
      fi

    done  $TMP_DIR_CONTENT_FILE

    rm -fr $TMP_DIR_CONTENT_FILE

  #It's a file
  elif [[ $TYPE == "FILE" ]]; then

    #Checking DST
    if [[ $DST == "" ]]; then
      DST=$(basename "$SRC")
    fi

    #If the destination is a directory, the file will be download into
    if [[ -d $DST ]]; then
      DST="$DST/$SRC"
    fi

    db_download_file "$SRC" "$DST"

  #Doesn't exists
  else
    print " > No such file or directory: $SRC\n"
    ERROR_STATUS=1
    return
  fi
}

#Simple file download
#$1 = Remote source file
#$2 = Local destination file
function db_download_file
{
  local FILE_SRC=$(normalize_path "$1")
  local FILE_DST=$(normalize_path "$2")

  if [[ $SHOW_PROGRESSBAR == 1  $QUIET == 0 ]]; then
    CURL_PARAMETERS="--progress-bar"
    LINE_CR="\n"
  else
    CURL_PARAMETERS="-s"
    LINE_CR=""
  fi

  #Checking if the file already exists
  if [[ -e $FILE_DST  $SKIP_EXISTING_FILES == 1 ]]; then
    print " > Skipping already existing file \"$FILE_DST\"\n"
    return
  fi

  #Creating the empty file, that for two reasons:
  #1) In this way I can check if the destination file is writable or not
  #2) Curl doesn't automatically creates files with 0 bytes size
  dd if=/dev/zero of="$FILE_DST" count=0 2> /dev/null
  if [[ $? != 0 ]]; then
    print " > Error writing file $FILE_DST: permission denied\n"
    ERROR_STATUS=1
    return
  fi

  print " > Downloading \"$FILE_SRC\" to \"$FILE_DST\"... $LINE_CR"
  $CURL_BIN $CURL_ACCEPT_CERTIFICATES $CURL_PARAMETERS --globoff -D "$RESPONSE_FILE" -o "$FILE_DST" "$API_DOWNLOAD_URL/$ACCESS_LEVEL/$(urlencode "$FILE_SRC")?oauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOM"
  check_http_response

  #Check
  if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then
    print "DONE\n"
  else
    print "FAILED\n"
    rm -fr "$FILE_DST"
    ERROR_STATUS=1
    return
  fi
}

#Prints account info
function db_account_info
{
  print "Dropbox Uploader v$VERSION\n\n"
  print " > Getting info... "
  $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" --data "oauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOM" "$API_INFO_URL" 2> /dev/null
  check_http_response

  #Check
  if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then

    name=$(sed -n 's/.*"display_name": "\([^"]*\).*/\1/p' "$RESPONSE_FILE")
    echo -e "\n\nName:\t$name"

    uid=$(sed -n 's/.*"uid": \([0-9]*\).*/\1/p' "$RESPONSE_FILE")
    echo -e "UID:\t$uid"

    email=$(sed -n 's/.*"email": "\([^"]*\).*/\1/p' "$RESPONSE_FILE")
    echo -e "Email:\t$email"

    quota=$(sed -n 's/.*"quota": \([0-9]*\).*/\1/p' "$RESPONSE_FILE")
    let quota_mb=$quota/1024/1024
    echo -e "Quota:\t$quota_mb Mb"

    used=$(sed -n 's/.*"normal": \([0-9]*\).*/\1/p' "$RESPONSE_FILE")
    let used_mb=$used/1024/1024
    echo -e "Used:\t$used_mb Mb"

    let free_mb=($quota-$used)/1024/1024
    echo -e "Free:\t$free_mb Mb"

    echo ""

  else
    print "FAILED\n"
    ERROR_STATUS=1
  fi
}

#Account unlink
function db_unlink
{
  echo -ne "Are you sure you want unlink this script from your Dropbox account? [y/n]"
  read answer
  if [[ $answer == "y" ]]; then
    rm -fr "$CONFIG_FILE"
    echo -ne "DONE\n"
  fi
}

#Delete a remote file
#$1 = Remote file to delete
function db_delete
{
  local FILE_DST=$(normalize_path "$1")

  print " > Deleting \"$FILE_DST\"... "
  $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" --data "oauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOMroot=$ACCESS_LEVELpath=$(urlencode "$FILE_DST")" "$API_DELETE_URL" 2> /dev/null
  check_http_response

  #Check
  if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then
    print "DONE\n"
  else
    print "FAILED\n"
    ERROR_STATUS=1
  fi
}

#Move/Rename a remote file
#$1 = Remote file to rename or move
#$2 = New file name or location
function db_move
{
  local FILE_SRC=$(normalize_path "$1")
  local FILE_DST=$(normalize_path "$2")

  TYPE=$(db_stat "$FILE_DST")

  #If the destination it's a directory, the source will be moved into it
  if [[ $TYPE == "DIR" ]]; then
    local filename=$(basename "$FILE_SRC")
    FILE_DST=$(normalize_path "$FILE_DST/$filename")
  fi

  print " > Moving \"$FILE_SRC\" to \"$FILE_DST\" ... "
  $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" --data "oauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOMroot=$ACCESS_LEVELfrom_path=$(urlencode "$FILE_SRC")to_path=$(urlencode "$FILE_DST")" "$API_MOVE_URL" 2> /dev/null
  check_http_response

  #Check
  if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then
    print "DONE\n"
  else
    print "FAILED\n"
    ERROR_STATUS=1
  fi
}

#Copy a remote file to a remote location
#$1 = Remote file to rename or move
#$2 = New file name or location
function db_copy
{
  local FILE_SRC=$(normalize_path "$1")
  local FILE_DST=$(normalize_path "$2")

  TYPE=$(db_stat "$FILE_DST")

  #If the destination it's a directory, the source will be copied into it
  if [[ $TYPE == "DIR" ]]; then
    local filename=$(basename "$FILE_SRC")
    FILE_DST=$(normalize_path "$FILE_DST/$filename")
  fi

  print " > Copying \"$FILE_SRC\" to \"$FILE_DST\" ... "
  $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" --data "oauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOMroot=$ACCESS_LEVELfrom_path=$(urlencode "$FILE_SRC")to_path=$(urlencode "$FILE_DST")" "$API_COPY_URL" 2> /dev/null
  check_http_response

  #Check
  if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then
    print "DONE\n"
  else
    print "FAILED\n"
    ERROR_STATUS=1
  fi
}

#Create a new directory
#$1 = Remote directory to create
function db_mkdir
{
  local DIR_DST=$(normalize_path "$1")

  print " > Creating Directory \"$DIR_DST\"... "
  $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" --data "oauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOMroot=$ACCESS_LEVELpath=$(urlencode "$DIR_DST")" "$API_MKDIR_URL" 2> /dev/null
  check_http_response

  #Check
  if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then
    print "DONE\n"
  elif grep -q "^HTTP/1.1 403 Forbidden" "$RESPONSE_FILE"; then
    print "ALREADY EXISTS\n"
  else
    print "FAILED\n"
    ERROR_STATUS=1
  fi
}

#List remote directory
#$1 = Remote directory
function db_list
{
  local DIR_DST=$(normalize_path "$1")

  print " > Listing \"$DIR_DST\"... "
  $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" "$API_METADATA_URL/$ACCESS_LEVEL/$(urlencode "$DIR_DST")?oauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOM" 2> /dev/null
  check_http_response

  #Check
  if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then

    local IS_DIR=$(sed -n 's/^\(.*\)\"contents":.\[.*/\1/p' "$RESPONSE_FILE")

    #It's a directory
    if [[ $IS_DIR != "" ]]; then

      print "DONE\n"

      #Extracting directory content [...]
      #and replacing "}, {" with "}\n{"
      #I don't like this piece of code... but seems to be the only way to do this with SED, writing a portable code...
      local DIR_CONTENT=$(sed -n 's/.*: \[{\(.*\)/\1/p' "$RESPONSE_FILE" | sed 's/}, *{/}\

{/g')

      #Converting escaped quotes to unicode format
      echo "$DIR_CONTENT" | sed 's/\\"/\\u0022/' > "$TEMP_FILE"

      #Extracting files and subfolders
      rm -fr "$RESPONSE_FILE"
      while read -r line; do

        local FILE=$(echo "$line" | sed -n 's/.*"path": *"\([^"]*\)".*/\1/p')
        local IS_DIR=$(echo "$line" | sed -n 's/.*"is_dir": *\([^,]*\).*/\1/p')
        local SIZE=$(echo "$line" | sed -n 's/.*"bytes": *\([0-9]*\).*/\1/p')

        echo -e "$FILE:$IS_DIR;$SIZE" >> "$RESPONSE_FILE"

      done  "$TEMP_FILE"

      #Looking for the biggest file size
      #to calculate the padding to use
      local padding=0
      while read -r line; do
        local FILE=${line%:*}
        local META=${line##*:}
        local SIZE=${META#*;}

        if [[ ${#SIZE} -gt $padding ]]; then
          padding=${#SIZE}
        fi
      done  "$RESPONSE_FILE"

      #For each entry, printing directories...
      while read -r line; do

        local FILE=${line%:*}
        local META=${line##*:}
        local TYPE=${META%;*}
        local SIZE=${META#*;}

        #Removing unneeded /
        FILE=${FILE##*/}

        if [[ $TYPE != "false" ]]; then
          FILE=$(echo -e "$FILE")
          $PRINTF " [D] %-${padding}s %s\n" "$SIZE" "$FILE"
        fi

      done  "$RESPONSE_FILE"

      #For each entry, printing files...
      while read -r line; do

        local FILE=${line%:*}
        local META=${line##*:}
        local TYPE=${META%;*}
        local SIZE=${META#*;}

        #Removing unneeded /
        FILE=${FILE##*/}

        if [[ $TYPE == "false" ]]; then
          FILE=$(echo -e "$FILE")
          $PRINTF " [F] %-${padding}s %s\n" "$SIZE" "$FILE"
        fi

      done  "$RESPONSE_FILE"

    #It's a file
    else
      print "FAILED: $DIR_DST is not a directory!\n"
      ERROR_STATUS=1
    fi

  else
    print "FAILED\n"
    ERROR_STATUS=1
  fi
}

#Share remote file
#$1 = Remote file
function db_share
{
  local FILE_DST=$(normalize_path "$1")

  $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" "$API_SHARES_URL/$ACCESS_LEVEL/$(urlencode "$FILE_DST")?oauth_consumer_key=$APPKEYoauth_token=$OAUTH_ACCESS_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_ACCESS_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOMshort_url=false" 2> /dev/null
  check_http_response

  #Check
  if grep -q "^HTTP/1.1 200 OK" "$RESPONSE_FILE"; then
    print " > Share link: "
    echo $(sed -n 's/.*"url": "\([^"]*\).*/\1/p' "$RESPONSE_FILE")
  else
    print "FAILED\n"
    ERROR_STATUS=1
  fi
}

################
#### SETUP ####
################

#CHECKING FOR AUTH FILE
if [[ -e $CONFIG_FILE ]]; then

  #Loading data... and change old format config if necesary.
  source "$CONFIG_FILE" 2>/dev/null || {
    sed -i'' 's/:/=/' "$CONFIG_FILE"  source "$CONFIG_FILE" 2>/dev/null
  }

  #Checking the loaded data
  if [[ $APPKEY == "" || $APPSECRET == "" || $OAUTH_ACCESS_TOKEN_SECRET == "" || $OAUTH_ACCESS_TOKEN == "" ]]; then
    echo -ne "Error loading data from $CONFIG_FILE...\n"
    echo -ne "It is recommended to run $0 unlink\n"
    remove_temp_files
    exit 1
  fi

  #Back compatibility with previous Dropbox Uploader versions
  if [[ $ACCESS_LEVEL == "" ]]; then
    ACCESS_LEVEL="dropbox"
  fi

#NEW SETUP...
else

  echo -ne "\n This is the first time you run this script.\n\n"
  echo -ne " 1) Open the following URL in your Browser, and log in using your account: $APP_CREATE_URL\n"
  echo -ne " 2) Click on \"Create App\", then select \"Dropbox API app\"\n"
  echo -ne " 3) Select \"Files and datastores\"\n"
  echo -ne " 4) Now go on with the configuration, choosing the app permissions and access restrictions to your DropBox folder\n"
  echo -ne " 5) Enter the \"App Name\" that you prefer (e.g. MyUploader$RANDOM$RANDOM$RANDOM)\n\n"

  echo -ne " Now, click on the \"Create App\" button.\n\n"

  echo -ne " When your new App is successfully created, please type the\n"
  echo -ne " App Key, App Secret and the Permission type shown in the confirmation page:\n\n"

  #Getting the app key and secret from the user
  while (true); do

    echo -n " # App key: "
    read APPKEY

    echo -n " # App secret: "
    read APPSECRET

    echo -n " # Permission type, App folder or Full Dropbox [a/f]: "
    read ACCESS_LEVEL

    if [[ $ACCESS_LEVEL == "a" ]]; then
      ACCESS_LEVEL="sandbox"
      ACCESS_MSG="App Folder"
    else
      ACCESS_LEVEL="dropbox"
      ACCESS_MSG="Full Dropbox"
    fi

    echo -ne "\n > App key is $APPKEY, App secret is $APPSECRET and Access level is $ACCESS_MSG. Looks ok? [y/n]: "
    read answer
    if [[ $answer == "y" ]]; then
      break;
    fi

  done

  #TOKEN REQUESTS
  echo -ne "\n > Token request... "
  $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" --data "oauth_consumer_key=$APPKEYoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26oauth_timestamp=$(utime)oauth_nonce=$RANDOM" "$API_REQUEST_TOKEN_URL" 2> /dev/null
  check_http_response
  OAUTH_TOKEN_SECRET=$(sed -n 's/oauth_token_secret=\([a-z A-Z 0-9]*\).*/\1/p' "$RESPONSE_FILE")
  OAUTH_TOKEN=$(sed -n 's/.*oauth_token=\([a-z A-Z 0-9]*\)/\1/p' "$RESPONSE_FILE")

  if [[ $OAUTH_TOKEN != ""  $OAUTH_TOKEN_SECRET != "" ]]; then
    echo -ne "OK\n"
  else
    echo -ne " FAILED\n\n Please, check your App key and secret...\n\n"
    remove_temp_files
    exit 1
  fi

  while (true); do

    #USER AUTH
    echo -ne "\n Please open the following URL in your browser, and allow Dropbox Uploader\n"
    echo -ne " to access your DropBox folder:\n\n --> ${API_USER_AUTH_URL}?oauth_token=$OAUTH_TOKEN\n"
    echo -ne "\nPress enter when done...\n"
    read

    #API_ACCESS_TOKEN_URL
    echo -ne " > Access Token request... "
    $CURL_BIN $CURL_ACCEPT_CERTIFICATES -s --show-error --globoff -i -o "$RESPONSE_FILE" --data "oauth_consumer_key=$APPKEYoauth_token=$OAUTH_TOKENoauth_signature_method=PLAINTEXToauth_signature=$APPSECRET%26$OAUTH_TOKEN_SECREToauth_timestamp=$(utime)oauth_nonce=$RANDOM" "$API_ACCESS_TOKEN_URL" 2> /dev/null
    check_http_response
    OAUTH_ACCESS_TOKEN_SECRET=$(sed -n 's/oauth_token_secret=\([a-z A-Z 0-9]*\).*/\1/p' "$RESPONSE_FILE")
    OAUTH_ACCESS_TOKEN=$(sed -n 's/.*oauth_token=\([a-z A-Z 0-9]*\).*/\1/p' "$RESPONSE_FILE")
    OAUTH_ACCESS_UID=$(sed -n 's/.*uid=\([0-9]*\)/\1/p' "$RESPONSE_FILE")

    if [[ $OAUTH_ACCESS_TOKEN != ""  $OAUTH_ACCESS_TOKEN_SECRET != ""  $OAUTH_ACCESS_UID != "" ]]; then
      echo -ne "OK\n"

      #Saving data in new format, compatible with source command.
      echo "APPKEY=$APPKEY" > "$CONFIG_FILE"
      echo "APPSECRET=$APPSECRET" >> "$CONFIG_FILE"
      echo "ACCESS_LEVEL=$ACCESS_LEVEL" >> "$CONFIG_FILE"
      echo "OAUTH_ACCESS_TOKEN=$OAUTH_ACCESS_TOKEN" >> "$CONFIG_FILE"
      echo "OAUTH_ACCESS_TOKEN_SECRET=$OAUTH_ACCESS_TOKEN_SECRET" >> "$CONFIG_FILE"

      echo -ne "\n Setup completed!\n"
      break
    else
      print " FAILED\n"
      ERROR_STATUS=1
    fi

  done;

  remove_temp_files
  exit $ERROR_STATUS
fi

################
#### START ####
################

COMMAND=${@:$OPTIND:1}
ARG1=${@:$OPTIND+1:1}
ARG2=${@:$OPTIND+2:1}

let argnum=$#-$OPTIND

#CHECKING PARAMS VALUES
case $COMMAND in

  upload)

    if [[ $argnum -lt 2 ]]; then
      usage
    fi

    FILE_DST=${@:$#:1}

    for (( i=$OPTIND+1; i$#; i++ )); do
      FILE_SRC=${@:$i:1}
      db_upload "$FILE_SRC" "/$FILE_DST"
    done

  ;;

  download)

    if [[ $argnum -lt 1 ]]; then
      usage
    fi

    FILE_SRC=$ARG1
    FILE_DST=$ARG2

    db_download "/$FILE_SRC" "$FILE_DST"

  ;;

  share)

    if [[ $argnum -lt 1 ]]; then
      usage
    fi

    FILE_DST=$ARG1

    db_share "/$FILE_DST"

  ;;

  info)

    db_account_info

  ;;

  delete|remove)

    if [[ $argnum -lt 1 ]]; then
      usage
    fi

    FILE_DST=$ARG1

    db_delete "/$FILE_DST"

  ;;

  move|rename)

    if [[ $argnum -lt 2 ]]; then
      usage
    fi

    FILE_SRC=$ARG1
    FILE_DST=$ARG2

    db_move "/$FILE_SRC" "/$FILE_DST"

  ;;

  copy)

    if [[ $argnum -lt 2 ]]; then
      usage
    fi

    FILE_SRC=$ARG1
    FILE_DST=$ARG2

    db_copy "/$FILE_SRC" "/$FILE_DST"

  ;;

  mkdir)

    if [[ $argnum -lt 1 ]]; then
      usage
    fi

    DIR_DST=$ARG1

    db_mkdir "/$DIR_DST"

  ;;

  list)

    DIR_DST=$ARG1

    #Checking DIR_DST
    if [[ $DIR_DST == "" ]]; then
      DIR_DST="/"
    fi

    db_list "/$DIR_DST"

  ;;

  unlink)

    db_unlink

  ;;

  *)

    if [[ $COMMAND != "" ]]; then
      print "Error: Unknown command: $COMMAND\n\n"
      ERROR_STATUS=1
    fi
    usage

  ;;

esac

remove_temp_files
exit $ERROR_STATUS

第一次使用,這個腳本會給你指導(dǎo),告訴你去哪里獲得dropbox的 API key 。

因為只有配置好了 API key ,這樣才能授權(quán)給腳本應(yīng)用進入你的dropbox目錄

標(biāo)簽:大慶 江西 三門峽 遵義 仙桃 大興安嶺 安康 上饒

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《編寫shell腳本將VPS上的數(shù)據(jù)備份到Dropbox網(wǎng)盤的方法》,本文關(guān)鍵詞  編寫,shell,腳本,將,VPS,上,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《編寫shell腳本將VPS上的數(shù)據(jù)備份到Dropbox網(wǎng)盤的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于編寫shell腳本將VPS上的數(shù)據(jù)備份到Dropbox網(wǎng)盤的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    97视频在线观看成人| 91豆花精品一区| 亚洲欧洲国产日本综合| 五月婷婷激情视频| 久久精品一二三四| 麻豆精品视频| 4444欧美成人kkkk| 亚洲成人亚洲激情| 亚洲色图丝袜美腿| 久久99精品久久久久婷婷| 成人一级黄色大片| 亚洲无吗一区二区三区| 亚州欧美一区三区三区在线| 国内外成人免费激情在线视频网站| 宅男噜噜噜66一区二区66| 久久午夜国产精品| 老司机精品久久| 在线观看国产亚洲| 日本少妇xxx| 色欲av无码一区二区人妻| 爱情岛论坛亚洲入口| 久久99精品国产99久久6尤物| 欧美一卡二卡三卡| 亚洲欧美日韩国产成人精品影院 | 浴室偷拍美女洗澡456在线| 91sao在线观看国产| 最近2019年日本中文免费字幕| 色综合激情五月| 亚洲精品一卡二卡| 国产成人精品www牛牛影视| 国产99久久九九精品无码免费| 久久久久久久久久91| 国产精品无码在线| 污网站在线免费| 日韩欧美xxxx| 国产九色porny| aaa免费在线观看| 久久香蕉综合色| 国产精品自产拍高潮在线观看| 蜜臀久久99精品久久久久久宅男| 欧美精品一区二区久久久| 91精品国产91久久久久久最新毛片 | 在线观看欧美精品| 亚洲一二三四在线| 1000精品久久久久久久久| 中文欧美字幕免费| 97se亚洲国产综合自在线不卡 | 波多野吉衣中文字幕| 一区二区三区入口| 中文字幕在线综合| 黄色片网址在线观看| 欧美日韩在线免费观看视频| 国产综合欧美在线看| 成人国产精品久久久| 国产精品对白一区二区三区| 91美女福利视频高清| 国产精品二区在线观看| 99在线视频播放| 成人免费视频网站入口| 国产成人精品综合久久久| 国产激情综合五月久久| 欧洲亚洲免费在线| 成人黄色片网站| 国产色视频一区| 久久国产欧美精品| 亚洲精品成人三区| 国产精品av免费观看| www.中文字幕在线| 欧美日韩国产精品激情在线播放| 日日摸日日碰夜夜爽av| 日本香蕉视频在线观看| 成人免费毛片网| 免费日韩中文字幕| 人妻精品久久久久中文字幕69| 精品欧美一区二区久久久| 永久免费未视频| www.日韩一区| 日韩一级片免费在线观看| 日韩高清中文字幕一区| 欧美aaaaaa午夜精品| 狠狠色丁香婷婷综合久久片| 成人av影院在线| 欧美高清在线一区二区| 亚洲福利视频一区二区| 91精品国产91久久综合桃花| 亚洲精品理论电影| 国内精品小视频在线观看| 国产精品久久久久福利| 成人免费91在线看| 99精品免费在线观看| 中文字幕天堂av| 久久精品免费av| 俄罗斯嫩小性bbwbbw| 成人av电影在线网| 色婷婷久久久久swag精品| 日韩电影第一页| 国产精品成人av性教育| 色婷婷精品国产一区二区三区| 免费一区二区三区在线观看| 黄色一级片一级片| 国产又大又长又粗| 国产成a人亚洲精| 亚洲狠狠爱一区二区三区| 亚洲精品国产成人| 欧美在线视频导航| 欧美美女黄色网| 亚洲视频在线播放免费| 成人毛片在线播放| 99免费精品在线| 欧美狂野另类xxxxoooo| 国产精品旅馆在线| 日本一级黄视频| 91传媒免费观看| 亚洲老妇色熟女老太| 99视频精品在线| 欧美性xxxxxxxx| 久久久久久久久久久亚洲| 成人区精品一区二区| 日韩av资源在线| 青青草成人av| 国产精一区二区三区| 欧美日韩亚洲视频| 国产成人一区二区三区| 2018日日夜夜| 成人一级免费视频| 99国产精品视频免费观看| 色婷婷国产精品综合在线观看| 久久精品视频免费播放| 欧美日韩一区二区视频在线 | 精品国产一区二区三区久久狼黑人 | 蜜臂av日日欢夜夜爽一区| 欧美专区日韩专区| 欧美性资源免费| 国产最新免费视频| 日韩欧美亚洲一区二区三区| 成人午夜av电影| 一本色道久久综合狠狠躁篇怎么玩| 欧美日韩在线不卡一区| 日韩一区二区三区四区视频| 日本视频在线一区| 日韩欧美资源站| 国内精品久久国产| 亚洲综合第一区| 国产91富婆露脸刺激对白| 亚洲精品久久久久久久久久久久久 | 一区二区三区高清| 97在线视频免费看| 一道本在线免费视频| 日本激情一区二区三区| 欧美在线一二三| 国产精品视频区| 亚洲少妇一区二区三区| 国产一区二三区好的| 亚洲成人黄色在线| 草b视频在线观看| 日韩欧美国产另类| 一区二区三区高清在线| 国产精品一区二区久久| 一区二区三区免费在线观看视频| 久久成人久久鬼色| 亚洲激情在线观看视频免费| 国产资源第一页| 欧美激情一区二区三区免费观看| 亚洲一区二区在线观看视频 | 日韩大陆毛片av| 丝袜美腿玉足3d专区一区| 最新中文字幕av| 亚洲成av人片一区二区三区| 亚洲精品一区二区三区樱花| 亚洲精品免费视频| 欧美深性狂猛ⅹxxx深喉| 国产一级揄自揄精品视频| 亚洲av成人精品毛片| 日韩精品一区二区三区四区五区| 日韩黄色免费网站| 欧美xxxx18性欧美| 污污的视频在线免费观看| 欧美日韩久久久久久| 久热免费在线观看| 午夜精品一区二区三区电影天堂 | 欧美一区二三区| 日本高清www| 亚洲色图狂野欧美| 麻豆视频在线免费看| 欧美视频一区二区三区…| 8x8x成人免费视频| 图片区小说区区亚洲影院| 久久久99精品| 国产精品毛片va一区二区三区| 亚洲一区二区综合| 久久夜靖品2区| 3d精品h动漫啪啪一区二区| 久久理论电影网| 丁香花在线影院观看在线播放| 中文字幕在线不卡一区 | 午夜国产福利视频| 亚洲精品综合久久中文字幕| 五月天婷婷综合网| 久久躁日日躁aaaaxxxx| 国产毛片毛片毛片毛片毛片毛片| 亚洲国产日韩精品| 缅甸午夜性猛交xxxx| 2020日本不卡一区二区视频| 妺妺窝人体色www在线小说| 欧美日韩国产一区二区三区地区| 国产三级av在线播放| 日韩电影中文字幕在线观看| 中文字幕观看av| 99久久免费国| 精品久久久久一区| 蜜桃视频一区二区三区在线观看| 爱情岛论坛成人| 日本午夜在线亚洲.国产| 国产午夜精品久久久久久免费视| 女同性αv亚洲女同志| 日韩精品在线看| 成人黄色免费网| 国产成人av网址| 国产高清成人在线| 欧美久久电影| 亚洲成人自拍一区| 波多野结衣福利| 欧美在线看片a免费观看| 天天插天天操天天射| 午夜精品爽啪视频| 午夜免费视频网站| 欧美日韩午夜影院| 国产精品国产三级国产aⅴ| 国产一区二区免费电影| 国模无码大尺度一区二区三区| 中文久久久久久| 无码av免费一区二区三区试看| 亚洲 欧美 激情 小说 另类| 亚洲精品国产一区黑色丝袜| av在线不卡一区| 亚洲国产天堂久久国产91| 9色porny自拍视频一区二区| 免费在线视频观看| 天堂精品一区二区三区| 福利精品视频在线| 国产成人a人亚洲精品无码| 老司机午夜网站| 日本乱人伦aⅴ精品| 国产成人啪精品午夜在线观看| 精品久久久久久中文字幕动漫| 亚洲欧美国产77777| av免费在线播放网站| 色婷婷亚洲婷婷| 97在线观看免费视频| 色噜噜狠狠狠综合曰曰曰88av| 在线视频 中文字幕| 日b视频免费观看| 日韩精品亚洲视频| 日韩在线一二三区| 成人一区二区免费视频| 一区二区成人av| 久久综合九色综合97_久久久| 久久国产精品免费看| 精产国品一区二区三区| 国产一区自拍视频| 久久免费高清视频| 在线观看免费一区| 国产成人av一区二区三区在线| 国产区在线观看视频| 亚洲一区影院| 亚洲黄色有码视频| 午夜成人免费影院| 国产麻豆剧传媒精品国产| 欧美激情第6页| 中文字幕欧美日韩一区| 2019男人天堂| 国产欧美一区二区三区在线看| 国产乱码精品一区二区三区av | 欧美久久高跟鞋激| 中文字幕日本视频| 成人亚洲视频在线观看| 韩国一区二区电影| 亚洲精品老司机| 国产在线免费看| 日韩在线观看a| 久久综合电影一区| 欧美日本一区二区| 国产亚洲一区字幕| xxxwww在线观看| 日本中文字幕免费观看| 亚洲精品mv在线观看| 国产一区福利视频| 日韩欧美国产一二三区| 福利91精品一区二区三区| 一级一片免费播放| 日韩成人性视频| 不卡一区中文字幕| 久久久久久激情| 黄色片视频在线播放| 欧美成人精品在线| 国产精品一区二区在线播放| 91 在线视频观看| 欧美一级成年大片在线观看| 亚洲色图欧美在线| 精品免费囯产一区二区三区| 国产熟人av一二三区| 狠狠色综合网站久久久久久久| 亚洲女人天堂网| 久久在线观看免费| 国产精品视频一区二区三区,| 中文字幕欧美视频| 日韩久久久久久久久久久久| 精品欧美一区二区在线观看视频| 欧美在线视频a| 欧美黑人一级爽快片淫片高清| 三级精品视频久久久久| 亚洲福利视频专区| 8x福利精品第一导航| 欧美国产一区二区| 中文字幕二区三区| 性欧美丰满熟妇xxxx性仙踪林| 成人一区二区在线| 久久激情视频免费观看| 五月天久久比比资源色| 黄一区二区三区| 国产v在线观看| 日本老熟俱乐部h0930| 日本精品久久久久久久久久| 丝袜美腿精品国产二区| 国产精品欧美久久久久一区二区 | 91日本视频在线| 亚洲风情亚aⅴ在线发布| 日本韩国一区二区三区| 国产欧美视频一区二区| 国产精品一区二区人人爽| 朝桐光av一区二区三区| 男人插女人视频在线观看| 国产精品自产拍在线观看中文| 日韩在线视频二区| 永久免费精品影视网站| 欧美美女操人视频| 九九久久久久久久久激情| 欧美激情在线观看| 2020久久国产精品| 国产精品jizz在线观看麻豆| 日本精品久久中文字幕佐佐木| 色青青草原桃花久久综合| 日韩免费电影一区| 亚洲一区二区三区视频在线播放 | 亚洲欧美综合在线精品| 日韩成人一区二区| 中文字幕乱码无码人妻系列蜜桃| 国产这里有精品| 91丨porny丨九色| 日韩欧美在线电影| 欧洲午夜精品久久久| 亚洲精品在线观看视频| 日韩理论在线观看| 美女看a上一区| 亚洲精品男人的天堂| 国产日韩精品中文字无码| 中文幕无线码中文字蜜桃| 中文字幕天堂av| 午夜啪啪福利视频| 免费成人深夜夜行视频| 国产精品mp4| 国产精品美女www爽爽爽视频| 成人有码在线播放| 亚洲伊人婷婷| 国产97色在线 | 日韩| 中文字幕国产综合| 日操夜操天天操| 一区二区三区免费在线| 精品国产亚洲一区二区麻豆| 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美精品一区二区三区很污很色的| 欧美性受xxxx黑人xyx| 亚洲欧洲精品一区二区三区| 欧美国产成人精品| www.日韩在线| 成人午夜激情片| 免费看日韩精品| 亚洲精品国产一区二| 日韩av在线播| 免费国产羞羞网站美图| 中文字幕在线永久| 国产熟妇搡bbbb搡bbbb| 久草免费在线观看视频| 一起草av在线| 五月天久久久久久| 97av免费视频| 国产91精品一区| 中文字幕人妻一区二| 手机免费观看av| 国产在线综合网| 黄色片视频免费| 天天做天天爱夜夜爽| a天堂中文字幕| 亚洲蜜桃精久久久久久久久久久久| www色com| 日本成人一级片| 亚洲图片小说视频| 日韩中文字幕麻豆| 国产xxx精品视频大全| 91视频一区二区三区| 亚洲天堂av老司机| 亚洲国产成人私人影院tom| 亚洲综合一区二区三区| 国产精品天美传媒| 亚洲欧美日韩在线不卡| 亚洲一区二区三区四区在线观看| 天天影视涩香欲综合网| 欧美久久久一区| 亚洲国产精品999| 一区二区三区四区视频|