در حال نوشتن چند خط کد بودم و نیاز داشتم که هربار کد را در یک کانال آیآرسی بفرستم تا کد بازبینی و اشتباهاتم گوشزد شود. از یک پیستبین(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>
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>
این خطوط نشان میدهند که:
دادهها به کجا باید فرستاده شوند(خط ۱)
- نام دادهها چیست(خط ۲ کد یا متن ارسالی، خط ۴ نوع کد ارسالی و خط ۱۸ نشان دهندهی زمان انقضای کد ارسالی است)
خب حالا در خط فرمان وارد میکنیم:
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 استفاده کردم که همان معنی را میدهد اما کوتاهتر است.
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