Linux’ta Birkaç Komut – find

Bazen bir proje içerisinde veya hangi dosyada olduğunu merak ettiğiniz yazı vb. bir içerik oldu mu ? Örneğin bilmemne_fonksiyonu hangi dosyada ? ya da bilmemne_degiskeni hangi dosyada gibi bir arama gereği duydudunuz mu ? Ben / Biz duyduk ve linux üzerindeki nimetlerden yararlanalım dedik.

Linux üzerinde aranan kelime hangi dosyada ?

Komut ;
# find /DOSYA_YOLU -type f -print | xargs grep “ARANACAK_KELIME_VB

Örnek ;
# find /www/var/html/ -type f -print | xargs grep “clear_db_(

Peki aradığımızı bulduk hemde birkaç dosyada çıktı. Çokta bir önemi yok. Birden fazla dosyayı aynı anda değiştirmek istiyorsanız ise;

Komut ;
# find /DOSYA_YOLU -type f -exec sed -i ‘s/ARANAN_KELIME/YENI_KELIME/g’ {} \;

Örnek ;
# find /www/var/html/ -type f -exec sed -i ‘s/clear_db_(/clear_database_(/g’ {} \;

 

Umarım işinize yarayan ufak komutlar olmuştur..

nginx-generator ile Reverse Proxy Oluşturma

Herhangi bir panel olmadan düz bir linux sunucu üzerinde NGINX ile birlikte Reverse Proxy yapmak isterseniz nginx-generator toolu ile birlikte hızlıca işlem yapabilirsiniz.

Örnek;

nginx-generator \
--name diplomasizmuhendis.com \
--domain diplomasizmuhendis.com \
--type proxy \
--var host=(127.0.0.1  -- localhost) \
--var port=8080 \
/etc/nginx/sites-enabled/diplomasizmuhendis.com


Domaininizi belirttikten sonra “–var host=” bölümünde ister localhost ister 127.0.0.1 veya sunucy IP adresini yazabilirsiniz. Network konfigürasyonunuza göre yapacağınız senaryoya göre değişecektir. Bu arada sunucunun IP adresi yerine Reverse Proxy yapan sunucu ile Application sunucunuz farklı olabilir 🙂

“–var pot=8080” local olarak çalışan uygulamanızın hangi portta çalışacağını belirtmeniz gerekiyor.

Reverse Proxy harici olarak NGINX konfigürasyonlarınızıda hızlıca nginx-generator ile yapabilirsiniz.

MongoDB Veritabanı Üzerindeki Tüm Kayıtlar

MongoDB ile ufak denemeler sırasında veritabanı üzerindeki toplam kayıt sayısını merak etmiştim. Yabancısı olduğum MongoDB ilk başlarda biraz zorlasada bazı konularda çok da yormadı bizi. Merak sonrası küçük bir kod bloğu ile işlemin yapılabildiğini gördüm. JavaScript ( Tam olarak böyle olmasa da 🙂 ) kodları ile birlikte ufak değişiklikler yapıp Collection’lara ait analizler yapabilirsiniz.

MongoDB tarafında tavsiyem olarak şunu söyleyebilirim.  I/O ( input / output – giriş / çıkış ) işlemlerinin yapıldığı bir sistem üzerinde oldukça stabil çalıştığını gördük. İlerleyen süreçte bir sıkıntı çıkartmaz ise birçok NoSQL projelerinizde oldukça rahat bir şekilde kullanabilirsiniz. Kurulum sırasında veya ilk başlarda klasik SQL’den farklı gelecektir. Korkmayın alışırsınız. 🙂

Her bir Collection’a ait kayıt sayıları için aşağıdaki kod bloğunu kullanabilirsiniz.

var collections = db.getCollectionNames();

print( 'Veritabanı üzerindeki Collections:' );

var total = 0;
for(var i = 0; i < collections.length; i++){
var name = collections[i];

if(name.substr(0, 6) != 'system')
print( name + ' - ' + db[name].count() + ' satır bulunuyor.. ' );
}

Toplam kayıt sayısını merak ediyorsanız aşağıdaki kod bloğunu kullanabilirsiniz.

