Python Modül Yüklümü Kontrolü

 Python da bir modül yüklü değilse ilk kullanmaya çalıştığınızda modülün olmadığına dair bir hata mesajı verir ve yazılım durur. Özellikle yeni bilgisayarda bir kod çalıştırırken veya bir başka kaynaktan aldığınız kodları kendi bilgisayarınızda çalıştırırken bu durum sıkca meydana gelebilir. Aşağıdaki kod bilgisayarınızda ilgili modüllerin olup olmadığını kontrol eder ve yoksa yükleme işlemini otomatik olarak yapar.

import importlib.util
import subprocess
import sys
def check_and_install(package_name):
    # Modül yüklü mü kontrol et
    if importlib.util.find_spec(package_name) is None:
        print(f"{package_name} modülü yüklü değil, yüklenecek...")
        # pip ile modülü yükle
        subprocess.check_call([sys.executable, "-m", "pip", "install", package_name])
    else:
        print(f"{package_name} modülü yüklü.")
# Kullanılacak modülleri burada kontrol edebilirsiniz
required_packages = ['numpy', 'requests', 'pandas']
for package in required_packages:
    check_and_install(package)

importlib.util.find_spec() ile modülün yüklü olup olmadığını kontrol eder.
Eğer modül yüklü değilse, subprocess.check_call() ile pip komutunu çalıştırarak gerekli paketi yükler.

İhtiyaç duyduğunuz modüllerin isimlerini required_packages listesine ekleyerek, hepsinin kontrolünü yapabilirsiniz.

Bu yöntem, bir script'in çalışmadan önce gerekli tüm modüllerin yüklü olduğundan emin olmanızı sağlar.

Python Schedule Modülü Nasıl Kullanılır

 Python'da zamanlanmış görevler için schedule modülünü kullanabilirsiniz. 


# Bu kısımda `schedule` ve `time` modüllerini import ediyoruz.
import schedule
import time

# Yeni bir zaman aralığı belirliyoruz.
new_interval = 20

# İşlev: Belirli bir işi gerçekleştiren ve zaman aralığını güncelleyen fonksiyon
def job_function(job_name):
    global new_interval
    print(job_name + " çalıştı!")
    
    # Zaman aralığını artırıyoruz.
    new_interval += 1
    print(new_interval)
    
    # Güncellenmiş zaman aralığını ilgili işe atıyoruz.
    job_list["job3"].interval = new_interval

# Çalıştırılacak işlerin adları
job_names = ["job1", "job2", "job3"]

# İş listesini oluşturuyoruz ve her bir işi plana ekliyoruz.
job_list = {}
for job_name in job_names:
    job = schedule.every(5).seconds.do(job_function, job_name)
    job_list[job_name] = job

# Planlanan işleri gösteriyoruz.
print(job_list)

# Planlanan işleri alıp ekrana yazdırıyoruz.
scheduled_jobs = schedule.get_jobs()
for job in scheduled_jobs:
    print(job)

# Ana döngü
n = 0
while True:
    # Planlanan işleri çalıştırıyoruz.
    schedule.run_pending()
    
    # 1 saniye bekleme
    time.sleep(1)
    
    # Güncellenmiş işleri gösteriyoruz.
    scheduled_jobs = schedule.get_jobs()
    for job in scheduled_jobs:
        print(job)
    
    # 11. turda "job2" işini iptal ediyoruz.
    if n == 11:
        cancelled_job = job_list["job2"]
        schedule.cancel_job(cancelled_job)
    
    n += 1

# Güncellenmiş işleri bir kez daha gösteriyoruz.
scheduled_jobs = schedule.get_jobs()
for job in scheduled_jobs:
    print(job)

    

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')

send_command_with_yml(): YML şablonlarına göre çıktı işleyen komuttur, ancak yaygın bir kullanım değildir.

send_multiline() : Birden fazla satırı tek komut olarak göndermek gerektiğinde kullanılır. Bu fonksiyon, uzun komutlar veya birden fazla satırdan oluşan çıktılar için kullanılabilir.

send_command_sc(): Netmiko'nun Single Connect entegrasyonu ile kullanılan bu fonksiyon, birden fazla cihaza aynı komutu göndermek için kullanılır.

