30

Is it possible to use pastebin (may be via their "API" functionality) inside bash shell scripts? How do I send http-post? How do I get back the URL?

Chris Martin
  • 30,334
  • 10
  • 78
  • 137
litro
  • 509
  • 2
  • 6
  • 8
  • 1
    FYI, pastebin.com is full of ads for anyone not using an appropriate browser plugin. Please consider using a different pastebin. http://ix.io/, f'rinstance, both (1) does not show ads, and (2) includes instructions for posting to it from major shells right on the homepage. – Charles Duffy Jun 09 '14 at 23:08
  • 1
    @CharlesDuffy The only problem with that is longevity. Pastebin is so far the only pastebin to have stood the test of time, having been around since 2002. Who knows how long these other tools are gonna last for before their respective sites go down from a DNS expiry, to a failure to pay the host (abandonment), to the host going bankrupt. – Braden Best Mar 30 '18 at 07:23

11 Answers11

24

As pastebin.com closed their public api, I was looking for alternatives.

Sprunge is great. Usage:

<command> | curl -F 'sprunge=<-' http://sprunge.us

or, as I use it:

alias paste="curl -F 'sprunge=<-' http://sprunge.us"
<command> | paste
Sled
  • 18,541
  • 27
  • 119
  • 168
user2291758
  • 715
  • 8
  • 19
  • +1, with the caveat that it'd be better to provide a function than an alias -- functions can reorder arguments, do logic, be used in noninteractive shells, etc. – Charles Duffy Jun 09 '14 at 23:09
  • 2
    Getting "500 Internal Server error" Also, last github commit was in 2014 – Aleksandr Levchuk Jul 21 '18 at 19:47
  • If you want to use pastebin instead of sprunge, see my answer [here](https://stackoverflow.com/a/58440856/7872793) – Connor Feb 17 '20 at 19:23
8

The documentation says that you need to submit a POST request to

http://pastebin.com/api_public.php

and the only mandatory parameter is paste_code, of type string is the paste that you want to make.

On success a new pastebin URL will be returned.

You can easily do this from your bash shell using the command curl.

curl uses the -d option to send the POST data to the specified URL.

Demo:

This demo will create a new paste with the code:

printf("Hello..I am Codaddict");

From your shell:

$ curl -d 'paste_code=printf("Hello..I am Codaddict");' 'http://pastebin.com/api_public.php'
http://pastebin.com/598VLDZp
$

Now if you see the URL http://pastebin.com/598VLDZp, you'll see my paste :)

Alternatively you can do it using the wget command which uses the option --post-data to sent POST values.

I've tried this command it works fine:

wget --post-data 'paste_code=printf("Hello..I am Codaddict");' 'http://pastebin.com/api_public.php'
codaddict
  • 445,704
  • 82
  • 492
  • 529
  • 16
    This has now been disabled, there is a new Pastebin api – jayunit100 May 16 '13 at 03:06
  • 1
    Details on the new API can be found here: https://pastebin.com/api. You need a `Developer API Key` at a minimum to be able to post. Have posted updated details below. – Vishal May 11 '18 at 02:49
7

Put the following in your .bashrc:

sprunge() {
  if [[ $1 ]]; then
    curl -F 'sprunge=<-' "http://sprunge.us" <"$1"
  else
    curl -F 'sprunge=<-' "http://sprunge.us"
  fi
}

...and then you can run:

sprunge filename # post file to sprunge

...or...

some_command | sprunge # pipe output to sprunge
Charles Duffy
  • 280,126
  • 43
  • 390
  • 441
4

https://paste.c-net.org/ has a simpler API than all of them. Simply "POST" to it.

From the website:

Upload text using curl:
$ curl -s --data 'Hello World!' 'https://paste.c-net.org/'

Upload text using wget:
$ wget --quiet -O- --post-data='Hello World!' 'https://paste.c-net.org/'

Upload a file using curl:
$ curl --upload-file @'/tmp/file' 'https://paste.c-net.org/'

Upload a file using wget:
$ wget --quiet -O- --post-file='/tmp/file' 'https://paste.c-net.org/'

Upload the output of a command or script using curl:
$ ls / | curl --upload-file - 'https://paste.c-net.org/'
$ ./bin/hello_world | curl -s --data-binary @- 'https://paste.c-net.org/'

You can also simply use netcat. Unlike termbin, paste.c-net.org won't time out if your script takes more than 5 seconds to produce its output.

$ { sleep 10; ls /; } | nc termbin.com 9999
$ { sleep 10; ls /; } | nc paste.c-net.org 9999
https://paste.c-net.org/ExampleOne
bolt
  • 169
  • 1
  • 5
2

The API for posting to pastebin has changed, since posted by codaddict.
Details can be found at this link: https://pastebin.com/api

Example: curl -d 'api_paste_code=printf("Hello..\n I am Codaddict");' \ -d 'api_dev_key=<get_your_own>' \ -d 'api_option=paste' 'http://pastebin.com/api/api_post.php'

There are three essential fields as of now:
api_dev_key -> You need to create a login on pastebin.com in order to get that
api_option -> Format in which to post
api_paste_code -> Text you want to post

Vishal
  • 3,178
  • 2
  • 34
  • 47
2

Two other answers (from circa 2014) point to http://sprunge.us, which is designed to be used like this...

curl --form 'sprunge=@yourfile.txt' sprunge.us

However, as of 2018, sprunge.us has a tendency to be overloaded and return 500 Internal Server Error to every request. For files up to at least 300 KB but not as high as 2.8 MB, I have had good luck with the very similar service at http://ix.io:

curl --form 'f:1=@yourfile.txt' ix.io

For files up to at least 2.8 MB (and maybe higher, I don't know), I've found the more highly polished https://transfer.sh. It recommends a slightly different and simpler command line, and requires https (it won't work without it):

curl --upload-file yourfile.txt https://transfer.sh
Quuxplusone
  • 23,928
  • 8
  • 94
  • 159
2

I have found that Sprunge is currently down, but dpaste.com has a simple API.

To post from STDIN

curl -s -F "content=<-" http://dpaste.com/api/v2/

from a file foo.txt

cat foo.txt | curl -s -F "content=<-" http://dpaste.com/api/v2/

to post a string

curl -s -F "content=string" http://dpaste.com/api/v2/

The response will be a plain text URL to the paste.


Nb: the trailing / in the URL http://dpaste.com/api/v2/ seems necessary

Sled
  • 18,541
  • 27
  • 119
  • 168
  • There's also a [dpaste.sh](https://hg.sr.ht/~paulbissex/dpaste-tools/browse/dpaste.sh) shell script that uses that API. – Paul Bissex Nov 17 '20 at 16:20
1

Easiest way to post to pastebin

echo 'your message' | sed '1s/^/api_paste_code=/g' | sed 's/$/\%0A/g' | curl -d @- -d 'api_dev_key=<your_api_key>' -d 'api_option=paste' 'http://pastebin.com/api/api_post.php'

Just change the <your_api_key> part and pipe whatever you want into it.

The sed invocations add the api_paste_code parameter to beginning of the message and add a newline at the end of each line so it can handle multiline input. The @- tells curl to read from stdin.

A Bash Function You Can Paste

For easy reuse, make it a bash function (copy and paste this into your terminal and set the API_KEY field appropriately:

pastebin () {
  API_KEY='<your_api_key>'
  if [ -z $1 ]
  then
    cat - | sed '1s/^/api_paste_code=/g' | sed 's/$/\%0A/g' | curl -d @- -d 'api_dev_key='"$API_KEY"'' -d 'api_option=paste' 'http://pastebin.com/api/api_post.php'
  else
    echo "$1" | sed '1s/^/api_paste_code=/g' | sed 's/$/\%0A/g' | curl -d @- -d 'api_dev_key='"$API_KEY"'' -d 'api_option=paste' 'http://pastebin.com/api/api_post.php'
  fi
  printf '\n'
}

You can run it with either:

pastebin 'your message'

or if you need to pipe a file into it:

cat your_file.txt | pastebin

Community
  • 1
  • 1
Connor
  • 4,216
  • 2
  • 29
  • 40
  • Can you use pastebin with the api-key in a way that the URL you have is always the same? Let's say I want to share a textfile within every minute via pastebin, but the other party does only know one hardcoded pastebin URL. Is that possible? – cs.lev Sep 04 '20 at 11:24
  • Idk if you can use a fixed url. You’d have to check pastebin’s api documentation. Let me know what you find out @cs.lev – Connor Sep 04 '20 at 14:23
  • 1
    I figured out, it turns out that pastebin does not support that...only new pastes can be made and old ones can be deleted :S I changed to github gists and git pull/push commands instead :) – cs.lev Sep 07 '20 at 10:17
1

To built upon Vishal's answer, pastebin has upgraded to only use HTTPS now:

curl -d 'api_paste_code=printf("Hello World");' \
     -d 'api_dev_key=<your_key>' \
     -d 'api_option=paste' 'https://pastebin.com/api/api_post.php'

You don't have to specify the -X POST parameter

Additional details can be found here: https://pastebin.com/doc_api#1

Robert C
  • 65
  • 1
  • 3
  • 9
0

Based on another answer on this page, I wrote the following script which reads from STDIN (or assumes output it piped into it).

This version allows for arbitrary data which is URI escaped (by jq).

#!/bin/bash

api_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

curl -d "api_paste_code=$(jq -sRr @uri)" \
     -d "api_dev_key=$api_key" \
     -d 'api_option=paste' 'https://pastebin.com/api/api_post.php'

echo  # By default, there's no newline
Tom Hale
  • 40,825
  • 36
  • 187
  • 242
0

I am a bit late to this post, but I created a little tool to help with this.

https://pasteshell.com/

Feel free to check it out and let me know what you think.

Thanks,