var collections = db.getCollectionNames();

var total = 0;
for(var i = 0; i < collections.length; i++){
var name = collections[i];

if(name.substr(0, 6) != 'system')
total += db[name].count();
}

print( 'Toplam Satır Sayısı : ' + total )

MongoDB ile ufak bir maceramız oldu. Mümkün olduğunda öğrendiklerim-izden paylaşımlar yapmaya çalışacağım.

Not : Bu komutlar Navicat üzerinde çalıştırılmış olup, Output sekmesinden görüntülenmiştir.

Linux Servis Takip & Autostart

Linux ortamlarında birşeyler koşturuyorsanız bazen servisleriniz size naz yapıyor olabilir. Bu nazlı haller geldiğinde ise servisleri restart edip işimize devam ederiz. Genellikle neden nazlandığını bulamayız. Çok derin inceleme ve araştırma gerekebilir. 🙂

Bunun için servisi takip edip durma durumuna göre hızlıca restart eden scriptler mevcut tabiki. Stackoverflow’da bulduğum örneklerden bir tanesi;

#!/bin/bash
service=SERVICE_NAME

if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 ))
then
echo "$service is running!"
else
/etc/init.d/$service restart
fi

SERVICE_NAME yazısını servisinizin adı olarak değiştirmeniz yeterli. Örnek olarak “httpd” olabilir. Bash script’i kaydedip CRON olarak eklemeniz ve isteğe göre zaman tanımı yapmanız yeterli. Ben genellikle dakikalık periyotları kullanıyorum.

* * * * * sudo sh /home/service_check.sh > /dev/null 2>&1

Linux dağıtımıza göre yetkilendirme işlemleri gerekebilir.  Bu işlemin arkasına web servis veya mail ortamı bağlayıp kendinize de bildirimler gönderebilirsiniz.

MySql Parçalı Dosyaları İçeri Aktarma

Yedekleme sistemleri her yazılım ve sistem için oldukça önemlidir. Farklı yedekleme senaryoları mevcuttur. Bundanlar en basit olanı veritabanını dump etmektir. Diğeri ise tüm veritabanını tek bir dosyada dump etmek yerine tabloları ayrı ayrı dump etmektir.

Tek bir dosya halindeki yedekleriniz veritabanınızdaki veri büyüklüğüne göre başarılı olabilir. Fakat büyük bir veritabanınız mevcut ise tek bir dosya halinde yedeklemenizi tavsiye etmem.

Elimizde MySql veritabanınızın dump edilmiş hali yani tüm veritabanının dosyaya çıktı alınmış halini aşağıdakine benzer bir komut ile Linux Terminal üzerinden içeriye tekrar alabilirsiniz.


mysql -u MYSQL_USER -pMYSQL_SIFRENIZ VERITABANI_ADI < $d

Okumaya devam et “MySql Parçalı Dosyaları İçeri Aktarma”

Linux CentOS Geçmiş Silme / History Clear

Linux kullanıcılarının çoğu bilir. Hatta HACKER muhabbetlerinde de sürekli geçer.
Asla ayak izlerini belli etme”.
Hacker işlemlerinden çok bir sunucuda konfigürasyon sırasında girilen şifreler olabilir veya yapılan işlemler, adımlar, sql sorguları vb. linux terminal üzerinde yön tuşlarından Yukarı veya Aşağı tuşları ile neler yapılmış neler edilmiş görebilirsiniz. Hatta kullanmış olduğunuz Linux dağıtımına göre history komutu ile listeleme yapabilir, farklı dosyaya çıktı dahi alabilirsiniz.

Hacker muhabbetlerinden ziyade yapılan işin güvenliğini düşünecek olursak – ki bu da hacker muhabbetine dönebilir – geçmişinizi muhakkak kontrol edin, temiz tutun. Bunun için en basit ve birinci adımlardan birisi aşağıdaki komutlardır diyebilirim. Terminalinizden logout / çıkış yapmadan önce komutları uygulayınız..

cat /dev/null > ~/.bash_history && history -c
cat /dev/null > ~/.mysql_history && history -c

 