send_interactive(): Etkileşimli komutlar (örneğin, bir komut çıktı verdikten sonra kullanıcıdan onay istemesi gibi) için kullanılır. Girdi-girdi senaryolarında kullanışlıdır.

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() #Bu komut prompt'da en son yazan kısmı getirir.

veya

output = net_connect.read_channel(timeout=10) #Bu komut cihazın en son döndüğü verinin tamamını getirir.



    

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");
}
?>

      

IPv6 Nedir ve Konfigürasyonu Nasıl Yapılır

IPv6 (Internet Protocol version 6) IP adresleme sisteminin sonraki sürümüdür. IPv6, IPv4'ten daha yüksek miktarda adres alanı sunar ve daha iyi güvenlik özellikleri içerir. IPv6 adresleri, IPv4 adreslerinden daha uzun olarak 128 bit uzunluğunda olup, daha yüksek sayıda cihazın internete bağlanmasına olanak tanır. Bu nedenle, IPv6, internetin gelecekteki ihtiyaçlarını karşılamak için tasarlanmıştır.

IPv6 kullanılmasının birkaç nedeni vardır:

  1. Adres yokluğu: IPv4 adresleri, internetteki cihazların sayısının hızla artması nedeniyle tükenmeye başlamıştır. IPv6, daha fazla adres alanı sunarak bu sorunu çözmeye çalışır.
  2. Daha yüksek güvenlik: IPv6, IPv4'ten daha iyi güvenlik özellikleri içerir. Örneğin, IPv6, IPsec ile birlikte gelir ve cihazlar arasındaki iletişimi şifreler.
  3. Daha hızlı ağ performansı: IPv6, IPv4'ten daha az yer kaplar ve dolayısıyla daha hızlı ağ performansı sunar.
  4. Daha esnek yapı: IPv6, IPv4'ten daha esnek bir yapıya sahiptir ve dolayısıyla daha kolay yönetilir.
  5. IoT: Internet of Things (IoT) gibi cihazların sayısının hızla artması, IPv6'nın kullanılmasını gerekli kılmaktadır.
  6. Mobil cihazlar: Mobil cihazlar, IPv4 adresleri ile sınırlıdır ve dolayısıyla IPv6 kullanılması gerekmektedir.

Bu nedenler ve daha fazlası ile IPv6 kullanılması gereklidir.

IPv6 adres yapısı, 128 bit uzunluğunda bir dizidir ve 8 parçaya ayrılır. Her parça, 16 bit uzunluğunda bir hexadecimal sayıdır. Parçalar arasında iki nokta üst üste (:) kullanılır. Örnek bir IPv6 adresi: 2001:0db8:85a6:0000:0000:8a2e:0370:7335.

IPv6 adres yapısı, IPv4 adres yapısından farklıdır. IPv4 adres yapısı, 32 bit uzunluğunda bir dizidir ve 4 parçaya ayrılır. Her parça, 8 bit uzunluğunda bir sayıdır. Parçalar arasında nokta (.) kullanılır. Örnek bir IPv4 adresi: 192.168.1.1

IPv6 kullanılması, dünya genelinde hızla yaygınlaşmaktadır. Ancak, tüm ağlar ve cihazlar tamamen IPv6'ya geçmeden önce, geçiş bir süreç olacaktır. Bu süreç, IPv4 ve IPv6 arasında çalışan çoklu protokol desteği ve IPv4 adreslerinin tükenmeden önce IPv6'ya dönüştürülmesi gibi faktörlere bağlıdır. Ipv4 ve Ipv6'yı bir tablo ile karşılaştıralım.


IPv4'ün tükenmesiyle beraber IPv6 kullanımı gün geçtikçe artıyor. Ülkemizde bulunan operatörler müşterilerine IPv6 tahsis ediyor ve kullanım kurumsal bağlantılarda daha yoğun olmak üzere artarak devam ediyor. IPv6 kullanımıyla ilgili bilgi almak için aşağıdaki linkten faydalanabilirsiniz.

https://www.google.com/intl/en/ipv6/statistics.html#tab=per-country-ipv6-adoption

Cisco ve Huawei cihazlarda IPv6 konfigürasyonu ve kontrolü için gerekli komutların bazıları aşağıdaki gibidir.

Cisco

ipv6 enable

Interface altında IPv6 tanımlama

1. ipv6 address {ipv6-prefix/prefix-length | prefix-name sub-bits/prefix-length}


IPv6 static route tanımlama

