Network Otomasyon Netmiko

 Network Otomasyon Netmiko 

Netmiko kütüphanesi ile telnet/SSH protokolleri üzerinden ağ cihazlarına bağlanabilirsiniz. Netmiko, SSH ve Telnet protokollerini destekler, bu nedenle bağlantıyı sağlamak için device_type parametresini cihazınıza uygun bir diğer device_type değerine ayarlayarak bağlantı yapabilirsiniz.

Örneğin, bir Cisco cihazına telnet üzerinden bağlanmak için:

from netmiko import ConnectHandler
device = {
    'device_type': 'cisco_ios_telnet',
    'ip': 'cihaz_ip_adresi',
    'username': 'kullanici_adi',
    'password': 'parola',
}
net_connect = ConnectHandler(**device)

Ancak, unutulmaması gereken önemli bir nokta var. SSH, güvenli bir bağlantı protokolüdür ve genellikle telnet yerine tercih edilir. Eğer mümkünse, cihazınız SSH üzerinden bağlantıya izin veriyorsa, bu daha güvenli bir seçenektir. Telnet, verileri şifrelemeden gönderdiği için güvenli olmayabilir.

Netmiko ile bağlanırken device_info sözlüğüne cihazın bağlantı bilgilerini eklemelisiniz. Bu bilgiler, bağlanmaya çalıştığınız cihazın türüne ve yapılandırmasına göre değişecektir.

Netmiko device_info bilgiler

Temelde, device_info sözlüğünde aşağıdaki temel bilgiler olması gerekir:

device_type: Bağlanmaya çalıştığınız cihazın türünü belirtir (örneğin, 'cisco_ios', 'cisco_xr', 'juniper_junos', vb.).

ip: Cihazın IP adresi.

username: Cihaza erişim için kullanıcı adı.

password: Kullanıcı parolası.

Netmiko device_info diğer bilgiler

device_info sözlüğüne ek olarak, cihazın özelliklerine ve gereksinimlerine bağlı olarak çeşitli diğer parametreleri ekleyebilirsiniz. İşte bazı yaygın parametreler:

port: Cihaza bağlanmak için kullanılacak port numarası (örneğin, 22 için SSH, 23 için Telnet).

secret: Cihazda "enable" moduna geçiş için kullanılan parola.

global_delay_factor: Komut gönderimlerinin ve cevap almanın arasındaki zaman gecikmesini ayarlar. Varsayılan olarak 1'dir.

fast_cli: Eğer destekleniyorsa, bu parametre True olarak ayarlanarak, komut gönderme işlemlerinin hızlandırılmasını sağlar.

session_log: Bağlantı üzerindeki etkileşimleri bir dosyaya kaydetmek için kullanılır.

session_log_record_writes: True olarak ayarlanırsa, her yazma işlemi log dosyasına kaydedilir.

auto_find_prompt: True olarak ayarlandığında, cihazın komut istemcisini otomatik olarak algılar.

use_keys: Eğer cihazın anahtar tabanlı kimlik doğrulama kullanıyorsa, bu parametre True olarak ayarlanmalıdır.

key_file: Anahtar tabanlı kimlik doğrulama için kullanılacak özel anahtar dosyasının yolu.

alt_host_keys: Eğer cihaz farklı anahtarları kullanıyorsa, bu parametre True olarak ayarlanmalıdır.

alt_key_file: Farklı anahtarlar kullanılıyorsa, bu parametre ile kullanılacak anahtar dosyasının yolu belirtilir.

alt_passwords: Eğer cihaz farklı parolalar kullanıyorsa, bu parametre ile kullanılacak parolalar belirtilir.

alt_secret: Eğer farklı bir "enable" parolası kullanılıyorsa, bu parametre ile belirtilir.

verbose: Daha fazla ayrıntı için bu parametre True olarak ayarlanabilir.

Bu, sadece bazı örnek parametrelerdir. Cihazın türüne ve gereksinimlerine bağlı olarak, farklı parametreler de kullanılabilir. Bu nedenle, belgeleri inceleyerek doğru parametreleri belirlemeniz önemlidir.

netmiko.redispatch() fonksiyonu, Bir ağ cihazının türünü dinamik olarak tanımlamak için kullanılır.

Özellikle, bir cihaza ilk olarak bağlandığınızda, belirli bir cihaz türü için yapılandırılmış bir bağlantı yapısı oluşturursunuz (örneğin, cisco_ios için). Ancak bazen cihazın türünü önceden bilmiyorsanız veya oturum açtıktan sonra cihazın türü değişirse, bu durumda redispatch() fonksiyonunu kullanarak cihazın türünü dinamik olarak belirleyebilirsiniz.

from netmiko import ConnectHandler
# Cihazın bağlantı bilgilerini belirtin
device = {
    'device_type': 'autodetect',  # Dinamik olarak cihaz türünü belirle
    'ip': 'cihaz_ip_adresi',
    'username': 'kullanici_adi',
    'password': 'parola',
    'secret': 'enable_parola',  # Enable modu için gerekli ise
}
# Cihaza bağlantı yap
net_connect = ConnectHandler(**device)
# Cihaz türünü dinamik olarak belirle
device_type = net_connect.device_type
netmiko.redispatch(net_connect, device_type=device_type)
# Cihaza bir komut gönder
output = net_connect.send_command('show interfaces')
# Çıktıyı ekrana yazdır
print(output)

