-
-
Save MG2R/c896852b837a3807f49649c1ba2347ca to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash | |
############################################################ | |
# | |
# cloudsend.sh | |
# | |
# Uses curl to send files to a shared | |
# Nextcloud/Owncloud folder | |
# | |
# Usage: ./cloudsend.sh <file> <folderLink> | |
# Help: ./cloudsend.sh -h | |
# | |
# Gustavo Arnosti Neves | |
# https://github.com/tavinus | |
# | |
# Get this script to current folder with: | |
# curl -O 'https://gist.githubusercontent.com/tavinus/93bdbc051728748787dc22a58dfe58d8/raw/cloudsend.sh' && chmod +x cloudsend.sh | |
# | |
############################################################ | |
CS_VERSION="0.1.1" | |
CLOUDURL="" | |
FOLDERTOKEN="" | |
PUBSUFFIX="public.php/webdav" | |
HEADER='X-Requested-With: XMLHttpRequest' | |
INSECURE='' | |
# https://cloud.mydomain.net/s/fLDzToZF4MLvG28 | |
# curl -k -T myFile.ext -u "fLDzToZF4MLvG28:" -H 'X-Requested-With: XMLHttpRequest' https://cloud.mydomain.net/public.php/webdav/myFile.ext | |
log() { | |
[ "$VERBOSE" == " -s" ] || printf "%s\n" "$1" | |
} | |
printVersion() { | |
printf "%s\n" "CloudSender v$CS_VERSION" | |
} | |
initError() { | |
printVersion >&2 | |
printf "%s\n" "Init Error! $1" >&2 | |
printf "%s\n" "Try: $0 --help" >&2 | |
exit 1 | |
} | |
usage() { | |
printVersion | |
printf "\n%s%s\n" "Parameters:" " | |
-h | --help Print this help and exits | |
-q | --quiet Be quiet | |
-V | --version Prints version and exits | |
-k | --insecure Uses curl with -k option (https insecure)" | |
printf "\n%s\n%s\n" "Use:" " $0 <filepath> <folderLink>" | |
printf "\n%s\n%s\n\n" "Example:" " $0 './myfile.txt' 'https://cloud.mydomain.net/s/fLDzToZF4MLvG28'" | |
} | |
########################## | |
# Process parameters | |
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then | |
usage | |
exit 0 | |
fi | |
if [ "$1" = "-V" ] || [ "$1" = "--version" ]; then | |
printVersion | |
exit 0 | |
fi | |
if [ "$1" = "-q" ] || [ "$1" = "--quiet" ]; then | |
VERBOSE=" -s" | |
shift | |
fi | |
if [ "$1" = "-k" ] || [ "$1" = "--insecure" ]; then | |
INSECURE=' -k' | |
log " > Insecure mode ON" | |
shift | |
fi | |
if [ "$1" = "-p" ] || [ "$1" = "--password" ]; then | |
PASSWORD=${CLOUDSEND_PASSWORD} | |
log " > Using password from env" | |
shift | |
fi | |
########################## | |
# Validate input | |
FILENAME="$1" | |
CLOUDURL="${2%/s/*}" | |
FOLDERTOKEN="${2##*/s/}" | |
if [ ! -f "$FILENAME" ]; then | |
initError "Invalid input file: $FILENAME" | |
fi | |
if [ -z "$CLOUDURL" ]; then | |
initError "Empty URL! Nowhere to send..." | |
fi | |
if [ -z "$FOLDERTOKEN" ]; then | |
initError "Empty Folder Token! Nowhere to send..." | |
fi | |
########################## | |
# Check for curl | |
CURLBIN='/usr/bin/curl' | |
if [ ! -x "$CURLBIN" ]; then | |
CURLBIN="$(which curl 2>/dev/null)" | |
if [ ! -x "$CURLBIN" ]; then | |
initError "No curl found on system!" | |
fi | |
fi | |
########################## | |
# Send file | |
"$CURLBIN"$INSECURE$VERBOSE -T "$FILENAME" -u "$FOLDERTOKEN":"$PASSWORD" -H "$HEADER" "$CLOUDURL/$PUBSUFFIX/$FILENAME" |
with nextcould 18 this script has started appending a (2) to each write of a file, which quickly gets problematic for operating systems without unlimited file/folder text length. I"m not sure why yet.
@MG2R @gessel
I have updated the original app with changes from you both.
Cheers! 🍺
Thanks
with nextcould 18 this script has started appending a (2) to each write of a file, which quickly gets problematic for operating systems without unlimited file/folder text length. I"m not sure why yet.
BTW, the (2) / (3) / etc happen when sending a file that already exists (it does not overwrite the file).
any way to change this behavior? The internal "versions" function is quite robust and has a lot of useful features. The (2)(2)(2) thing quickly breaks the file system.
Hi! This is an old fork of an old version of my script.
I have migrated it to a proper repository and made many changes since then.
https://github.com/tavinus/cloudsend.sh
The new version will overwrite the file by default.
It also has many other options, like using globs to send multiple files or renaming the target file.
Shares with passwords
Cloudsend v2 changed the way password parsing works.
Cloudsend 0.x.x used the -p
parameter for the Environment password (changed to -e
in v2+).
Please use EITHER -e
OR -p
, but not both. The last to be called will be used.
- Env Pass > Set the variable
CLOUDSEND_PASSWORD='MySecretPass'
and use the option-e
- Param Pass > Send the password as a parameter with
-p <password>
Help info
$ ./cloudsend --help
Tavinus Cloud Sender v2.1.12
Parameters:
-h | --help Print this help and exits
-q | --quiet Disables verbose messages
-V | --version Prints version and exits
-r | --rename <file.xxx> Change the destination file name
-g | --glob Disable input file checking to use curl globs
-k | --insecure Uses curl with -k option (https insecure)
-p | --password <pass> Uses <pass> as shared folder password
-e | --envpass Uses env var $CLOUDSEND_PASSWORD as share password
You can 'export CLOUDSEND_PASSWORD' at your system, or set it at the call
Please remeber to also call -e to use the password set
Use:
./cloudsend.sh [options] <filepath> <folderLink>
CLOUDSEND_PASSWORD='MySecretPass' ./cloudsend.sh -e [options] <filepath> <folderLink>
Passwords:
Cloudsend 2 changed the way password works
Cloudsend 0.x.x used the '-p' parameter for the Environment password (changed to -e in v2+)
Please use EITHER -e OR -p, but not both. The last to be called will be used
Env Pass > Set the variable CLOUDSEND_PASSWORD='MySecretPass' and use the option '-e'
Param Pass > Send the password as a parameter with '-p <password>'
Input Globbing:
You can use input globbing (wildcards) by setting the -g option
This will ignore input file checking and pass the glob to curl to be used
You MUST NOT rename files when globbing, input file names will be used
Glob examples: '{file1.txt,file2.txt,file3.txt}'
'img[1-100].png'
Send from stdin (pipe):
You can send piped content by using - or . as the input file name (curl specs)
You MUST set a destination file name to use stdin as input (-r <name>)
Use the file name '-' (a single dash) to use stdin instead of a given file
Alternately, the file name '.' (a single period) may be specified instead of '-' to use
stdin in non-blocking mode to allow reading server output while stdin is being uploaded
Examples:
CLOUDSEND_PASSWORD='MySecretPass' ./cloudsend.sh -e './myfile.txt' 'https://cloud.mydomain.net/s/fLDzToZF4MLvG28'
./cloudsend.sh './myfile.txt' 'https://cloud.mydomain.net/s/fLDzToZF4MLvG28'
./cloudsend.sh -r 'RenamedFile.txt' './myfile.txt' 'https://cloud.mydomain.net/s/fLDzToZF4MLvG28'
./cloudsend.sh -p 'MySecretPass' './myfile.txt' 'https://cloud.mydomain.net/s/fLDzToZF4MLvG28'
./cloudsend.sh -p 'MySecretPass' -r 'RenamedFile.txt' './myfile.txt' 'https://cloud.mydomain.net/s/fLDzToZF4MLvG28'
./cloudsend.sh -g -p 'MySecretPass' '{file1,file2,file3}' 'https://cloud.mydomain.net/s/fLDzToZF4MLvG28'
cat file | ./cloudsend.sh - 'https://cloud.mydomain.net/s/fLDzToZF4MLvG28' -r destFileName
Send folder examples:
find ./ -maxdepth 1 -type f -exec ./cloudsend.sh {} https://cloud.mydomain.tld/s/TxWdsNX2Ln3X5kxG -p yourPassword \;
find /home/myname/myfolder -type f -exec ./cloudsend.sh {} https://cloud.mydomain.tld/s/TxWdsNX2Ln3X5kxG -p yourPassword \;
tar cf - "$(pwd)" | gzip -9 -c | ./cloudsend.sh - 'https://cloud.mydomain.tld/s/TxWdsNX2Ln3X5kxG' -r myfolder.tar.gz
tar cf - /home/myname/myfolder | gzip -9 -c | ./cloudsend.sh - 'https://cloud.mydomain.tld/s/TxWdsNX2Ln3X5kxG' -r myfolder.tar.gz
zip -q -r -9 - /home/myname/myfolder | ./cloudsend.sh - 'https://cloud.mydomain.tld/s/TxWdsNX2Ln3X5kxG' -r myfolder.zip
Cool thanks! I'll jump over and work with the current one. Thank you for your code.
I had to make a few changes to get it to work:
My link url contained "/public.php" which had to be stripped by changing line 96 to
CLOUDURL="${2%/index.php/s/*}"
My use case is to push files with full path, which confused the upload, so I stripped the path to a "base" filename and then modified the send line to use it.