#!/usr/bin/perl
#===============================================================================
# DESCRIPTION: Простая отправлялка вывода команды или тела файла на pastebin. Определяет подсветку
# для некоторых видов указанных через -i файлов.
#
# USAGE: cat file.txt | pastebinput.pl или pastebinput.pl -i file.txt
#
# OPTIONS: -i [input_file]; -u [server_url]; -s [syntax]; -e [expire=(f,m,d)]; -r [remember=(0,1)]; -n [name]
# AUTHOR: dimio
# URL: http://dimio.org?p=204
# VERSION: 0.9
# CREATED: 2010-01-31
#LAST MODIFIED: 2021-04-11
#===============================================================================
require 5.8.8;
use warnings;
use strict;
use encoding 'utf8', STDOUT => 'utf8';
use LWP::UserAgent;
use HTTP::Cookies;
use Getopt::Std;
our $VERSION = '0.9';
my %options = ( # Настройки по умолчанию:
'u' => 'http://pastebin.com', # адрес сервера
'e' => 'd', # срок хранения: d - день, m - месяц, f - постоянно
'r' => 0, # помнить ли отправителя
);
getopts('s:u:e:i:n:rh', \%options);
if ($options{h}) {
usage($VERSION);
exit;
}
if ( $options{i} && !$options{s} ) {
simple_sintax_detect(\%options);
}
my $msg_body = read_input_file(\%options);
my $ua = ua_init();
my $msg_url = send_to_pastebin($ua, \%options, $msg_body);
print $msg_url,"\n";
exit 0;
sub simple_sintax_detect {
my $options = shift;
my $f_ext = $1 if $options->{i} =~ /^[\wа-я-]+\.([a-z]{1,4})$/i;
if ($f_ext =~ /^(?:txt|text|)$/i) {
$options->{s} = 'text';
}
elsif ($f_ext =~ /^(?:pl|cgi)$/i) {
$options->{s} = 'perl';
}
elsif ($f_ext =~ /^sh$/i) {
$options->{s} = 'bash';
}
elsif ($f_ext =~ /^php$/i) {
$options->{s} = 'php';
}
}
sub read_input_file {
my $options = shift;
if ( !$options->{i} ) {
while (<>) {
$msg_body .= $_;
}
}
elsif ( $options->{i} ) {
open(INFILE, '<', $options->{i}) or die "Can't open $options->{i}: $!\n";
while () {
$msg_body .= $_;
}
close(INFILE);
}
return $msg_body;
}
sub send_to_pastebin {
my $ua = shift;
my ($options, $msg_body) = @_;
my $response = $ua->post( $options->{u},
[
format => $options->{s},
code2 => $msg_body,
poster => $options->{n},
paste => 'Send',
remember => $options->{r},
expiry => $options->{e},
],
);
return $response->status_line unless $response->is_success;
return $response->request->uri;
}
sub ua_init {
my $cookies=HTTP::Cookies->new('file'=>'./cookies.lwp','autosave'=>0);
my $ua = LWP::UserAgent->new(
'agent' => 'pastebinput - pastebin service agent; dimio@dimio.org',
'cookie_jar' => $cookies,
'requests_redirectable' => ['GET', 'POST'],
);
$ua->default_header(
'Accept' => 'text/html, application/xml;q=0.9, application/xhtml+xml, */*;q=0.1',
'Accept-Charset' => 'utf-8; *;q=0.1',
'Accept-Language' => 'ru,en-us;q=0.7,en;q=0.3',
'Accept-Encoding' => 'deflate, gzip, x-gzip, *;q=0',
);
return $ua;
}
sub usage {
my $ver = shift;
print < (1-я форма)
или: COMMAND | pastebinput (2-я форма)
В первой форме на сервер будет отправлен указанный файл input_file.
Во второй форме на сервер будет отправлен результат вывода COMMAND.
Ключи:
-s [text, perl, ...] Синтаксис файла для подсветки на pastebin;
-u [http://server.com] URL сервера (для отличных от pastebin.org);
-e [d, m, f] Срок хранения данных на сервере:
d - один день, m - месяц, f - постоянно;
-i [input_file] Имя входящего файла, текст которого будет
отправлен на pastebin сервер;
-n [username] Имя отправителя (иначе - anonimous);
-r Помнить отправителя (если установлена);
-h Вывод данной справки и завершение программы;
Пример использования: pastebinput -r -s perl -e m -n User -i ./test.pl
EOF
}