Netmiko bağlantı fonksiyoanları

ConnectHandler(): Bu fonksiyon, belirtilen bağlantı parametrelerine göre bir ağ cihazına bağlantı yapar.

from netmiko import ConnectHandler
device = {
    'device_type': 'cisco_ios',
    'ip': 'cihaz_ip_adresi',
    'username': 'kullanici_adi',
    'password': 'parola',
    'secret': 'enable_parola',  # Opsiyonel: Enable modu için gerekli ise
}
net_connect = ConnectHandler(**device)

ConnectHandler.from_dict(): Bu fonksiyon, bir cihazın bağlantı bilgilerini bir sözlükten alır.

device_info = {
    'device_type': 'cisco_ios',
    'ip': 'cihaz_ip_adresi',
    'username': 'kullanici_adi',
    'password': 'parola',
    'secret': 'enable_parola',  # Opsiyonel: Enable modu için gerekli ise
}
net_connect = ConnectHandler.from_dict(device_info)

ConnectHandler.from_input_string(): Bu fonksiyon, bir JSON veya YAML formatındaki cihaz bilgilerini alır.

device_info_json = '''
{
    "device_type": "cisco_ios",
    "ip": "cihaz_ip_adresi",
    "username": "kullanici_adi",
    "password": "parola",
    "secret": "enable_parola"
}
'''
net_connect = ConnectHandler.from_input_string(device_info_json)

ConnectHandler.from_file(): Bu fonksiyon, bir JSON veya YAML dosyasından cihaz bilgilerini okur.

net_connect = ConnectHandler.from_file('device_info.json')

is_alive: Bu fonksiyon, cihazın hala çevrimiçi olup olmadığını kontrol eder.

if net_connect.is_alive():
    print("Cihaz çevrimiçi.")
else:
    print("Cihaz çevrimdışı.")

Netmiko komut gönderme fonksiyonları

net_connect.write_channel() metodu, cihaza veri göndermek için kullanılır.

net_connect.write_channel("Komut" + ' \r\n')

send_command(): Bu fonksiyon, bir komutu cihaza gönderir ve cevabını döndürür. 

output = net_connect.send_command('show interfaces')

send_command_expect(): Bu metot, belirtilen komutu cihaza gönderir ve ardından belirtilen bir dizeyi bekler. Bu metot, beklenen dizeyi görene kadar cihazdan gelen yanıtı döndürmez. expect_string="Info:": Bu parametre, cihazdan beklenen dizedir. Yani, cihazın yanıtında bu dizenin bulunması beklenir. Eğer bu dize bulunmazsa, metot beklemeye devam eder.

output = net_connect.send_command_expect(' \n', expect_string="Info:")

send_config_set(): Bu fonksiyon, yapılandırma komutlarını cihaza gönderir. Birden fazla komutu içeren bir liste veya bir string'i kabul eder. Örneğin:

config_commands = ['interface Loopback0', 'ip address 192.168.1.1 255.255.255.255']

output = net_connect.send_config_set(config_commands)

send_command_timing(): Bu fonksiyon, komutları gönderir ve bekler. Eğer cihaz hızlı yanıt veriyorsa veya bekleme süresi beklenmiyorsa bu fonksiyon kullanılabilir. Örneğin:

output = net_connect.send_command_timing('show interfaces')

send_config_from_file(): Bu fonksiyon, bir dosyadan yapılandırma komutlarını cihaza gönderir. Örneğin:

output = net_connect.send_config_from_file('config_commands.txt')

commit() (yalnızca bazı cihazlarda): Bu fonksiyon, yapılandırma değişikliklerini cihaza uygular. Örneğin:

net_connect.commit()

read_channel(): fonksiyonu, bağlantı kanalından (connection channel) gelen verileri okumak için kullanılır. Bu fonksiyon, özellikle düşük seviyeli ağ iletişimi gerektiren durumlarda kullanılır.

Özetle, net_connect.read_channel() ile cihazın yanıtlarını doğrudan okuyabilirsiniz. Ancak, bu yöntem genellikle daha ileri seviyeli fonksiyonlar (send_command(), send_command_expect()) kullanılarak otomasyon işlemleri için tercih edilir.

İşte net_connect.read_channel() fonksiyonunun nasıl kullanılacağına dair basit bir örnek:

output = net_connect.read_channel()

print(output)

Bu örnekte, net_connect.read_channel() fonksiyonu cihazdan gelen verileri okur ve bu verileri output değişkenine atar. Daha sonra print(output) komutu ile bu veriyi ekrana yazdırabilirsiniz.

