در حال نوشتن چند خط کد بودم و نیاز داشتم که هربار کد را در یک کانال آی‌آر‌سی بفرستم تا کد بازبینی و اشتباهاتم گوشزد شود. از یک پیست‌بین(pastebin) استفاده میکردم و هربار پیوند نسخه جدید کد را به کانال میفرستادم اما این پروسه دردناک و آزار دهنده بود:

  • تغییر کد
  • کپی آن به بریده‌دان(clipboard) سیستم پنجره‌ی اکس
  • وارد شدن به apaste.info با مرورگر وب
  • وارد کردن کد و گرفتن پیوند کد
  • فرستادن کد به کانال

برای همین رفتم دنبال اینکه این فرآیند را کوتاه‌تر و خوش‌آیندتر کنم. برای اینکار از curl استفاده کردم. با اینکه کرل برای اکثر سیستم‌عامل‌ها از جمله داس، ویندوز، مک، شبه‌یونیکس‌ها و ... وجود دارد اما همچین چیزی بیشتر بدرد کاربرانی میخورد که با خط فرمان زیاد کار میکنند و این کاربران در ویندوز بدلیل عدم وجود یک خط فرمان قوی، کمتر دیده میشوند.برای اینکار بایست منبع پست‌بین آپاچی را میخواندم:

<form action="/p/new" method="post">
        <textarea name="paste" style="width: 650px; height: 480px;" id="paste" placeholder="Put your pasted text here"></textarea><br/>
        <label for="type">Type: </label>
        <select name="type" id="type">
          <option value="nocode">Plain text</option>
          <option value="config">Apache configuration</option>
          <option value="diff">Diff/Patch</option>
          <option value="html">(X)HTML</option>
          <option value="c">C/C++</option>
          <option value="erlang">Erlang</option>
          <option value="lua">Lua</option>
          <option value="perl">Perl</option>
          <option value="php">PHP</option>
          <option value="sh">Shell Script</option>
          <option value="python">Python</option>
          <option value="java">Java</option>
        </select>&nbsp;&nbsp;&nbsp;
        Expires: <select name="expires">
                  <option value="day">One day</option>
                  <option value="week">One week</option>
                  <option value="month">One month</option>
                  <option value="never" selected>Never</option>
                  </select>

این خطوط نشان میدهند که:

  1. داده‌ها به کجا باید فرستاده شوند(خط ۱)

  2. نام داده‌ها چیست(خط ۲ کد یا متن ارسالی، خط ۴ نوع کد ارسالی و خط ۱۸ نشان دهنده‌ی زمان انقضای کد ارسالی است)

خب حالا در خط فرمان وارد میکنیم:

curl -v --form paste=@myfile --form type=nocode https://apaste.info/p/new

به جای myfile آدرس هر پرونده دلخواه متنی را وارد کنید. فیلد expires به نظر می‌آید که اختیاری است. @myfile یعنی اینکا محتویات پرونده myfile را بخوان و در فیلد paste به آدرسی که دادیم ارسال کن. بعد از ارسال این داده‌ها کارگزار(سرور) ما را به صفحه‌ای که کد ما در آن دارد هدایت میکند. از -v استفاده میکنیم تا بفهمیم این تغییر مسیر به کجاست:

Farooq@pcworms:~$ curl -v --form paste=@./something.lisp --form type=nocode https://apaste.info/p/new
*   Trying 46.4.102.172...
* TCP_NODELAY set
*   Trying 2a01:4f8:140:9425::...
* TCP_NODELAY set
* Immediate connect fail for 2a01:4f8:140:9425::: Network is unreachable
* Connected to apaste.info (46.4.102.172) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server did not agree to a protocol
* Server certificate:
*  subject: CN=apaste.info
*  start date: Jun 12 22:45:12 2018 GMT
*  expire date: Sep 10 22:45:12 2018 GMT
*  subjectAltName: host "apaste.info" matched cert's "apaste.info"
*  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
*  SSL certificate verify ok.
> POST /p/new HTTP/1.1
> Host: apaste.info
> User-Agent: curl/7.58.0
> Accept: */*
> Content-Length: 350
> Content-Type: multipart/form-data; boundary=------------------------7ade773704240212
>
< HTTP/1.1 302 Found
< Date: Wed, 04 Jul 2018 09:54:10 GMT
< Server: Apache/2.4.10 (Debian)
< Location: /oGVf
< Content-Length: 0
* HTTP error before end of send, stop sending
<
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, Client hello (1):

خب آدرس کد من apaste.info/oGVf است.حالا با grep و awk تنها آدرس را که نیاز داریم برمیدارم. به جای --form از -F استفاده کردم که همان معنی را می‌دهد اما کوتاه‌تر است.

curl -v -F paste=@./something.lisp -F type=nocode https://apaste.info/p/new 2>&1 | grep Location | awk '{print $3}'

2> در بش به این معناست که stderr را به جایی که ما میخواهیم، در اینجا خروجی استاندارد یا &1، بفرست(برای اطلاعات بیشتر در این مورد اینجا و اینجا را بیینید). بایست اینکار را بکنیم تا بعدا grep بتواند آنرا بخواند. awk نیز تنها آدرس را برای ما نگه میدارد. خروجی یک آدرس نسبی شبیه این است:

/Rgsy

حالا یک تابع مینویسیم که اینکار را برای ما انجام دهد:

apaste() { echo -n apaste.info; curl -v -F paste=@$1 -F type=nocode https://apaste.info/p/new 2>&1 | grep Location | awk '{print $3}' }

$1 در بش به معنی پارامتر اول است. مثلا اینجا:

mycoolfunction Farooq is a pcworm

پارامتر اول Farooq، دوم is است و همینطور الی آخر. حالا این تعریف تابع را میتوانید در .bash_profile قرار دهید و هر زمان نیاز داشتید از خط فرمان آنرا صدا زده و یک پیوند دریافت کنید.

apaste path/to/file.txt