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