1. ipv6 route { ipv6 address/mask }   gigabitethernet { value } { destination ipv6 address }


IPv6 BGP tanımlama

1. router bgp xxxxxx
2. neighbor { destination ipv6 address }
3. remote-as { value }
4. description { name }  
5. address-family ipv6 unicast
6. route-policy { policy name }  in
7. maximum-prefix { value } { value }
8. route-policy { policy name }  out
9. soft-reconfiguration inbound always


IPv6 prefix-list tanımlama

1. prefix-set { prefix name }
2.   { ipv6 address/mask }  ,
3.   { ipv6 address/mask }  ,
4.   { ipv6 address/mask }   
5. end-set


IPV6 Route Policy oluşturma

1. route-policy { policy name }
2. if destination in { prefix name } then
3. drop
4. elseif destination in { prefix name }then
5. set local-preference { value }
6. set community { value } additive
7. pass
8. endif
9. end-policy

Cisco IPv6 Kontrol Komutları

show ipv6 nat statistics
show ipv6 nat translations
show ipv6 nd destination
show ipv6 nd on-link prefix
show ipv6 nd raguard counters
show ipv6 nd raguard policy
show ipv6 nd secured certificates
show ipv6 nd secured counters interface
show ipv6 nd secured nonce-db
show ipv6 nd secured solicit-db
show ipv6 nd secured timestamp-db
show ipv6 neighbor binding
show ipv6 neighbors
show ipv6 nhrp
show ipv6 nhrp multicast
show ipv6 nhrp multicast stats
show ipv6 nhrp nhs
show ipv6 nhrp summary
show ipv6 nhrp traffic
show bgp ipv6
show bgp ipv6 community
show bgp ipv6 community-list
show bgp ipv6 dampened-paths
show bgp ipv6 filter-list
show bgp ipv6 flap-statistics
show bgp ipv6 inconsistent-as
show bgp ipv6 labels
show bgp ipv6 neighbors
show bgp ipv6 paths
show bgp ipv6 peer-group
show bgp ipv6 prefix-list
show bgp ipv6 quote-regexp
show bgp ipv6 regexp
show bgp ipv6 route-map
show bgp ipv6 summary
show bgp vpnv6 unicast
show ipv6 ospf
show ipv6 ospf border-routers
show ipv6 ospf database
show ipv6 ospf event
show ipv6 ospf flood-list
show ipv6 ospf graceful-restart
show ipv6 ospf interface
show ipv6 ospf neighbor
show ipv6 ospf request-list
show ipv6 ospf retransmission-list
show ipv6 ospf statistics
show ipv6 ospf summary-prefix
show ipv6 ospf timers rate-limit
show ipv6 ospf traffic
show ipv6 ospf virtual-links
show ipv6 pim anycast-RP
show ipv6 pim bsr
show ipv6 pim df
show ipv6 pim df winner
show ipv6 pim group-map
show ipv6 pim interface
show ipv6 pim join-prune statistic
show ipv6 pim limit
show ipv6 pim neighbor
show ipv6 pim range-list
show ipv6 pim topology
show ipv6 pim traffic
show ipv6 pim tunnel
show ipv6 policy
show ipv6 port-map
show ipv6 prefix-list
show ipv6 protocols
show erm statistics
show fm ipv6 pbr all
show fm ipv6 pbr interface
show fm ipv6 traffic-filter
show fm raguard
show ipv6 access-list
show ipv6 cef
show ipv6 cef adjacency
show ipv6 cef events
show ipv6 cef exact-route
show ipv6 cef neighbor discovery throttling
show ipv6 cef non-recursive
show ipv6 cef platform
show ipv6 cef summary
show ipv6 cef switching statistics
show ipv6 cef unresolved
show ipv6 cef vrf
show ipv6 cef with epoch
show ipv6 cef with source
show ipv6 cga address-db
show ipv6 cga modifier-db
show ipv6 destination-guard policy
show ipv6 dhcp
show ipv6 dhcp binding
show ipv6 dhcp conflict
show ipv6 dhcp database
show ipv6 dhcp guard policy
show ipv6 dhcp interface
show ipv6 dhcp pool
show ipv6 dhcp relay binding
show ipv6 eigrp events
show ipv6 eigrp interfaces
show ipv6 eigrp neighbors
show ipv6 eigrp topology
show ipv6 eigrp traffic
show ipv6 flow cache aggregation
show ipv6 flow export
show ipv6 general-prefix
show ipv6 inspect
show ipv6 interface
show ipv6 local pool
show ipv6 mfib
show ipv6 mfib active
show ipv6 mfib count
show ipv6 mfib global
show ipv6 mfib instance
show ipv6 mfib interface
show ipv6 mfib route
show ipv6 mfib status
show ipv6 mfib summary
show ipv6 mld groups
show ipv6 mld groups summary
show ipv6 mld host-proxy
show ipv6 mld interface
show ipv6 mld snooping
show ipv6 mld ssm-map
show ipv6 mld traffic
show ipv6 mobile binding
show ipv6 mobile globals
show ipv6 mobile home-agents
show ipv6 mobile host groups
show ipv6 mobile router
show ipv6 mobile traffic
show ipv6 mobile tunnels
show ipv6 mrib client
show ipv6 mrib route
show ipv6 mroute
show ipv6 mroute active
show ipv6 mtu
show ipv6 rip
show ipv6 route
show ipv6 route shortcut
show ipv6 route summary
show ipv6 route vrf
show ipv6 routers
show ipv6 rpf
show ipv6 snooping capture-policy
show ipv6 snooping counters
show ipv6 snooping features
show ipv6 snooping policies
show ipv6 source-guard policy
show ipv6 spd
show ipv6 static
show ipv6 traffic
show ipv6 tunnel
show ipv6 virtual-reassembly
show ipv6 virtual-reassembly features
show ipv6 wccp
show ipv6 wccp global counters
show isis ipv6 rib
show monitor event-trace vpn-mapper
show ospfv3 border-routers
show ospfv3 database
show ospfv3 events
show ospfv3 flood-list
show ospfv3 graceful-restart
show ospfv3 interface
show ospfv3 max-metric
show ospfv3 neighbor
show ospfv3 request-list
show ospfv3 retransmission-list
show ospfv3 statistic
show ospfv3 summary-prefix
show ospfv3 timers rate-limit
show ospfv3 traffic
show ospfv3 traffic neighbor
show ospfv3 virtual-links
show platform 6rd tunnel-endpt
show platform software ipv6-multicast
show platform software vpn
show tunnel 6rd
show tunnel 6rd destination
show tunnel 6rd prefix