Unutmayın ki bu yöntem, cihazın yanıtlarını doğrudan işlemek için kullanılır ve yanıtların formatına bağlı olarak bu verileri işlemek zor olabilir. Bu nedenle, genellikle daha yüksek seviyeli fonksiyonları kullanarak cihaz ile etkileşimde bulunmak daha yaygındır.

bekleme süresini ayarlamak için 

Netmiko ekran (Prompt) okuma fonksiyonları

output = net_connect.find_prompt()

veya

output = net_connect.read_channel(timeout=10)



    

Python DateTime Modülü

Python'da datetime modülü, tarih ve zamanla ilgili işlemler yapmanızı sağlayan bir standart kütüphanedir. Aşağıda, datetime modülünü kullanarak temel işlemleri nasıl gerçekleştireceğinizi gösteren birkaç örnek bulunmaktadır:

Tarih ve Zamanı Almak:

from datetime import datetime
# Şu anki tarih ve zamanı almak
now = datetime.now()
print(now)

# Belirli bir tarihi ve zamanı oluşturmak

specific_date = datetime(2023, 9, 21, 12, 30, 0)  # Yıl, Ay, Gün, Saat, Dakika, Saniye
print(specific_date)

Tarihi Biçimlendirmek:

from datetime import datetime
now = datetime.now()
formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_date)

Tarih ve Zamanı Ayırmak:

from datetime import datetime
now = datetime.now()
year = now.year
month = now.month
day = now.day
hour = now.hour
minute = now.minute
second = now.second
print(f"Yıl: {year}, Ay: {month}, Gün: {day}, Saat: {hour}, Dakika: {minute}, Saniye: {second}")

Tarih ve Zaman İşlemleri:

from datetime import datetime, timedelta
now = datetime.now()
yesterday = now - timedelta(days=1)
tomorrow = now + timedelta(days=1)
print(f"Bugün: {now}")
print(f"Dün: {yesterday}")
print(f"Yarın: {tomorrow}")

Tarih içinde bazı alanları sıfır olarak almak:

import datetime
dt = datetime.datetime.now()
dt = dt.replace(hour=0, minute=0, second=0, microsecond=0)

X gün önceki veya sonraki tarihi bulmak.

50 gün önceki tarihi bulan kod.

import datetime 
today = datetime.datetime.now()
d = datetime.timedelta(days = 50)
a = today - d
b = today + d
print(a, b)

Bu örnekler, datetime modülünün temel kullanımlarını göstermektedir. 



Serkan.net

 Merhaba!

Bilgi Paylaşım'a hoş geldiniz! Bu platform, teknoloji dünyasına ilgi duyanlar için kapsamlı bir bilgi kaynağıdır. Network, Network Automation, Python, Cisco, Huawei, Linux, Microsoft, VSAT, IoT, HTML, PHP, Oracle, MySql ve PostgreSQL gibi birçok önemli konuda içerikler sunuyoruz.

Network dünyasına olan ilginizi geliştirmek ve uzmanlaşmak için doğru adrestesiniz. Ağ teknolojilerinin yanı sıra, Network Automation ile iş süreçlerini otomatikleştirmeyi öğreneceksiniz. Python gibi güçlü bir programlama dili sayesinde ağ yönetiminde ve otomasyonunda kendinizi geliştireceksiniz.

Cisco ve Huawei gibi önde gelen ağ ekipmanları hakkında bilgi edinerek, profesyonel ağ altyapılarının nasıl tasarlandığını ve yönetildiğini öğreneceksiniz. Linux işletim sistemi hakkında temel bilgilere sahip olacak ve ağ dünyasında kullanılan Microsoft ürünleri ile ilgili en güncel bilgilere ulaşacaksınız.

VSAT teknolojisi, uzak bölgelerde internet erişimi sağlamak için kritik bir konudur. Bu konuda temel bilgileri ve çalışma prensiplerini öğreneceksiniz. IoT (Nesnelerin İnterneti) konusu, nesnelerin internete bağlı olduğu bu çağın önemli bir trendi olarak ele alınacak.

Web geliştirme ile ilgileniyorsanız, HTML ve PHP dilleriyle web siteleri tasarlamayı öğrenerek dijital dünyada varlığınızı güçlendireceksiniz. Ayrıca, veritabanı yönetimi alanında uzmanlaşmak için Oracle, MySql ve PostgreSQL gibi popüler veritabanı sistemleri hakkında bilgi sahibi olacaksınız.

Bilgi Paylaşım, teknoloji dünyasındaki güncel gelişmeleri takip eden, paylaşan ve birlikte öğrenen bir topluluktur. Siz de bu topluluğa katılarak, teknoloji alanında bilgi birikiminizi artırabilir ve kariyerinizde yeni ufuklar açabilirsiniz.

Haydi, Bilgi Paylaşım'a katılın ve teknolojiye dair keşfetmeniz gereken dünyayı birlikte keşfedelim!

Konu başlıkları;

Network Security

Network Monitoring

Network Troubleshooting

Network Virtualization

Network Performance

Network Configuration

Network Devices

Network Topology

Network Protocols

Network Management

Network Design

Network Engineering

Network Optimization