Tabiki daha detaylı işlemler mevcut. Aklıma gelmişken sizinle paylaşayım dedim. Bunu yapınca hacker vs. olunmuyor onu da söylim 🙂

Centos 7 PHP 7.2 ile MSSQL Server Bağlantısı

Projelerimizde genellikle PHP alt yapısı kullanmaktayız. Projenin bir bölümü MSSQL server ile bağlantılı çalıştığı için Linux web server’lar ile bağlantı yapamıyorduk. Bunun için Windows bir sunucu üzerinden IIS üzerine apache kurulumunu gerçekleştirip, MSSQL server’a bağlantı için PHP ye ait bir  “.dll ” kullanıp bağlantı sağlıyorduk. MSSQL tarafındaki işlemler için Windows sunucuyu web servis olarak kullanıyorduk.

Ne mi oluyordu ? Güzel oluyordu. Çalışıyor muydu ? Evet, çalışıyordu. İstediğimiz performans varmıydı ? Hayır, yoktu. Rahat mıydı ? Bize göre değildi.

4-5 sene içerisinde birkez defa PHP ile MSSQL’e bağlantılar denemiştik. Fakat çoğu kütüphane de BUG‘lar mevcuttu. Bu BUG‘lardan en sevdiğim ise Linux üzerinden MSSQL’e bağlandığınızda Sunucuda ne kadar RAM varsa hepsini kimseyi düşünmeden kendininmiş gibi kullanması. 🙂

Bizde zaman kaybetmemek adına Windows üzerinden web servis yazmaya başlayıp projelerimizi geliştirdik. Hemen hemen her yazılımcının, sistemcinin bir gece ansızın aklına düşen fikirleri, düşünceleri vardır. Benimkisi ise PHP ile MSSQL’e bağlanabilmek. Üstüne çok fazla düşmemiştim açıkcası.

Aradan günler geçti ve PHP’nin 7 sürümünde bazı güncellemeler olduğunu araştırırken bir abimiz PHP 7 ile MSSQL’e bağlandığını yazmış. Döküman ? Malesef. Sadece yazmış. 🙂

Şimdi geçelim Linux Centos 7 üzerinde PHP 7 ile MSSQL’e nasıl bağlantı kuracağımıza. ( Vesta Control Panel üzerinde de gayet güzel çalışmaktadır )

İşlemlerimizi PECL ile yapıyoruz. Komutlar;
# curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo
# yum update
# ACCEPT_EULA=Y yum install -y msodbcsql mssql-tools unixODBC-devel
# pecl install sqlsrv
# pecl install pdo_sqlsrv

PHP.INI dosyamıza aşağıdaki satırları ekleyip güncelliyoruz;
extension=sqlsrv
extension=pdo_sqlsrv

Web engine olarak ne kullanıyorsanız ( Nginx, Apache, PHP-FPM ) restart ediniz.

Bu kadar. Sonrasında ise kullanmış olduğunuz herhangi bir framework varsa direkt olarak database_driver değiştirirerek kullanabilirsiniz. Yok ise şuaradaki doküman işinize yarayabilir..

Karşılaşabileceğiniz hatalar;
# ACCEPT_EULA=Y yum install -y msodbcsql mssql-tools unixODBC-devel
bu satırda hata alırsanız Şuradaki doküman‘a göre Centos üzerinde aşağıdaki işlemleri sırasıyla gerçekleştiriyoruz ( Centos 7 – Redhat ).

sudo su
curl https://packages.microsoft.com/config/rhel/7/prod.repo &amp;amp;amp;amp;amp;amp;amp;gt; /etc/yum.repos.d/mssql-release.repo
exit
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel
sudo ACCEPT_EULA=Y yum install msodbcsql17
sudo ACCEPT_EULA=Y yum install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' &amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;gt; ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' &amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;gt; ~/.bashrc
source ~/.bashrc
sudo yum install unixODBC-devel

PECL ile ilgili bir hata alırsanız ;
Şuradaki doküman’a göre aşağıdaki işlemleri yapınız.

yum install php-devel
yum provides pecl
yum install php70w-pear
pecl install stats