Huawei

Interface altında IPv6 tanımlama

1. ipv6 enable
2. ipv6 address { ipv6 address/mask } 

 

IPv6 static route tanımlama

1. ipv6 route-static { ipv6 address ve mask }  interface { value } { destination ipv6 address }


IPv6 BGP tanımlama

1. BGP xxxxxx
2. peer { destination ipv6 address } as-number { value }
3. ipv6-family unicast
4. peer { destination ipv6 address } enable
5. peer { destination ipv6 address } route-policy { policy name } import
6. peer { destination ipv6 address } route-policy { policy name } export


IPv6 prefix-list tanımlama

1. ip ipv6-prefix { prefix name } index { value } permit { ipv6 address ve mask }  


IPv6 Route Policy oluşturma

1. route-policy { policy name } permit node { value }
2. if-match ipv6 address prefix-list { prefix name }
3. apply local-preference { value }
4. apply community { community id }

Huawei IPv6 Kontrol Komutları

display ipv6 interface
display ipv6 interface tunnel
display ipv6 neighbors
display ipv6 pathmtu
display ipv6 socket
display ipv6 statistics
display ipv6 routing-table
display ipv6 routing-table limit
display ipv6 routing-table protocol
display ipv6 routing-table statistics
display ipv6 routing-table time-range
display rawip ipv6 statistics
display snmp-agent trap feature-name ipv6 all
display tcp ipv6 authentication-statistics
display tcp ipv6 statistics
display tcp ipv6 status
display this ipv6 interface
display udp ipv6 statistics
display dhcpv6 client
display dhcpv6 client prefix
display dhcpv6 client statistics
display dhcpv6 duid
display dhcpv6 relay prefix-delegation
display dhcpv6 relay statistics
display dhcpv6 pool
display dhcpv6 relay
display dhcpv6 server
display dhcpv6 server group
display dhcpv6 statistics
display dns ipv6 dynamic-host
display ipv6 host
display isis ipv6 bfd interface
display isis ipv6 bfd session
display bgp ipv6 bfd session
display bgp ipv6 routing-table
display bgp ipv6 routing-table statistics
display ip ipv6-prefix
display ipv6 fib
display default-parameter tcp6
display icmpv6 statistics
display ipv6 attack-source overlapping-fragment
display rawip ipv6 statistics
display snmp-agent trap feature-name ipv6 all
display tcp ipv6 authentication-statistics
display tcp ipv6 statistics
display tcp ipv6 status
display this ipv6 interface
display udp ipv6 statistics