Network Automation

Network Scripting

Network DevOps

Network Programmability

Network Analytics

Network Cloud Integration

Python Network Automation

Python Networking Libraries

Cisco Routing

Cisco Switching

Cisco Networking Certifications

Cisco Network Security

Huawei Network Technologies

Huawei Routing and Switching

Huawei Network Certification

Microsoft Networking Solutions

Microsoft Azure Networking

Microsoft Network Administration

Linux Network Administration

Linux Network Security

Linux Networking Tools

Linux Network Troubleshooting

VSAT Installation

VSAT Troubleshooting

IoT Network Connectivity

IoT Network Protocols

IoT Network Security

IoT Network Architecture

HTML Web Development

HTML5 Canvas

HTML Email Design

PHP Web Applications

PHP Frameworks

PHP Security Best Practices

Oracle Database Management

Oracle SQL Queries

Oracle Database Administration

MySQL Database Management

MySQL Performance Tuning

MySQL Replication

PostgreSQL Database Management

PostgreSQL Data Modeling

PostgreSQL Performance Tuning

Cloud Networking Technologies

Cloud Network Security

Cloud Network Monitoring

Cloud Network Migration

Mobile Network Technologies

Mobile Network Optimization

Mobile Network Protocols

Mobile Network Performance

Mobile Network Security

Network Security Certifications

Network Traffic Analysis

Network Load Balancing

Network Storage Solutions

Network Disaster Recovery

Network Scalability

Network Data Privacy

Network Data Backup

Network Data Center Design

Network Data Encryption

Network Data Governance

Network Data Integrity

Network Data Leakage Prevention

Network Data Loss Protection

Network Data Recovery

Network Data Retention

Network Data Segmentation

Network Data Transfer

Network Data Visualization

Network Data Warehousing

Network Data Traffic Management

Network Data Virtualization

Network Data Compression

Network Data Deduplication

Network Data Archiving

Network Data Indexing

Network Data Quality

Network Data Resilience

Network Data Replication

Network Data Synchronization

Network Data Migration

Network Data Governance

Network Data Anonymization

Network Data Consent Management

Network Data Protection Regulations

Network Data Security Policy

Network Data Breach Response

Network Data Incident Management

Network Data Compliance

Network Data Access Control

Network Data Authentication

Network Data Authorization

Network Data Encryption Algorithms

Network Data Firewall

Network Data Intrusion Detection

Network Data Intrusion Prevention

Network Data Penetration Testing

Network Data Risk Assessment

Network Data Threat Intelligence

Network Data Vulnerability Assessment

Network Data Malware Detection

Network Data Phishing Protection

Network Data Ransomware Prevention

Network Data Social Engineering Awareness

Network Data Cybersecurity Awareness

Network Data Cybersecurity Training

Network Data Cybersecurity Incident Response

Network Data Cybersecurity Forensics

Network Data Cybersecurity Governance

Network Data Cybersecurity Auditing

Network Data Cybersecurity Policy

Network Data Cybersecurity Compliance

Network Data Cybersecurity Ethics

Network Data Cybersecurity Laws and Regulations

Network Data Cybersecurity Best Practices

Network Data Cybersecurity Tools

Network Data Cybersecurity Frameworks

Network Data Cybersecurity Standards

Network Data Cybersecurity Research

Network Data Cybersecurity Trends

Network Data Cybersecurity Threats

Network Data Cybersecurity Risks

Network Data Cybersecurity Challenges

Network Data Cybersecurity Solutions

Network Data Cybersecurity Technologies

Network Data Cybersecurity Vendors

Network Data Cybersecurity Industry

Network Data Cybersecurity Careers

Network Data Cybersecurity Certifications

Network Data Cybersecurity Training Courses

Network Data Cybersecurity Conferences

Network Data Cybersecurity Webinars

Network Data Cybersecurity Workshops

Network Data Cybersecurity Seminars

Network Data Cybersecurity News

Network Data Cybersecurity Blogs

Network Data Cybersecurity Forums

Network Data Cybersecurity Communities

Network Data Cybersecurity Social Media Groups

Network Data Cybersecurity Experts

Network Data Cybersecurity Consultants

Network Data Cybersecurity Analysts

Network Data Cybersecurity Engineers

Network Data Cybersecurity Specialists

Network Data Cybersecurity Managers

Network Data Cybersecurity Directors

Network Data Cybersecurity Leaders

Network Data Cybersecurity Researchers

Network Data Cybersecurity Innovations

Network Data Cybersecurity Startups

Network Data Cybersecurity Companies

Network Data Cybersecurity Products

Network Data Cybersecurity Services

Network Data Cybersecurity Solutions

Network Data Cybersecurity Partnerships

Network Data Cybersecurity Collaborations

Network Data Cybersecurity Projects

Network Data Cybersecurity Implementations

Network Data Cybersecurity Case Studies

Network Data Cybersecurity Success Stories

Network Data Cybersecurity Lessons Learned

Network Data Cybersecurity Strategies

Network Data Cybersecurity Action Plans

