如何从 shell 脚本中使用 pastebin?

Posted

技术标签:

【中文标题】如何从 shell 脚本中使用 pastebin?【英文标题】:How to use pastebin from shell script? 【发布时间】:2011-04-30 03:52:18 【问题描述】:

是否可以在 bash shell 脚本中使用 pastebin(可能通过他们的"API" functionality)?如何发送http-post?如何取回网址?

【问题讨论】:

仅供参考,pastebin.com 上到处都是针对不使用适当浏览器插件的人的广告。请考虑使用不同的粘贴箱。 ix.io, f'rinstance, (1) 不显示广告,(2) 包括从主页上的主要外壳发布到它的说明。 @CharlesDuffy 唯一的问题是寿命。 Pastebin 是迄今为止唯一经受住时间考验的 pastebin,自 2002 年以来一直存在。谁知道这些其他工具会持续多久,直到它们各自的站点从 DNS 到期到无法向主机付款(放弃),寄给即将破产的主人。 【参考方案1】:

由于 pastebin.com 关闭了他们的公共 api,我一直在寻找替代方案。

Sprunge 很棒。用法:

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

或者,正如我使用的那样:

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

【讨论】:

+1,需要注意的是提供一个函数比提供一个别名更好——函数可以重新排序参数、执行逻辑、用于非交互式 shell 等。 Getting "500 Internal Server error" 另外,最后一次 github 提交是在 2014 年 如果你想用pastebin代替srunge,看我的回答here【参考方案2】:

documentation 表示你需要提交一个POST 请求到

http://pastebin.com/api_public.php

唯一的强制参数是paste_code,字符串类型的就是你要制作的粘贴。

成功后将返回一个新的pastebin URL。

您可以在 bash shell 中使用命令curl 轻松完成此操作。

curl 使用-d 选项将POST 数据发送到指定的URL。

演示:

此演示将使用代码创建一个新的粘贴:

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

从你的外壳:

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

现在,如果您看到 URL http://pastebin.com/598VLDZp,您将看到我的粘贴 :)

或者您可以使用wget 命令执行此操作,该命令使用选项--post-data 发送POST 值。

我试过这个命令它工作正常:

wget --post-data 'paste_code=printf("Hello..I am Codaddict");' 'http://pastebin.com/api_public.php'

【讨论】:

这个现在已经被禁用了,有一个新的Pastebin api 可以在此处找到有关新 API 的详细信息:pastebin.com/api。您至少需要Developer API Key 才能发帖。已在下面发布了更新的详细信息。【参考方案3】:

将以下内容放入您的.bashrc

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

...然后你可以运行:

sprunge filename # post file to sprunge

...或...

some_command | sprunge # pipe output to sprunge

【讨论】:

【参考方案4】:

自 codaddict 发布以来,用于发布到 pastebin 的 API 已更改。 详情可参考此链接:https://pastebin.com/api

示例: 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'

到目前为止,共有三个基本字段:api_dev_key -> 您需要在 pastebin.com 上创建一个登录帐户才能获得该帐户api_option -> 发布格式api_paste_code -> 你想发的文字

【讨论】:

【参考方案5】:

https://paste.c-net.org/ 的 API 比所有这些都简单。只需“发布”即可。

来自网站:

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

您也可以简单地使用 netcat。与 termbin 不同,如果您的脚本生成输出的时间超过 5 秒,paste.c-net.org 不会超时。

$  sleep 10; ls /;  | nc termbin.com 9999
$  sleep 10; ls /;  | nc paste.c-net.org 9999
https://paste.c-net.org/ExampleOne

【讨论】:

【参考方案6】:

另外两个答案(大约从 2014 年开始)指向 http://sprunge.us,它被设计成这样使用...

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

但是,截至 2018 年,sprunge.us 有过载的趋势,并为每个请求返回 500 Internal Server Error。对于至少 300 KB 但不超过 2.8 MB 的文件,我在 http://ix.io 提供了非常相似的服务,我很幸运:

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

对于至少 2.8 MB(也许更大,我不知道)的文件,我发现了更高级的 https://transfer.sh。它建议使用稍微不同且更简单的命令行,并且需要 https(没有它就无法工作):

curl --upload-file yourfile.txt https://transfer.sh

【讨论】:

【参考方案7】:

我发现 Sprunge 当前已关闭,但 dpaste.com has a simple API。

从 STDIN 发帖

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

来自文件foo.txt

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

发布一个字符串

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

响应将是粘贴的纯文本 URL。


注意: URL http://dpaste.com/api/v2/ 中的尾随 / 似乎是必要的

【讨论】:

还有一个使用该 API 的 dpaste.sh shell 脚本。【参考方案8】:

基于 Vishal 的回答,pastebin 现在已升级为仅使用 HTTPS:

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'

您不必指定-X POST 参数

可在此处找到更多详细信息: https://pastebin.com/doc_api#1

【讨论】:

【参考方案9】:

发布到 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'

只需更改 &lt;your_api_key&gt; 部分,然后将任何你想要的东西用管道输入即可。

sed 调用将api_paste_code 参数添加到消息的开头,并在每行的末尾添加一个换行符,以便它可以处理多行输入。 @- 告诉 curl 从标准输入读取。

可以粘贴的 Bash 函数

为了便于重复使用,请将其设为 bash 函数(将其复制并粘贴到您的终端并适当地设置 API_KEY 字段:

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'

您可以使用以下任一方式运行它:

pastebin 'your message'

或者如果您需要将文件导入其中:

cat your_file.txt | pastebin

【讨论】:

您能否使用带有 api-key 的 pastebin 以使您拥有的 URL 始终相同?假设我想在每一分钟内通过 pastebin 共享一个文本文件,但对方只知道一个硬编码的 pastebin URL。这可能吗? Idk 如果您可以使用固定网址。你必须查看 pastebin 的 api 文档。让我知道你发现了什么@cs.lev 我想通了,原来 pastebin 不支持...只能制作新的粘贴,可以删除旧的粘贴:SI 改为 github gists 和 git pull/push 命令: )【参考方案10】:

基于another answer on this page,我编写了以下脚本,该脚本从 STDIN 读取(或假设输出通过管道输入)。

此版本允许使用 URI 转义的任意数据(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

【讨论】:

【参考方案11】:

我写这篇文章有点晚了,但我创建了一个小工具来帮助解决这个问题。

https://pasteshell.com/

请随时查看并告诉我您的想法。

谢谢,

【讨论】:

服务已死 它仍在运行。你能告诉我什么不适合你吗?对您的反馈非常感兴趣。 好的。现在回来了。上次我使用浏览器访问域时网站超时(12 月 3 日)。

以上是关于如何从 shell 脚本中使用 pastebin?的主要内容,如果未能解决你的问题,请参考以下文章

使用 shell 脚本从文件中测试其余 web 服务时如何获取成功计数、失败计数和失败原因

如何使用 shell 脚本从 git repo 打印最新的提交 ID

如何从shell脚本中的变量中删除回车

如何在 shell 脚本中使用 sed 从文件的每一行中删除单词? [复制]

当两者都在运行时,如何将消息从一个 shell 脚本发送到另一个 shell 脚本?

如何从 haskell 程序调用 bash 或 shell 脚本?