Windows bilgisayarlar için IPv6 konfigürasyonu aşağıdaki adımlar izlenerek yapılabilir:

  1. Başlamak için, Başlat menüsünde arama kutusuna "cmd" yazın ve "Command Prompt" uygulamasını seçin.
  2. Command Prompt açıldıktan sonra, "ipv6" yazın ve enter tuşuna basın. Bu, sisteminizdeki IPv6 yapılandırmasını gösterir.
  3. IPv6 adresini değiştirmek için "netsh interface ipv6 set address" komutunu kullanabilirsiniz. Örneğin, "netsh interface ipv6 set address interface=Ethernet address=2001:0db8:85a3:0000:0000:8a2e:0370:7334" komutu ile Ethernet arayüzü için adres değiştirebilirsiniz.
  4. Alt ağ maskesini değiştirmek için "netsh interface ipv6 set prefixlength" komutunu kullanabilirsiniz. Örneğin, "netsh interface ipv6 set prefixlength interface=Ethernet prefixlength=64" komutu ile Ethernet arayüzü için alt ağ maskesini 64 olarak değiştirebilirsiniz.
  5. Varsayılan ağ geçidini değiştirmek için "netsh interface ipv6 set route" komutunu kullanabilirsiniz. Örneğin, "netsh interface ipv6 set route interface=Ethernet next-hop=2001:0db8:85a3:0000:0000:8a2e:0370:7334" komutu ile Ethernet arayüzü için varsayılan ağ geçidini 2001:0db8:85a3:0000:0000:8a2e:0370:7334 olarak değiştirebilirsiniz.
  6. Değişiklikleri kaydetmek için "netsh interface ipv6 set global" komutunu kullanabilirsiniz. Örneğin, "netsh interface ipv6 set global randomizeidentifiers=disabled" komutu ile rastgele tanımlayıcıları devre dışı bırakabilirsiniz.
  7. Değişiklikleri geri almak için "netsh interface ipv6 reset" komutunu kullanabilirsiniz.

Not: Bu komutlar yönetici hakları gerektirir. Bu komutları çalıştırmadan önce Command Prompt yönetici olarak çalıştırmanız gerekir.

XAMPP için PHP Yazılım Upgrade Nasıl Yapılır

 PHP Yazılımını upgrade etmek için ilk olarak aşağıdaki URL'e gidilir ve yeni yazılım versiyonu bilgisayara indirilir. Burada XAMPP server üzerinde PHP yazılımını nasıl upgrade edeceğimizi yazacağız. Diğer uygulamalar da benzer şekilde yapılabilir. İşletim sistemi için uygun olan XAMPP yazılımı dosya seçilerek indirilmelidir.

https://www.apachefriends.org/download.html

Bilgisayarınıza indirdiğiniz yazılımı bilgisayarınızda bir klasöre açın. Sunucu üzerinde çalışan Apache servisini durdurun. Sunucudaki PHP yazılımının klasörünün adını değiştirin (Kesinlikle silmeyin) İndirip diske açtığınız klasördeki PHP klasörünü sunucuda eski PHP klasörünün olduğu dizine kopyalayın. Eksi PHP klasöründe bulunan php.ini dosyasını yeni klasör içindeki dosya ile değiştirin ve Apache servisini tekrar başlatın.

PHP içine daha önce modül yüklediyseniz Apache açılırken hata verecektir. Yüklediğiniz bu modülleri de aynı klasöre diğer klasörden kopyalayıp servisi tekrar açmayı denemelisiniz. Sorun devam ediyorsa geri dönüş yeni klasörü silip eski klasörün adını tekrar PHP yapmak şeklinde olacaktır. İşlem tamamlandıktan sonra versiyon testlerini info.php dosyasından yapabilirsiniz.

      