Network Data Cybersecurity Assessments

Network Data Cybersecurity Evaluations

Network Data Cybersecurity Reviews

Network Data Cybersecurity Recommendations

Network Data Cybersecurity Guidelines

Network Data Cybersecurity Standards

Network Data Cybersecurity Frameworks

Network Data Cybersecurity Policies

Network Data Cybersecurity Procedures

Network Data Cybersecurity Protocols

Network Data Cybersecurity Controls

Network Data Cybersecurity Measures

Network Data Cybersecurity Metrics

Network Data Cybersecurity KPIs

Network Data Cybersecurity Reports

Network Data Cybersecurity Dashboards

Network Data Cybersecurity Tools

Network Data Cybersecurity Technologies

Network Data Cybersecurity Trends

Network Data Cybersecurity Future

Network Data Cybersecurity Challenges

Network Data Cybersecurity Opportunities

    

PHP: Oracle SQL Injection

 Cross-Site Scripting: Persistent web güvenliği açısından çok önemli ve dikkat edilmesi gerken bir durumdur. PHP kodu ile Oracle SQL de injection engellemek için aşağıdaki yöntemi kullanabilirsiniz. Bir oracle bağlantısı kurabilmek için ilk olarak sorgu hazırlanır.

query="select * from tablo where userID=:user"

$user="username";

$parse = oci_parse($connectora, $query);

oci_bind_by_name($parse, ':user', $username);

$r = oci_execute($parse)

XSS

