transfer.sh/examples.md
Alex Mayer 54b4f1aa86
Update Encryption Examples (#592)
Use long flags (i.e. --armor) which are easier to understand in examples

Co-authored-by: Andrea Spacca <andrea.spacca@gmail.com>
2024-02-22 18:39:39 +09:00

10 KiB

Table of Contents

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 /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
$ 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

  1. Open .bashrc or .zshrc or its equivalent.

  2. 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:

  1. The first parameter is the path to upload the file.

  2. The second parameter indicates which system's download command is copied. optional:

    • This parameter is empty to copy the download link.

    • l or m 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