Oracle SQL ve Postgre SQL de Pivot Nasıl Yapılır

 Oracle SQL'de aşağıdaki gibi yaptığımız Pivot işlemini PostgreSQL'de yapabilmek için Crosstab komutu kullanılır. Yapacağımız örnekte dört kolona sahip bir tablo düşünelim. KolonBilgiler kolonu aynı kolona yazılmış bilgi başlıklarını, KolonDegerler kolonu bilgi başlıklarına karşılık gelen değerleri içersin. Çıktı olarak ilk iki kolonu tablodan gelecek diğer dört kolonu bilgi başlıklarının kolon olarak gösterileceği bir yapı olsun. Toplamda altı kolon oluşturacağız.

SELECT * FROM
(SELECT Kolon1, Kolon2, KolonBilgiler, KolonDegerler FROM Tablo_adı
) d PIVOT (
MAX(KolonDegerler )
FOR KolonBilgiler
IN (Bilgi1, Bilgi2, Bilgi3,Bilgi4
)) piv
WHERE .....

Yukarıdaki Oracle SQL Pivot sorgusunun Postgre DB karşılığı aşağıdaki gibidir.

SELECT *
FROM crosstab ('SELECT "Kolon1", "Kolon2", "KolonBilgiler", "KolonDegerler ", FROM "Tablo_adı" ORDER  BY 1,2'
, $$SELECT unnest('{Bilgi1, Bilgi2, Bilgi3,Bilgi4}'::text[])$$
) AS ct (Kolon1 text,  Kolon2 text, Bilgi1 text,
Bilgi2 text, Bilgi3 text, Bilgi4 text) 
WHERE .....

Burada dikkat edilmesi gereken konu bilgilerin ve bilgilerin altında seçilecek değer kolonu hariç diğer kolonların hepsinin ct içinde belirtilmesi gerekir. Belirtilmezse crosstab içinde uyumsuz kolon sayısı olduğu uyarısını alabilirsiniz.



Python IP Doğrulama (IPv4 IPv6 Public Private)

 Python içinde hazır gelen Ipaddress modülü bir IP adresini doğrulamak ve tanımlamak için bize yardımcı olacaktır. IP adresi IPv4, IPv6, Public veya private olabilir. Bu ayrımı küçük bir fonksiyon ile anlayabiliriz.

def validate_ip_address(ip_string):
    try:
        ip_object = ipaddress.ip_address(ip_string)
        if ipaddress.ip_address(ip_string).is_private == False:
            if ip_object.version == 4:
                print("IPv4")
                return "IPv4"
            else:
                print("IPv6")
                return "IPv6"
        else:
            print("The IP address is private")
            return "private"
    except ValueError:
        print("The IP address is not valid")
    return "NotValid"

validate_ip_address(192.168.0.1)

Bir IP adresinin Network IP'sini bulmak istiyorsak aşağıdaki kod bize yardımcı olacaktır.

ip_address=192.168.1.55/24
net_ip=ipaddress.ip_network(ip_address, strict=False)
print(net_ip)

Ayrıntılı bilgi için aşağıdaki adrese göz atabilirsiniz.

ipaddress — IPv4/IPv6 manipulation library

https://docs.python.org/3/library/ipaddress.html

Kaynak kod: https://github.com/python/cpython/blob/3.10/Lib/ipaddress.py

IP versiyon 4 - IP versiyon 6 - Public IP - Private IP 

IP Versiyon kontrolü.

IP bilgileri nasıl listelenir:

-------------------------------------------------
import ipaddress
 
# Initializing an IPv4 Network.
network = ipaddress.IPv4Network("192.168.1.0/24")

print(network)
 
# Network address of the network: 192.168.1.0
print("Network address of the network:", network.network_address)
 
# Broadcast address: 192.168.1.255
print("Broadcast address:", network.broadcast_address)
 
# Network mask: 255.255.255.0
print("Network mask:", network.netmask)
 
# with netmask: 192.168.1.0/255.255.255.0
print("with netmask:", network.with_netmask)
 
# with_hostmask: 192.168.1.0/0.0.0.255
print("with_hostmask:", network.with_hostmask)
 
# Length of network prefix in bits: 24
print("Length of network prefix in bits:", network.prefixlen)
 
# Total number of hosts under the network: 256
print("Total number of hosts under the network:", network.num_addresses)
 
