LICENSE | Loading last commit info... | |
README.md | ||
examples.md |
crash.directory
Decentralised [storj-backed] file sharing with a command-line friendly API
Notice
Downloads on crash.directory are public and unrestricted but, in order to prevent abuses, the file uploads are protected by the HTTPS basic auth header.
Replace user:pass
in the examples below with your provided credentials, you can try to ask for them on crash.contact
Alternatively, for unauthenticated uploads, if you don't mind NOT using crash.directory, you can go with the official public instance of the underlying software: transfer.sh
Usage
Upload:
$ curl --upload-file ./hello.txt https://user:[email protected]/hello.txt
Encrypt & Upload:
$ cat /tmp/hello.txt|gpg -ac -o-|curl -X PUT --upload-file "-" https://user:[email protected]/test.txt
Download & Decrypt:
$ curl https://crash.directory/1lDau/test.txt|gpg -o- > /tmp/hello.txt
Upload to Virustotal:
$ curl -X PUT --upload-file nhgbhhj https://user:[email protected]/test.txt/virustotal
Deleting
$ curl -X DELETE <X-Url-Delete Response Header URL>
Request Headers
Max-Downloads
$ curl --upload-file ./hello.txt https://user:[email protected]/hello.txt -H "Max-Downloads: 1" # Limit the number of downloads
Max-Days
$ curl --upload-file ./hello.txt https://user:[email protected]/hello.txt -H "Max-Days: 1" # Set the number of days before deletion
Response Headers
X-Url-Delete
The URL used to request the deletion of a file and returned as a response header.
curl -sD - --upload-file ./hello https://user:[email protected]/hello.txt | grep -i 'X-Url-Delete'
X-Url-Delete: https://crash.directory/hello.txt/BAYh0/hello.txt/PDw0NHPcqU
Examples
See good usage examples on examples.md
Link aliases
Create direct download link:
https://crash.directory/1lDau/test.txt --> https://crash.directory/get/1lDau/test.txt
Inline file:
https://crash.directory/1lDau/test.txt --> https://crash.directory/inline/1lDau/test.txt
Shell functions
Bash and zsh (multiple files uploaded as zip archive)
Add this to .bashrc or .zshrc or its equivalent
transfer(){ if [ $# -eq 0 ];then echo "No arguments specified.\nUsage:\n transfer <file|directory>\n ... | transfer <file_name>">&2;return 1;fi;if tty -s;then file="$1";file_name=$(basename "$file");if [ ! -e "$file" ];then echo "$file: No such file or directory">&2;return 1;fi;if [ -d "$file" ];then file_name="$file_name.zip" ,;(cd "$file"&&zip -r -q - .)|curl --progress-bar --upload-file "-" "https://user:[email protected]/$file_name"|tee /dev/null,;else cat "$file"|curl --progress-bar --upload-file "-" "https://user:[email protected]/$file_name"|tee /dev/null;fi;else file_name=$1;curl --progress-bar --upload-file "-" "https://user:[email protected]/$file_name"|tee /dev/null;fi;}
Now you can use transfer function
$ transfer hello.txt
Bash and zsh (with delete url, delete token output and prompt before uploading)
Add this to .bashrc or .zshrc or its equivalent
Expand
transfer()
{
local file
declare -a file_array
file_array=("${@}")
if [[ "${file_array[@]}" == "" || "${1}" == "--help" || "${1}" == "-h" ]]
then
echo "${0} - Upload arbitrary files to \"crash.directory\"."
echo ""
echo "Usage: ${0} [options] [<file>]..."
echo ""
echo "OPTIONS:"
echo " -h, --help"
echo " show this message"
echo ""
echo "EXAMPLES:"
echo " Upload a single file from the current working directory:"
echo " ${0} \"image.img\""
echo ""
echo " Upload multiple files from the current working directory:"
echo " ${0} \"image.img\" \"image2.img\""
echo ""
echo " Upload a file from a different directory:"
echo " ${0} \"/tmp/some_file\""
echo ""
echo " Upload all files from the current working directory. Be aware of the webserver's rate limiting!:"
echo " ${0} *"
echo ""
echo " Upload a single file from the current working directory and filter out the delete token and download link:"
echo " ${0} \"image.img\" | awk --field-separator=\": \" '/Delete token:/ { print \$2 } /Download link:/ { print \$2 }'"
echo ""
echo " Show help text from \"crash.directory\":"
echo " curl --request GET \"https://crash.directory\""
return 0
else
for file in "${file_array[@]}"
do
if [[ ! -f "${file}" ]]
then
echo -e "\e[01;31m'${file}' could not be found or is not a file.\e[0m" >&2
return 1
fi
done
unset file
fi
local upload_files
local curl_output
local awk_output
local filename
du --total --block-size="K" --dereference "${file_array[@]}" >&2
# be compatible with "bash"
if [[ "${ZSH_NAME}" == "zsh" ]]
then
read $'upload_files?\e[01;31mDo you really want to upload the above files ('"${#file_array[@]}"$') to "crash.directory"? (Y/n): \e[0m'
elif [[ "${BASH}" == *"bash"* ]]
then
read -p $'\e[01;31mDo you really want to upload the above files ('"${#file_array[@]}"$') to "crash.directory"? (Y/n): \e[0m' upload_files
fi
case "${upload_files:-y}" in
"y"|"Y")
# for the sake of the progress bar, execute "curl" for each file.
# the parameters "--include" and "--form" will suppress the progress bar.
for file in "${file_array[@]}"
do
filename="${file##*/}"
# show delete link and filter out the delete token from the response header after upload.
# it is important to save "curl's" "stdout" via a subshell to a variable or redirect it to another command,
# which just redirects to "stdout" in order to have a sane output afterwards.
# the progress bar is redirected to "stderr" and is only displayed,
# if "stdout" is redirected to something; e.g. ">/dev/null", "tee /dev/null" or "| <some_command>".
# the response header is redirected to "stdout", so redirecting "stdout" to "/dev/null" does not make any sense.
# redirecting "curl's" "stderr" to "stdout" ("2>&1") will suppress the progress bar.
curl_output=$(curl --request PUT --progress-bar --dump-header - --upload-file "${file}" "https://user:[email protected]/${filename}")
awk_output=$(awk \
'gsub("\r", "", $0) && tolower($1) ~ /x-url-delete/ \
{
delete_link=$2;
print "Delete command: curl --request DELETE " "\""delete_link"\"";
gsub(".*/", "", delete_link);
delete_token=delete_link;
print "Delete token: " delete_token;
}
END{
print "Download link: " $0;
}' <<< "${curl_output}")
# return the results via "stdout", "awk" does not do this for some reason.
echo -e "${awk_output}\n"
# avoid rate limiting as much as possible; nginx: too many requests.
if (( ${#file_array[@]} > 4 ))
then
sleep 5
fi
done
;;
"n"|"N")
return 1
;;
*)
echo -e "\e[01;31mWrong input: '${upload_files}'.\e[0m" >&2
return 1
esac
}
Sample output
$ ls -lh
total 20M
-rw-r--r-- 1 <some_username> <some_username> 10M Apr 4 21:08 image.img
-rw-r--r-- 1 <some_username> <some_username> 10M Apr 4 21:08 image2.img
$ transfer image*
10240K image2.img
10240K image.img
20480K total
Do you really want to upload the above files (2) to "crash.directory"? (Y/n):
######################################################################################################################################################################################################################################## 100.0%
Delete command: curl --request DELETE "https://crash.directory/wJw9pz/image2.img/mSctGx7pYCId"
Delete token: mSctGx7pYCId
Download link: https://crash.directory/wJw9pz/image2.img
######################################################################################################################################################################################################################################## 100.0%
Delete command: curl --request DELETE "https://crash.directory/ljJc5I/image.img/nw7qaoiKUwCU"
Delete token: nw7qaoiKUwCU
Download link: https://crash.directory/ljJc5I/image.img
$ transfer "image.img" | awk --field-separator=": " '/Delete token:/ { print $2 } /Download link:/ { print $2 }'
10240K image.img
10240K total
Do you really want to upload the above files (1) to "crash.directory"? (Y/n):
######################################################################################################################################################################################################################################## 100.0%
tauN5dE3fWJe
https://crash.directory/MYkuqn/image.img
Credits
crash.directory is built upon transfer.sh, a shiny piece of Open Source code by DutchCoders
Original creators
Remco Verhoef
Uvis Grinfelds
Current maintainers
Andrea Spacca
Stefan Benten
Copyright and License
Code and documentation copyright 2011-2018 Remco Verhoef. Code and documentation copyright 2018-2020 Andrea Spacca. Code and documentation copyright 2020- Andrea Spacca and Stefan Benten.
Code released under the MIT license.