Kendi tecrübeme göre PHP’nin 7.2 versiyonu daha stabil ve hızlı çalışmakta. 7.2 versiyonu ile birlikte MSSQL’e bağlantılarımız gerçekleşiyor. Hatta Codeigniter framework’ü kullandığımız için Windows üzerindeki projeyi olduğu gibi Linux Centos üzerine aktardığımızda herhangi bir hata vs. almadan ( PHP tarafından ) kullanmaya devam ettik. Fakat sizin projelerinizde farklı veya özel kütüphaneler mevcut ise bunun garantisini veremem. Lütfen aktarım yapmadan önce TEST ortamında kontrol ediniz.

Ufak bir bilgilendirme;
Centos 7 versiyonundan farklı bir versiyonda denemedim. Farklı bir dağıtımda denemedim. Farklı kaynaklar ve kurulum dökümanları mevcut. Aynı zamanda kurulum sırasında UPDATE işlemi mevcut. Linux ( diğerlerinde de mevcut fakat bilen bilir 🙂 ) üzerinde her zaman yapmanız gereken birşey vardır; “Enter’a basmadan önce bir daha düşün” ilkesidir ve herşeyden önce mutalaka YEDEK alınız.

Kaynaklar;

  • https://github.com/Microsoft/msphpsql/issues/726
  • http://fafairuzcode.blogspot.com/2016/08/installing-pecl-on-centos-7.html
  • https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15
  • http://www.shukko.com/x3/2018/12/12/php-ile-mssql-sunucuya-baglanalim/

Centos 7 Üzerinde Vesta Panel PHP 7 Upgrade Etme

Projelerimizin FTP / HOST hesaplarını daha rahat yönebilmek amacıyla VESTA Panel kullanmaktayız. Vesta gayet hoş, basit, hafif ve çok fazla uğraştırmadan sunucu üzerine kurulum yapıp kullanabilirsiniz.
Vesta Panel kurulumu için — > https://vestacp.com/install/  
İhtiyaçlarınıza göre vesta seçeneklerini seçerek kurulumu Console üzerinden yapabilirsiniz.

Şuanda Vesta kurulumu yapıldığında PHP sürümü 5.6 olarak gelmekte. Bu sürümün desteği bittiği için ve birçok hazır framework sitelerde hata göstermektedir ( WordPress, opencart vs. ) . Yakında bunu düzeltirler sanırım. PHP 7 versiyonu daha sağlıklı, hızlı ve stabil çalışmasından dolayı genel sistemlerimizi de güncellemekteyiz.

Güncelleme işlemi yaparken aşağıdaki adımları sırayla uygulayabilirsiniz.

  • wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  • wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
  • rpm -Uvh remi-release-7.rpm epel-release-latest-7.noarch.rpm
  • yum install yum-utils
  • yum-config-manager –enable remi-php72
  • yum-config-manager –disable remi-php56
  • yum-config-manager –disable remi-php70
  • yum-config-manager –disable remi-php71
  • yum update -y
  • php -v

Yukarıdaki işlemleri CLI / Console üzerinden yapmanız gerekir.
Hatasız update ler dilerim. 🙂

Kaynak

Linux WGET ile Dosya Çekme

Sistem yedeklemelerinde olduğum NAS ( Network Area Stroage ) mevcuttur. Sistem tarafında, hosting, sunucu gibi yazılım işleri ile koşturan hemen hemen herkes NAS kullanmaktadır. Farklı yedekleme sistemleri de mevcuttur fakat NAS güzeldir. 🙂

NAS üzerinde dosyaları çekmek istediğimize problemler yaşıyorduk. Çünkü bazı klasörlerin içerisinde dosya sayıları fazla olduğu için açılmıyor veya kullanmış olduğumuz FTP programları hataya düşüyordu.

Yapılması gereken ise dosyaları belirli aralıklarla çekip local tarafa aktarmaktı. İnternet üzerinde araştırmalar yaparken stackoverflow’da bulduğum yöntem bizi kurtardı. Biz dosya halinde değil KLASÖR halinde çekmek istediğimizden yöntem hızı gibi yetişti.

Detaya girmeden komutu paylaşacağım. Komut;

wget -r -nH --cut-dirs=5 -nc ftp://user:pass@server//absolute/path/to/directory