# Overlaps 192.168.0.0/16: True
print("Overlaps 192.168.0.0/16:", network.overlaps(ipaddress.IPv4Network("192.168.0.0/16")))
 
# Supernet: 192.168.0.0/23
print("Supernet:", network.supernet(prefixlen_diff=1))
 
# The network is subnet of 192.168.0.0/16: True
print("The network is subnet of 192.168.0.0/16:",
      network.subnet_of(ipaddress.IPv4Network("192.168.0.0/16")))
 
# The network is supernet of 192.168.0.0/16: False
print("The network is supernet of 192.168.0.0/16:",
      network.supernet_of(ipaddress.IPv4Network("192.168.0.0/16")))
 
# Compare the network with 192.168.0.0/16: 1
print("Compare the network with 192.168.0.0/16:",
      network.compare_networks(ipaddress.IPv4Network("192.168.0.0/16")))


Python

Python Belli Bir Zaman Aralığında Çalıştırma

Python yazılımını belli saatler aralığında çalıştırmanız gerekirse aşağıdaki kodu bu amaçla kullanabilirsiniz. Kod aynı zamanda bir animasyon da içermektedir. Bist açılış kapanış saatleri arasında bir kod çalıştıracağınızı düşünelim. Kod işlem başladığında mevcut zaman aralık dışında ise ekrana animasyon çıktısı verir. Mevcut zaman aralık içerisinde ise yazılım bir sonraki adıma devam eder.

import time
import datetime
def time_in_range(start, end):
    current = datetime.datetime.now().time()
    return start <= current <= end

def typewriter(text, delay=0.1):
  for letter in text:
    print(letter, end='', flush=True)
    time.sleep(delay)
  print()

def starttime():
    start = datetime.time(9, 35, 0)
    end = datetime.time(18, 15, 0)

    result=time_in_range(start, end)
    while result==False:
        typewriter("#########################", 0.05)
        typewriter("########-BIST-########", 0.05)
        typewriter("####-"+str(datetime.datetime.now().time())+"-####", 0.05)
        result=time_in_range(start, end)
    
starttime()





Python Pandas Kullanımı

 Pandas en çok kullanılan modül olarak karşımıza çıkıyor. Bu bölümde Pandas'ın bazı önemli özelliklerinden bahsedeceğiz, pandas komutları ve kullanımını inceleyeceğiz. Pandas en kullanışlı data frame yöntemlerinden birisidir. Python code içerisinde bir database oluşturmak için kullanılır ve ram'de saklanır. Bir database'e veri yazıp sonra okumaktansa ram üzerinden bir dataframe oluşturup işlemleri bu df ile yapmak işleri çok hızlandıracaktır. Peki pandas nasıl kullanılır bakalım. İlk olarak pandas yükleyip import etmemiz gerekir. Yüklemek için;

# conda
conda install pandas
pip install pandas
# pip

Python kodumuza import etmek için;

import pandas as pd

kodu kullanılmalıdır. import komutu sonundaki as pd yeniden isimlendirmek için kullanılmaktadır ve pandas python içinde genelde pd kısaltmasıyla kullanılır, dataframe kısaltması da df şeklinde kullanılmaktadır. Basit boş bir dataframe oluşturmak için;

Data frame:

df=pd.DataFrame()

kodunu kullanabiliriz. Kodu oluşturmadan önce kolon isimlerini ve kaç adet kolon kullanacağımızı biliyorsak bu bilgilerle boş frameimizi oluşturabiliriz.

df=pd.DataFrame(columns =['kolon1','kolon2'])

Pandar df'ye genelde dictionary ile oluşturulur. Df'ye elimizdeki bir data ile oluşturmak için;

data={'kolon1': [21, 23, 24, 21], 'kolon2': [1,2,3,4]}

df = pd.DataFrame(data)

veya

data = []
data.append([21, 1, 'India'])
data.append([23, 2, 'India'])
data.append([24, 3, 'India'])
data.append([24, 4, 'India'])
df = pd.DataFrame(data, columns=['kolon1', 'kolon2', 'kolon3'])

Bir dataframe'e sabit değerli bir kolon eklemek için aşağıdaki komutu kullanabilirsiniz. Bu komut frame sonuna bir kolon ekler ve kolondaki tüm değerleri 10 yapar.

df["Percentage"] = 10