Java Script Güvenlik

 Güvensiz rastgelelik hataları, öngörülebilir değerler üretebilen bir işlev, güvenliğe duyarlı bir bağlamda rastgelelik kaynağı olarak kullanıldığında ortaya çıkar. Bilgisayarlar deterministik makinelerdir ve bu nedenle gerçek rastgelelik üretemezler. Sözde Rastgele Sayı Üreteçleri (PRNG'ler), sonraki değerlerin hesaplandığı bir çekirdekten başlayarak, algoritmik olarak rastgeleliğe yaklaşır. İki tür PRNG vardır: istatistiksel ve kriptografik. 

İstatistiksel PRNG'ler yararlı istatistiksel özellikler sağlar, ancak çıktıları oldukça tahmin edilebilirdir ve güvenliğin üretilen değerlerin öngörülemez olmasına bağlı olduğu durumlarda kullanım için uygun olmayan, yeniden üretilmesi kolay bir sayısal akış oluşturur. 

Kriptografik PRNG'ler, tahmin edilmesi daha zor çıktılar üreterek bu sorunu çözer. Bir değerin kriptografik olarak güvenli olması için, bir saldırganın oluşturulan rasgele değer ile gerçekten rasgele bir değer arasında ayrım yapmasının imkansız veya çok düşük olması gerekir. Genel olarak, bir PRNG algoritmasının kriptografik olarak güvenli olduğu ilan edilmiyorsa, bu muhtemelen istatistiksel bir PRNG'dir ve kullanımının tahmin edilmesi kolay geçici parolalar gibi ciddi güvenlik açıklarına yol açabileceği güvenlik açısından hassas bağlamlarda kullanılmamalıdır. , tahmin edilebilir kriptografik anahtarlar, oturum ele geçirme ve DNS sahtekarlığı. Örnek: Aşağıdaki kod, satın alma işleminden sonra belirli bir süre etkin kalan bir makbuz için bir URL oluşturmak üzere istatistiksel bir PRNG kullanır.

 Math.random() fonksiyonu çıktıları tahmin edilebilir, güvenilir bir fonksiyon olmadığı için yerine aşağıdaki fonksiyonlardan biri kullanılmalıdır.

window.crypto.random()

crypto.getRandomValues()


    

Python Yazılımı İçin Log Oluşturma

 Python kodunuzun loglarını takip etmek istiyorsanız program çalışırken oluşan hataları veya mesajları bir log dosyasına yardırabilirsiniz. Bu log dosyası yazılımınızın geçmişe dönük çalışmasıyla ilgili size bilgi verecektir. Python'da en popüler log oluşturma kütüphanesi logger kütüphanesidir. Logger yazılımını bilgisayarımıza yükleyerek başlayalım.

pip install logger

Modülü yükledikten sonra yazılıma import edelim.

import logging

İlk olarak oluşturduğumuz log için bir isim tanımı yapalım.

logger = logging.getLogger("Log_adı")

Mesaj seviyesi belirleyelim, bu seviye ve üzerindeki loglar alınır. Örneğin: Error seçilirse sadece error ve critical logları alınır.

Seviyeler:

  1. debug
  2. info
  3. warning
  4. error
  5. critical

logger.setLevel(logging.DEBUG)

Logların yazılacağı dosyanın belirlenmesi;

logging.basicConfig(filename='dosya_adi.log', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', filemode="w", level=logging.DEBUG)

Burada filemode="w" ise her çalıştırmada eski dosya silinerek yeni dosya oluşturulur. filemode="a" ise bilgiler eski dosyaya eklenerek kaydedilir. Ekrana yazdırma parametreleri;

ch = logging.StreamHandler()

ch.setLevel(logging.DEBUG)

Log formatı;

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(pathname)s:%(lineno)d')

asctime = Çalışma zamanı

name = Log adı

levelname = Log level

message = Yazdığınız veya sistemden okuduğu hata mesajı.

pathname = Dosyanın bulunduğu dizin.

lineno = Kodun çalıştırdığı satır.

Ekrana yazılacak veriye format uygulanması

ch.setFormatter(formatter)

logger.addHandler(ch)

Yazılır.

#Uygulama mesaj formatları;

Print komutunu kullanır gibi aşağıdaki formatta yazdığınız tüm mesajlar log dosyasında oluşacaktır.

logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

Kodun tamamı

import logging
logger = logging.getLogger('Log_adı')
logger.setLevel(logging.DEBUG)
logging.basicConfig(filename='dosya_adi.log', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(pathname)s:%(lineno)d', filemode="w", level=logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(pathname)s:%(lineno)d')
ch.setFormatter(formatter)
logger.addHandler(ch)

Tavsiye edilen kullanım:

import logging
import os
logger_name=os.path.basename(__file__)
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
logging.basicConfig(filename=logger_name+'.log', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(pathname)s:%(lineno)d', filemode="w", level=logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(pathname)s:%(lineno)d')
ch.setFormatter(formatter)
logger.addHandler(ch)

Python Log'larını otomatik olarak mail atmak için

Koda aşağıdaki satırları da ekleyerek mail atma işlemini de gerçekleştirebilirsiniz.

import logging.handlers

Mail_sender = "email_user@domain.com"
Sender_pwd = "passWord" #Password kullanımı opsiyoneldir...
smtpHandler = logging.handlers.SMTPHandler(
    mailhost=("localhost", 25),
    fromaddr="noreply@domain.com",
    toaddrs="user@email.com",
    subject="Dikkat!",
    credentials=(Mail_sender, Sender_pwd))
smtpHandler.setLevel(logging.DEBUG)
smtpHandler.setFormatter(formatter)
logger.addHandler(smtpHandler)

Not: Mail atarken alarm seviyesini warning olarak ayarlayın, yoksa çok fazla mail ile karşı karşıya kalabilirsiniz.


Python Yazılımı İçin Konfigürasyon Dosyası

 Python yazılımı için bir konfigürasyon dosyası nasıl oluşturulur?

Yazılım kodunda sürekli değişiklik yapmamak için veya kod üzerinde başkaları ile çalışırken kullanıcı adı ve şifre bilgilerinin açık bir şekilde görünmemesi için bir konfigürasyon dosyası hazırlayıp değişkenleri burada tanımlamak çok kullanışlı olacaktır. Bu değişkenler username, password, host, port, ve IP gibi sürekli değişecek bilgiler olabilir. İlk olarak config.py isimli bir dosya oluşturalım ve içeriğini gerekli bilgiler ile aşağıdaki örnekteki gibi dolduralım.

#### Konfigürasyon Dosyası ###
host = 'localhost'
port = '8080'
username = 'user'
password = 'password'

Dosyaya bilgileri yazdıktan sonra config.py ismi ile yazılımımızın dosyalarının olduğu klasöre kaydedelim. Konfigürasyonun import edilebilmesi için main.py dosyası ile config.py dosyası aynı klasörde olmalıdır. Yazdığımız kod içinden bu değişkenleri çağırmak için aşağıdaki örnek koda uygun bir şekilde değişkenleri çağıralım. Bu dosya adı main.py olsun.

import config
host = config.host
port = config.port
username = config.username
password = config.password

Main.py isimli kodu çalıştırdığınızda config.py isimli dosyadaki değişkenler yüklenecektir. Kod çalıştığında konsol'da aşağıdaki gibi bir mesaj görünür.

Reloaded modules: config 

Böylece konfigürasyonları yazdığımız dosya config.py ana dosyayı main.py çalıştırdığımızda yüklenecektir ve içerdiği bilgileri kullanabileceğiz. Özellikle password içeren kodlarda başkaları ile beraber çalışıyorsanız veya eğitim veriyorsanız bilgileri bu şekilde kod içinde görünmez hale getirebilirsiniz. Yazdığınız kodu başkaları da çalıştırabiliyorsa veya dosyalara erişebiliyorsa bu yöntem size güvenlik sağlamaz.

Konfigürasyon bilgilerini güvenli bir şekilde saklamak.

Güvenli bir şekilde konfigürasyon bilgilerini saklamak istiyorsanız cryptography modülünden faydalanabilirsiniz. İlk olarak bir konfigürasyon dosyası hazırlayıp bu dosyayı şifrelemek ve şifreli dosyayı kullanmak en güvenli yollardan biri olacaktır. İlk olarak yukarıda anlatıldığı gibi bir konfigürasyon dosyası oluşturun ve adını config.py olarak kaydedin. Pythn cryptography modülünü kurun;

pip install cryptography

Hazırladığınız config.py dosyasını şifrelemek için bir key oluşturun ve bu key bilgisini sonra kullanmak üzere bir dosyaya yazdırın. Daha sonra konfigürasyon dosyanızın şifreli bir halini oluşturun. Aşağıdaki kod key dosyası ve şifrelenmiş bir konfigürasyon dosyası oluşturmamızı sağlar.

from cryptography.fernet import Fernet

key = Fernet.generate_key()
print(key)

#Oluşturduğunuz key bilgisini dosyaya kaydeder.
with open('mykey.key', 'wb') as mykey:
    mykey.write(key)
    
f = Fernet(key)

with open('config.py', 'rb') as original_file:
    original = original_file.read()
encrypted = f.encrypt(original)

with open ('encrypted.py', 'wb') as encrypted_file:
    encrypted_file.write(encrypted)

Bu kod iki adet çıktı elde eder. mykey.key oluşturulan key bilgisinin içinde bulunduğu dosya, encrypted.py config.py dosyasının şifrelenmiş versiyonudur. 

İşlemden sonra mykey.key dosyasını mutlaka saklamalısınız, bu dosya şifreli encrypted.py dosyasını düzgün bir şekilde açmanızı sağlayacaktır. Artık bilgilerin açık bir şekilde yazılı olduğu config.py dosyasını başka bir güvenli yere taşıyabilir veya silebilirsiniz. Oluşturduğunuz şifreli konfigürasyon dosyasındaki bilgileri kullanmak için aşağıdaki kod size yardımcı olacaktır. 

from cryptography.fernet import Fernet

with open('mykey.key', 'rb') as filekey:
    key = filekey.read()
print(key)
f = Fernet(key)

with open('encrypted.py', 'rb') as encrypted_file:
    encrypted = encrypted_file.read()

decrypted = f.decrypt(encrypted)
data=decrypted.decode('UTF-8')

for line in data.splitlines():
    print(line)
    if "host" in line:
        host=re.split("'", line)[1]
    elif "port" in line:
        port=re.split("'", line)[1]
    elif "username" in line:
        username=re.split("'", line)[1]
    elif "password" in line:
        password=re.split("'", line)[1]

print(host, port, username, password )

config.py dosyasını tekrar oluşturmak isterseniz yukarıdaki koda aşağıdaki kod parçacığını eklemeniz yeterlidir.

with open('config.py', 'wb') as dec_file:
    dec_file.write(decrypted)




ORACLE SQL: IP Adresinin Dahil Olduğu IP Bloğunu Bulma

 Database'de bulunan bir tablonun ilgili kolonunda listelenmiş network blokları içinde (IP_Adresi/Subnet) bir IP adresinin hangi bulağa ait olduğunu bulmak için aşağıdaki sorgu kullanılabilir

Burada database kolonunda bulunan veri ör:IP_RANGE=192.168.1.0/30 şeklinde arana IP adresi ör:IP_Adresi=192.168.1.3 olabilir. Bu durumda sorgumuz;

WITH subnet_table AS (
  SELECT IP_RANGE,  regexp_substr(IP_RANGE, '(.*)/', 1, 1, null, 1) as network, 
         to_number(regexp_substr(IP_RANGE, '/(.*)', 1, 1, null, 1)) as subnet_mask_length
  FROM Tablo_adi
)
SELECT IP_RANGE, network, subnet_mask_length
FROM subnet_table
WHERE 
to_number(regexp_substr('IP_Adresi', '\d+', 1, 1)) * 16777216 +
to_number(regexp_substr('IP_Adresi', '\d+', 1, 2)) * 65536 +
to_number(regexp_substr('IP_Adresi', '\d+', 1, 3)) * 256 +
to_number(regexp_substr('IP_Adresi', '\d+', 1, 4))
BETWEEN 
to_number(regexp_substr(network, '\d+', 1, 1)) * 16777216 +
to_number(regexp_substr(network, '\d+', 1, 2)) * 65536 +
to_number(regexp_substr(network, '\d+', 1, 3)) * 256 +
to_number(regexp_substr(network, '\d+', 1, 4))
AND 
to_number(regexp_substr(network, '\d+', 1, 1)) * 16777216 +
to_number(regexp_substr(network, '\d+', 1, 2)) * 65536 +
to_number(regexp_substr(network, '\d+', 1, 3)) * 256 +
to_number(regexp_substr(network, '\d+', 1, 4)) + power(2, 32 - subnet_mask_length) - 1
ORDER BY subnet_mask_length DESC

Bu sorguda;

subnet_table : Tablonun kolonunda bulunan IP_RANGE=192.168.1.0/30 şeklindeki veriyi network=192.168.1.0 ve subnet_mask_length=30 şekline dönüştürür.

Sorgu ise IP_Adresi ve subnet_table'dan gelen network bilgilerini Decimal IP adresine dönüştürerek en küçün network IP'sinden en büyük network IP'si aralığında IP_Adresi bilgisinin olup olmadığına bakar.


subnet_table kısmı aşağıdaki gibi de yazılabilir.

select substr(IP_RANGE,1,length(IP_RANGE)-3) AS network, substr(IP_RANGE,-2,2) AS subnet_mask_length FROM Tablo_adi

veya

select substr(IP_RANGE, 1, INSTR(IP_RANGE, '/') - 1) as network, SUBSTR(IP_RANGE, INSTR(IP_RANGE, '/') + 1) as subnet_mask_length FROM Tablo_adi



Oracle SQL Bir Hücreye 4000 Karkterden Fazla Veri Yazmak

 Oracle SQL'de bir hücreye 4000 karekterden fazla veri yazmayı istiyorsanız kolon tipi olarak CLOB kullanmalısınız. VARCHAR2 ve benzeri kolonlara maximum 4000 karekter veri yazabilirsiniz. 4000 karekterden uzun veriyi tabloya yazmayı denediğinizde aşağıdaki gibi bir hata alırsınız.

General Exception: ORA-01704: string literal too long 

Bu hatayı almanız, veritabanına yazmak istediğiniz verinin uzunluğunun veritabanı tarafından desteklenmeyen bir değere ulaştığı anlamına gelir. Oracle veritabanında, bir string literal'in maksimum uzunluğu 4000 karakterdir. Eğer veritabanına yazmak istediğiniz veri bu uzunluğu aşıyorsa, CLOB veri tipi kullanmanız gerekir. GENIS_KOLON isimli CLOB Kolon aşağıdaki gibi oluşturulabilir.

CREATE TABLE "DB"."TABLO" 
   (  "NORMAL_KOLON" VARCHAR2(200), 
      "GENIS_KOLON" CLOB
   );

Bu kolona database client üzerinden istediğiniz uzunlukta veri yazabilirsiniz. Python gibi bir yazılımdan veri göndermek istiyorsanız verinin CLOB'a dönüştürülmesi gerekir. Oracle veritabanına 4000 karakterden fazla veri yazmak için Python'da cx_Oracle modülü kullanılabilir. İlgili sütun tipinin database'de CLOB (Character Large Object) tipi olduğundan emin olun. Python için örnek bir kod aşağıdaki gibidir:

import cx_Oracle
# Veritabanı bağlantısının açılması
conn = cx_Oracle.connect("username/password@hostname:port/sid")
# Veritabanı işlemleri için bir cursor oluşturulması
cursor = conn.cursor()
# Veriyi içeren değişken
long_data = "Long data here..." * 1000
# Veritabanı tablosuna veri yazma
cursor.execute("""
    INSERT INTO table_name (column_name)
    VALUES (:data)
""", data=cx_Oracle.CLOB(long_data))
# Değişikliklerin veritabanına kaydedilmesi
conn.commit()
# Bağlantının kapatılması

conn.close()

Bu kod parçacığında, cx_Oracle.CLOB() fonksiyonu ile veriyi CLOB veri tipine dönüştürülür ve veritabanına kaydedilir.


SSH Bağlantısı Üzerinden Telnet Bağlantısı

 Bir sunucuya veya cihaza SSH bağlantısı kurup bu bağlantı üzerinden Telnet ile başka bir cihaza bağlanabilmek için Python kodu içinde SSH için Paramiko, Telnet için Telnetlib modülleri kullanılabilir. Aşağıdaki kod bir sunucuya SSH ile bağlanmanızı ve aynı sunucu üzerinden Telnet ile başka bir cihaza komut göndermenizi sağlar.

import paramiko
import telnetlib

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('ssh_hostname', username='ssh_username', password='ssh_password')
tn = ssh.invoke_shell()
tn.send('telnet telnet_hostname\n')
tn.expect(['Username: '])
tn.send(f'{telnet_username}\n')
tn.expect(['Password: '])
tn.send(f'{telnet_password}\n')

# Telnet bağlantısı kurulunca burada telnet üzerinde yapmak istediğiniz komutları gönderebilirsiniz
tn.send('ls\n')
output = tn.recv(9999).decode('ascii')
print(output)
tn.close()
ssh.close()

Bu kodda bulunan, ssh_hostname, ssh_username, ssh_password, telnet_hostname, telnet_username, telnet_password değişkenlerine bağlanmak istediğiniz SSH ve Telnet sunucularının adresleri, kullanıcı adları ve parolalarıdır.


PHP IP Adresi Doğrulama

 PHP'de bir formdan girilen IP adresini doğrulamak için aşağıdaki kodları kullanabilirsiniz. IPv4 ve IPv6 için ayrı ayrı iki adet IP doğrulama kodu mevcuttur. Bu kod değişkenin uygun bir IP adresi olup olmadığını söyler.

IP versiyon 4 için;

<?php
$ip = "127.0.0.1";

if (filter_var($ip, FILTER_VALIDATE_IP)) {
    echo("$ip is a valid IP address");
} else {
    echo("$ip is not a valid IP address");
}
?>

IP versiyon 6 için;

<?php
$ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";

if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
    echo("$ip is a valid IPv6 address");
} else {
    echo("$ip is not a valid IPv6 address");
}
?>

      

Google