وبلاگ مصطفی ستاری

یک وبلاگ برنامه نویسی دیگر

یک وبلاگ برنامه نویسی دیگر

۳ مطلب با موضوع «نکته‌های کوچک» ثبت شده است

pipes, redirection and xargs در لینوکس

ریدارکشن برای ارسال خروجی به یک فایل یا استریم استفاده می‌شه. (ریدایرکت کردن stdout یا stderr)
$ thing1 > thing2
برنامه thing1 اجرا شده و خروجی اون به فایل thing2 ریدایرکت می‌شه.
اگر بخواهیم خروجی thing1 را به thing2 ارسال کنیم دستور به شکل زیر خواهد شد:
$ thing1 > tempFile && thing2 < tempFile
به جای کار بالا از پایپ استفاده می‌شه.
پایپ برای ارسال خروجی یک برنامه به یک برنامه دیگر استفاده می‌شه. (می‌شه از اون عنوان شکل خاص ریدایرکشن یاد کرد)
$ thing1 | thing2
بعضی وقتا بعضی برنامه‌ها استریم به عنوان ورودی قبول نمی‌کنند، و ما می‌خوایم خروجی یک فایل رو به صورت آرگومان بهشون بفرستیم از xargs استفاده می‌کنیم.
xargs میاد خروجی رو به صورت استریم (یا فایل) می‌خونه و به صورت آرگومان به برنامه‌ای که بهش می‌دیم پاس می‌ده.
مثلا
$ echo 1 2 3 4 | xargs echo
1 2 3 4
یا مثلا دستور زیر میگه که به ازای هر ۲ آرگومان یک دستور رو اجرا کن:
$ echo 1 2 3 4 | xargs -n 2
1 2
3 4
شماره فایل (یا بهتر بخوایم بگیم file descriptor) برای stdin=0 برای stdout=1 و برای stderr=2 هست و می‌تونیم خروجی هر کدوم رو به یک جایی ریدایرکت کنیم. مثلا:
$ echo test 1> outfile
همچنین با استفاده از &> می تونیم یک استریم رو به یک شماره فایل ریدایرکت کنیم. (به جای فایل)
$ echo something 1>&2 > outfile
و در نهایت اگر بخوایم خروجی رو هم به فایل بفرستیم و هم در صفحه نمایش نشون بدیم از tee استفاده می‌کنیم:
echo something | tee outfile
که معادل دستور زیره:
$ echo something | tee /dev/tty >> outfile
نتیجه اخلاقی:
# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2

Note that that last one will not direct stderr to outfile2 - it first redirects it to what stdout was when the argument was encountered ( outfile1), and then redirects stdout to outfile2.

یعنی اینکه اول stderr رو به استریم فعلی که نقش stdout رو زمان اجرای دستور اول بازی می‌کنه، که outfile1 هست ریدایرکت می‌کنه و بعدش  stdout رو به outfile2 ریدایرکت می‌کنه. (یعنی stderr به outfile2 ریدایرکت نمی‌شه بلکه به stdout قبلی (نرمال) ریدایرکت می‌شه معمولا صفحه نمایش)
مثال زیر بهتر این نکته رو نشون می‌ده:
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1

$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory

اطلاعات بیشتر [+، +، +، +، +]

مشکل کاربر sa در SQLServer Express

یه سری نکته‌های کوچیکی هست، بس که آدم کم باهاشون سروکله می‌زنه هی فراموش می‌کنه باز کلی گوگلی می‌کنه تا دوباره یادش بیاد. یکیش همین مشکل کاربر sa توی SQLServer هست.

موقعی که نسخه Express پایگاه‌داده SQLServer رو نصب می‌کنیم به صورت پیشفرض اون تیک Mixed Authentication نخورده و با اینکه پسورد رو برای sa تنظیم کردیم و فعالش هم کردیم و همه چیزش رو به راهه، باز هم لاگین نمی‌کنه. آخرش متوجه می‌شه آدم که یادش رفته این قابلیت رو فعال کنه!

بعد از انجام عملیات، سرویس رو ریست کنید.



چند نکته هنگام کار با گیت

نکته ۱: کم کردن حجم دانلود

وقتی می‌خوایم یک مخزن گیت یک پروژه خیلی بزرگ رو clone اش کنیم، معمولا این پروژه‌ها تاریخچه طولانی‌ای دارند و این باعث می‌شه که حجم دانلود ما خیلی افزایش پیدا کنه. مثلا پروژه‌ای که ۱۰ مگ هست یهو می‌شه ۲۵۰ مگ. این در حالیه که ما فقط نسخه جاری برنامه رو می‌خوایم و به تاریخچه‌ش اصلا کاری نداریم. در این حالت می‌تونیم از پارامتر depth به شکل زیر استفاده کنیم:

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

همچین با استفاده از پارامتر branch می‌تونیم فقط یه شاخه از اون مخزن رو دانلود کنیم.

git clone --depth 1 --branch master https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

نکته ۲: ست کردن پراکسی به صورت موقت

با توجه به بسته بودن درهای خیلی از سایت‌ها مثل گوگل کد به روی ایرانیان، گاهی لازم می‌شه که از یک پراکسی برای دور زدن این محدودیت‌ها استفاده کنیم. برای استفاده از پراکسی هنگامی که می‌خوایم یک مخزن رو clone کنیم دو راه وجود داره:

یکی اینکه یه متغیر محیطی (Environment Variable) به نام http_proxy (یا https_proxy بسته به پروتکل سرویس‌دهنده گیت) ست کنیم توی شل جاری. مثلا توی محیط cmd در ویندوز:

set http_proxy = 127.0.0.1:1337

یا در لینوکس:

http_proxy = 127.0.0.1:1337
export $http_proxy

این تنظیمات تا زمانی که session فعلی فعاله یا اینکه دستی پاکش نکردیم، برقراره.


روش دیگه اینه که قبل از clone کردن پارامتر http.proxy (یا https.proxy) رو با دستور config ست کنیم و بعد از اون دوباره پاکش کنیم.

## set proxy
$ git config --global http.proxy http://proxyuser:proxypwd@proxy.server.com:8080

## clone the repo
git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

## unset proxy
git config --global --unset http.proxy

اطلاعات بیشتر [+,+]