Use long flags (i.e. --armor) which are easier to understand in examples Co-authored-by: Andrea Spacca <andrea.spacca@gmail.com>
10 KiB
Table of Contents
- Aliases
- Uploading and downloading
- Archiving and backups
- Encrypting and decrypting
- Scanning for viruses
- Uploading and copy download command
- Uploading and displaying URL and deletion token
Aliases
Add alias to .bashrc or .zshrc
Using curl
transfer() {
curl --progress-bar --upload-file "$1" https://transfer.sh/$(basename "$1") | tee /dev/null;
echo
}
alias transfer=transfer
Using wget
transfer() {
wget -t 1 -qO - --method=PUT --body-file="$1" --header="Content-Type: $(file -b --mime-type "$1")" https://transfer.sh/$(basename "$1");
echo
}
alias transfer=transfer
Add alias for fish-shell
Using curl
function transfer --description 'Upload a file to transfer.sh'
if [ $argv[1] ]
# write to output to tmpfile because of progress bar
set -l tmpfile ( mktemp -t transferXXXXXX )
curl --progress-bar --upload-file "$argv[1]" https://transfer.sh/(basename $argv[1]) >> $tmpfile
cat $tmpfile
command rm -f $tmpfile
else
echo 'usage: transfer FILE_TO_TRANSFER'
end
end
funcsave transfer
Using wget
function transfer --description 'Upload a file to transfer.sh'
if [ $argv[1] ]
wget -t 1 -qO - --method=PUT --body-file="$argv[1]" --header="Content-Type: (file -b --mime-type $argv[1])" https://transfer.sh/(basename $argv[1])
else
echo 'usage: transfer FILE_TO_TRANSFER'
end
end
funcsave transfer
Now run it like this:
$ transfer test.txt
Add alias on Windows
Put a file called transfer.cmd
somewhere in your PATH with this inside it:
@echo off
setlocal
:: use env vars to pass names to PS, to avoid escaping issues
set FN=%~nx1
set FULL=%1
powershell -noprofile -command "$(Invoke-Webrequest -Method put -Infile $Env:FULL https://transfer.sh/$Env:FN).Content"
Uploading and Downloading
Uploading with wget
$ wget --method PUT --body-file=/tmp/file.tar https://transfer.sh/file.tar -O - -nv
Uploading with PowerShell
PS H:\> invoke-webrequest -method put -infile .\file.txt https://transfer.sh/file.txt
Upload using HTTPie
$ http https://transfer.sh/ -vv < /tmp/test.log
Uploading a filtered text file
$ grep 'pound' /var/log/syslog | curl --upload-file - https://transfer.sh/pound.log
Downloading with curl
$ curl https://transfer.sh/1lDau/test.txt -o test.txt
Downloading with wget
$ wget https://transfer.sh/1lDau/test.txt
Archiving and backups
Backup, encrypt and transfer a MySQL dump
$ mysqldump --all-databases | gzip | gpg -ac -o- | curl -X PUT --upload-file "-" https://transfer.sh/test.txt
Archive and upload directory
$ tar -czf - /var/log/journal | curl --upload-file - https://transfer.sh/journal.tar.gz
Uploading multiple files at once
$ curl -i -F filedata=@/tmp/hello.txt -F filedata=@/tmp/hello2.txt https://transfer.sh/
Combining downloads as zip or tar.gz archive
$ curl https://transfer.sh/(15HKz/hello.txt,15HKz/hello.txt).tar.gz
$ curl https://transfer.sh/(15HKz/hello.txt,15HKz/hello.txt).zip
Transfer and send email with link (using an alias)
$ transfer /tmp/hello.txt | mail -s "Hello World" user@yourmaildomain.com
Encrypting and decrypting
Encrypting files with password using gpg
$ gpg --armor --symmetric --output - /tmp/hello.txt | curl --upload-file - https://transfer.sh/test.txt
Downloading and decrypting
$ curl https://transfer.sh/1lDau/test.txt | gpg --decrypt --output /tmp/hello.txt
Import keys from keybase
$ keybase track [them] # Encrypt for recipient(s)
$ cat somebackupfile.tar.gz | keybase encrypt [them] | curl --upload-file '-' https://transfer.sh/test.txt # Decrypt
$ curl https://transfer.sh/sqUFi/test.md | keybase decrypt
Scanning for viruses
Scan for malware or viruses using Clamav
$ wget http://www.eicar.org/download/eicar.com
$ curl -X PUT --upload-file ./eicar.com https://transfer.sh/eicar.com/scan
Upload malware to VirusTotal, get a permalink in return
$ curl -X PUT --upload-file nhgbhhj https://transfer.sh/test.txt/virustotal
Upload encrypted password protected files
By default files upload for only 1 download, you can specify download limit using -D flag like transfer-encrypted -D 50 %file/folder%
One line for bashrc
transfer-encrypted() { if [ $# -eq 0 ]; then echo "No arguments specified.\nUsage:\n transfer <file|directory>\n ... | transfer <file_name>" >&2; return 1; fi; while getopts ":D:" opt; do case $opt in D) max_downloads=$OPTARG;; \?) echo "Invalid option: -$OPTARG" >&2;; esac; done; shift "$((OPTIND - 1))"; 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 - .) | openssl aes-256-cbc -pbkdf2 -e > "tmp-$file_name" && cat "tmp-$file_name" | curl -H "Max-Downloads: $max_downloads" -w '\n' --upload-file "tmp-$file_name" "https://transfer.sh/$file_name" | tee /dev/null; rm "tmp-$file_name"; else cat "$file" | openssl aes-256-cbc -pbkdf2 -e > "tmp-$file" && cat "tmp-$file" | curl -H "Max-Downloads: $max_downloads" -w '\n' --upload-file - "https://transfer.sh/$file_name" | tee /dev/null; rm "tmp-$file"; fi; }
Human readable code
transfer-encrypted() {
if [ $# -eq 0 ]; then
echo "No arguments specified.\nUsage:\n transfer <file|directory>\n ... | transfer <file_name>" >&2
return 1
fi
while getopts ":D:" opt; do
case $opt in
D)
max_downloads=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
shift "$((OPTIND - 1))"
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 - .) | openssl aes-256-cbc -pbkdf2 -e > "tmp-$file_name" && cat "tmp-$file_name" | curl -H "Max-Downloads: $max_downloads" -w '\n' --upload-file "tmp-$file_name" "https://transfer.sh/$file_name" | tee /dev/null
rm "tmp-$file_name"
else
cat "$file" | openssl aes-256-cbc -pbkdf2 -e > "tmp-$file" && cat "tmp-$file" | curl -H "Max-Downloads: $max_downloads" -w '\n' --upload-file - "https://transfer.sh/$file_name" | tee /dev/null
rm "tmp-$file"
fi
}
Decrypt using
curl -s https://transfer.sh/some/file | openssl aes-256-cbc -pbkdf2 -d > output_filename
Uploading and copy download command
Download commands can be automatically copied to the clipboard after files are uploaded using transfer.sh.
It was designed for Linux or macOS.
1. Install xclip or xsel for Linux, macOS skips this step
-
install xclip see https://command-not-found.com/xclip
-
install xsel see https://command-not-found.com/xsel
Install later, add pbcopy and pbpaste to .bashrc or .zshrc or its equivalent.
- If use xclip, paste the following lines:
alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'
- If use xsel, paste the following lines:
alias pbcopy='xsel --clipboard --input'
alias pbpaste='xsel --clipboard --output'
2. Add Uploading and copy download command shell function
-
Open .bashrc or .zshrc or its equivalent.
-
Add the following shell script:
transfer() { curl --progress-bar --upload-file "$1" https://transfer.sh/$(basename "$1") | pbcopy; echo "1) Download link:" echo "$(pbpaste)" echo "\n2) Linux or macOS download command:" linux_macos_download_command="wget $(pbpaste)" echo $linux_macos_download_command echo "\n3) Windows download command:" windows_download_command="Invoke-WebRequest -Uri "$(pbpaste)" -OutFile $(basename $1)" echo $windows_download_command case $2 in l|m) echo $linux_macos_download_command | pbcopy ;; w) echo $windows_download_command | pbcopy ;; esac }
3. Test
The transfer command has two parameters:
-
The first parameter is the path to upload the file.
-
The second parameter indicates which system's download command is copied. optional:
-
This parameter is empty to copy the download link.
-
l
orm
copy the Linux or macOS command that downloaded the file. -
w
copy the Windows command that downloaded the file.
-
For example, The command to download the file on Windows will be copied:
$ transfer ~/temp/a.log w
######################################################################## 100.0%
1) Download link:
https://transfer.sh/y0qr2c/a.log
2) Linux or macOS download command:
wget https://transfer.sh/y0qr2c/a.log
3) Windows download command:
Invoke-WebRequest -Uri https://transfer.sh/y0qr2c/a.log -OutFile a.log
Uploading and displaying URL and deletion token
# tempfile
URLFILE=$HOME/temp/transfersh.url
# insert number of downloads and days saved
if [ -f $1 ]; then
read -p "Allowed number of downloads: " num_down
read -p "Number of days on server: " num_save
# transfer
curl -sD - -H "Max-Downloads: $num_down" -H "Max-Days: $num_save"--progress-bar --upload-file $1 https://transfer.sh/$(basename $1) | grep -i -E 'transfer\.sh|x-url-delete' &> $URLFILE
# display URL and deletion token
if [ -f $URLFILE ]; then
URL=$(tail -n1 $URLFILE)
TOKEN=$(grep delete $URLFILE | awk -F "/" '{print $NF}')
echo "*********************************"
echo "Data is saved in $URLFILE"
echo "**********************************"
echo "URL is: $URL"
echo "Deletion Token is: $TOKEN"
echo "**********************************"
else
echo "NO URL-File found !!"
fi
else
echo "!!!!!!"
echo "\"$1\" not found !!"
echo "!!!!!!"
fi