Linux üzerinde hangi dizindeyseniz wget komutu oraya çeker.  Kullanım yukarıdaki gibidir.

–cut-dirs=5 –> bu her seferinde 5 işlem yap diyebilmek için. Böylece listeleme ile uğraşmadığından FTP programları gibi patlamıyoruz.

Kaynak yazıya buradan ulaşabilirsiniz..

Ara ara dediğim gibi başka canlar yanmasın.. 🙂

Linux Bash Script’de JSON formatıyla Web Servise CURL etmek

Linux üzerinde işlem yaptırıp web servise de bunu iletmek istiyorsanız aşağıdaki bash script kod parçacıkları işinize yarayabilir. Bizim projemizde backup / yedekleme sonrası servislerin ve backupların durumlarını kontrol edebilmek amaçlı olarak bir noktadan kontrol ve analiz edilebilmesi için kullanılmıştır. Yani olay sıralaması şu şekilde;

Sistem tarafında backuplar alınıyor. Sonrasında ise backupın alınıp alınmadı bilgisi ise web servise CURL ediliyor. JSON formatında hazırlanan bilgi web servis tarafında ise JSON olarak karşılanmaktadır.

Backup alma işlemleri ile ilgili örnekleri daha öncesinde paylaşmıştım, şu linkten bulabilirsiniz. Şimdi ise bu backupların durumlarını analiz edebilmek için aşağıdaki kod parçasını kullanacağız.

post_data()
{
# linux un hostname ini almak için.
hostname=$(hostname)
# linux un saat ve tarihi almak
date_time=$(date "+%Y-%m-%d %H:%M:%S")
cat <<EOF
{
"parametre1" : "deger1",
"parametre2" : "deger2",
"hostname" : "$hostname",
"date_time" : "$date_time"
}
EOF
}


curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data "$(post_data)" "http://webservisadresiniz"

Dinamik olarak sunucuya ait bilgileri almak için 2 adet örnek değişken örneği verdim. Siz ihtiyacınız olan parametreleri toplayın JSON formatındaki diziye yerleştirip otomatik olarak gönderimini sağlayabilirsiniz. Backup sistemlerinde şu bilgiler ihtiyaç oluyor genellikle; Disk kullanımı, dosya adı, dosya boyutu, backup başlangıç-bitiş zamanları, ftp upload olmuş mu vb. Bu bilgiler sayesinde PHP tarafında aldığınız bilgileri veritabanına veya farklı bir yere yazarak geçmişe dönük olarak ve sunucularınızın son hallerinin disk vb. durumlarını toplayabilirsiniz. Raporlar çıkartıp olası durumları öncesinden düzeltebilirsiniz. Genellikle disk dolma durumu ile karşı karşıya kalınmaktadır.

webservisadresiniz üzerinde ise aşağıdaki işlemi yaparak post edilen bilgileri alabilirsiniz. Daha öncesinde ise şuradaki yazımda anlamıştım..


function input_post_json()
{
$data = json_decode(file_get_contents('php://input'), true);
$data[ 'ip' ] = $_SERVER[ 'REMOTE_ADDR' ];
return $data;
}

$post = input_post_json();

Web servis tarafımızda gelen bilgileri bir şekilde veritabanı veya başka bir yerde sakladık. İlla da saklamanız gerekmemektedir. Mail olarak da haber veren bir uygulama yapabilirsiniz. Gerisi sizin ihtiyaçlarınıza ve hayal dünyanıza kalmıştır. Birden fazla sunucunuz var ise tüm backuplar alındıktan sonra kendinize rapor ve analiz maili atabilirsiniz. Hayat kurtarır benden size söylemesi 🙂

Bu tarz uygulamalar sistem tarafındaki manuel olarak her bir sunucuya tek tek girip yedek almak, bakım yapmak, disk kontrolü vb. işlemleri sağlamadaki harcamış olduğunuz zamanı yarıdan daha aza indirgemektedir.

Asıl amacım linux üzerinde JSON formatını web servise CURL olarak göndermeyi anlatmaktı ama olay biraz amatörce backup monitoring’e kaçtı sanırım. 🙂