开发者

How to use pastebin from shell script?

开发者 https://www.devze.com 2023-01-21 15:36 出处:网络
Is it possible to use pastebin (may be via their \"API\" functionality) inside bash shell scr开发者_如何学JAVAipts? How do I send http-post? How do I get back the URL?As pastebin.com closed their publ

Is it possible to use pastebin (may be via their "API" functionality) inside bash shell scr开发者_如何学JAVAipts? How do I send http-post? How do I get back the URL?


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


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'


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


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


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


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


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


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


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


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


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,

0

精彩评论

暂无评论...
验证码 换一张
取 消