Ekleyeceğimiz kolonu sona değilde en başa veya belirli bir yere eklemek için aşağıdaki komutu kullanabilirsiniz. En başa eklemek için 0, sonraki kolon sıraları için bir artırarak kolonun yerini belirtebilirsiniz. Biz 2. sıraya (Yani 1. sıraya) bir kolon ekleyelim.

df.insert(1, 'Percentage', '10')

Data frame'i bir data ile oluşturduk buna data içeren bir kolon daha eklemek istersek;

kolon3 = ['Delhi', 'Bangalore', 'Chennai', 'Patna']

df['kolon3'] = kolon3

veya

df2 = df.assign(kolon3=['Delhi', 'Bangalore', 'Chennai', 'Patna'])

veya

Eklenecek olan kolon 2. sıraya yerleştirilecek ise;

df.insert(1, "kolon3", ['Delhi', 'Bangalore', 'Chennai', 'Patna'], True)

şeklinde kolonlar arasına yeni bir kolon yerleştirilebilir.

Pandas Frame'e Veri Ekleme:

df + 1 veya df.add(1) dataframe içindeki tüm numeric değerleri bir artırır.

df.div(10) tüm değerleri 10'a böler.

df - [1, 2] veya df.sub([1, 2], axis='columns') 1. kolondan 1, 2. kolonda 2 değerini çıkarır.

Bir pandas frame ile dictionary dataframe'i birleştirmek için append kullanılır.

df2 = {'kolon1': '15', 'kolon2': '23', 'kolon3': 'India'}

df = df.append(df2, ignore_index = True)

Bir Pandas frame ile başka bir pandas frame'i birleştirmek için concat kullanabilirsiniz.

df2 = pd.DataFrame({'kolon1': [11], 'kolon2' : [23],  'kolon3' : ['India']})

df = pd.concat([df, df2], ignore_index = True, axis = 0)

Pandas Veri Görüntüleme:

Pandas'da büyük tabloları ekranda görüntülemeye çalıştığınızda pandas size özet bir ekran çıkarır, tüm satır ve sütünları görmek istiyorsanız bazı ekler kullanmalısınız.

Tüm satırları görmek isterseniz;

pd.set_option('display.max_rows', None)
df = pd.read_csv("data.csv")
print(df)

kodunu kullanmalısınız. None yazan yere görmek istediğiniz satır sayısını yazabilirsiniz. Tüm sütünları görmek isterseniz;

pd.set_option('display.max_columns', None)
df = pd.read_csv("data.csv")
print(df)

None yazan yere görmek istediğiniz sütün sayısını yazabilirsiniz. 

Dataframe hakkında genel bilgi

df.info()

Sütünların bilgileri

df.describe()

İlk 5 satırı görmek için

df.head()

Son 7 satırı göster

df.tail(7)

Datafame içinde belirli bir satır ve sütünu görmek için;

df.loc[row, column]

index

Pandas listelerinizin yanında bir index gösterir, dosyaya yazarken bu indexin görünmesini istemiyorsanız;

    data = pd.read_sql(query, con=connection)
    data.to_csv('data.csv', index=False)

Bu şekilde index'i kapatabilirsiniz.

Pandas Framelerini Birleştirme:

Elimizde üç ader dataframe olduğunu düşünelim. Bu dataframelerin kolonları aynı ise bunları tek bir dataframe'de birleştirmek için:

frames = [df1, df2, df3]

result = pd.concat(frames)

Elimizde olan bir data frame'e bir başka dataframe'den ekleme yapacak isek append komutunu kullanabiliriz.

DataFrame.append(dataframe, ignore_index=False, verify_integrity=False, sort=None) 
ör;
result=pd.DataFrame()
result=result.append(df, ignore_index=True, verify_integrity=False, sort=None)

Duplicate verileri silme
    Single_List=Single_IP_List.drop_duplicates()
Bu komutta index'i de yeniden oluşturmak için parantez içine ignore_index=True yazılabilir veya aşağıdaki işlem yapılır.
    Single_List = Single_IP_List.reset_index(drop=True) #Duplicate veriler silindiği için index yeniden oluşturulur.
    print(Single_List)

Python Pandas kullanımı ve pandas komutları.

Diğer Konular;

Pandas DataFrame

Pandas tutorial

Pandas read_csv

Pandas groupby

Pandas merge

Pandas documentation

Pandas functions

Pandas plot

Pandas data manipulation

Pandas data analysis

Google