Python, podstawowe operacje na plikach i tek

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Python, podstawowe operacje na plikach i tekście

Post autor: LordRuthwen »

Witam.
Przepisuję skrypt napisany w Bash-u do Pythona, bo Bash jest za wolny.
Skrypt na którym testuję wygląda tak:

Kod: Zaznacz cały

#!/usr/bin/env python
import os
any = 'FF:FF:FF:FF:FF:FF'
os.remove('oki-test')
os.remove('dhcpd.conf')
plik = open('input/ipeki', 'r')
oki1 = open('oki-test', 'a')
dhcp = open('dhcpd.conf', 'a')
for linijka in plik:
        k1 = linijka.split('\t')
        if k1[0].lower() == any.lower():
                oki1.write('iptables -A INPUT -s '+k1[1]+' -j ACCEPT\n')
        else:
                oki1.write('iptables -A INPUT -s '+k1[1]+' -m mac --mac-source '+k1[0]+' -j ACCEPT\n')
                dhcp.write('host a'+k1[1]+' { \n\toption routers\tbrama;\n\toption subnet-mask\tmaska;\n\toption domain-name-servers\tdns1, dns2;\n\thardware ethernet\t'+k1[0]+';\n\tfixed-address\t'+k1[1]+';\n}\n')
plik.close()
oki1.close()
dhcp.close()
Fragment pliku źródłowego wygląda tak:

Kod: Zaznacz cały

00:C1:27:00:0C:E8       85.28.xx.xx
00:23:54:BF:CE:46       85.28.xx.xx
00:01:02:1D:C2:06       85.28.xx.xx
00:4F:63:80:41:47       85.28.xx.xx
00:1A:4D:F4:BD:87       85.28.xx.xx
00:E0:4C:2B:01:F2       85.28.xx.xx
00:11:09:16:05:5b       85.28.xx.xx
00:0E:E8:E7:81:64       85.28.xx.xx
00:22:69:07:96:89       85.28.xx.xx
Problem polega na tym, że efekt takiego skryptu jest taki:

Kod: Zaznacz cały

iptables -A INPUT -s 85.28.xx.xx
 -m mac --mac-source 00:C1:27:00:0C:E8 -j ACCEPT
iptables -A INPUT -s 85.28.xx.xx
 -m mac --mac-source 00:23:54:BF:CE:46 -j ACCEPT
iptables -A INPUT -s 85.28.xx.xx
 -m mac --mac-source 00:01:02:1D:C2:06 -j ACCEPT
iptables -A INPUT -s 85.28.xx.xx
 -m mac --mac-source 00:4F:63:80:41:47 -j ACCEPT
iptables -A INPUT -s 85.28.xx.xx
 -m mac --mac-source 00:1A:4D:F4:BD:87 -j ACCEPT
Oraz taki:

Kod: Zaznacz cały

host a85.28.xx.xx
 {
        option routers  brama;
        option subnet-mask      maska;
        option domain-name-servers      dns1, dns2;
        hardware ethernet       00:C1:27:00:0C:E8;
        fixed-address   85.28.xx.xx
;
}
Problemem są prawdopodobnie znaki końca linii występujące po IP, wie ktoś jak się tego pozbyć?
Zapewne nie jest to mój ostatni post w tym temacie, Pythona nie znam wcale.
To nie jest ostateczna wersja skryptu, w bashu zajmuje około 150 linii, ale od czegoś muszę zacząć?
maxdawid
Posty: 52
Rejestracja: 17 września 2008, 11:30

Post autor: maxdawid »

Możesz tak np.:

Kod: Zaznacz cały

line.replace('\n', '')
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Zakładam, że to miało być tu:

Kod: Zaznacz cały

for linijka in plik:
        [B]linijka.replace('\n', '')[/B]
        k1 = linijka.split('\t')
Nie bardzo działa.
Próbowałem też tak:

Kod: Zaznacz cały

for linijka in plik:
        [B]linijka.replace('\\n', '')[/B]
        k1 = linijka.split('\t')
I tak:

Kod: Zaznacz cały

for linijka in plik:
        [B]linijka.rstrip('\\n')[/B]
        k1 = linijka.split('\t')

Kod: Zaznacz cały

for linijka in plik:
        [B]linijka.rstrip('\n')[/B]
        k1 = linijka.split('\t')
Gdy próbuję czegoś takiego:

Kod: Zaznacz cały

for linijka in plik:
        k1 = linijka.split('\t')
        k1 = k1.rstrip('\\n')
to zwraca mi:

Kod: Zaznacz cały

Traceback (most recent call last):
  File "./test.py", line 13, in <module>
    k1 = k1.rstrip('\\n')
AttributeError: 'list' object has no attribute 'rstrip'
maxdawid
Posty: 52
Rejestracja: 17 września 2008, 11:30

Post autor: maxdawid »

jak już to

Kod: Zaznacz cały

linijka = linijka.replace('\n', '')
 
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Dziękuję, działa zarówno to powyżej jak i:

Kod: Zaznacz cały

linijka = linijka.rstrip()
Odezwę się z kolejnym problemem.

Dodane:
No to jedziemy dalej.

Mam taki kawałek skryptu:

Kod: Zaznacz cały

suma=`md5sum /etc/arp/$OS  | awk '{print $1}'`
mcedit /etc/arp/$OS
suma2=`md5sum /etc/arp/$OS  | awk '{print $1}'`
if [ "$suma" == "$suma2" ]
then
exit 0
else
...
Chciałbym uzyskać to samo, proszę o pomoc.
maxdawid
Posty: 52
Rejestracja: 17 września 2008, 11:30

Post autor: maxdawid »

Kod: Zaznacz cały

import hashlib

def md5Checksum(filePath):
    file = open(filePath, 'rb')
    md = hashlib.md5()
    while True:
              data = file.read(8192)
              if not data:
                      break
              md.update(data)
    return md.hexdigest()

suma =  md5Checksum('/etc/arp/$OS')
suma1 = md5Checksum('/etc/arp/$OS')
dalej chyba sobie poradzisz z mc'ekiem i if'em
michaeljuly

Post autor: michaeljuly »

Zapewne nie jest to mój ostatni post w tym temacie, Pythona nie znam wcale.


http://www.freerunau.com/
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

maxdawid, dziękuję, nie to powinno załatwić wszystko.
maxdawid
Posty: 52
Rejestracja: 17 września 2008, 11:30

Post autor: maxdawid »

LordRuthwen,:
nie to powinno załatwić wszystko
tzn., że sobie poradzisz czy nie?
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Powinienem sobie z tym fragmentem kodu poradzić ze wszystkim co mnie jeszcze trapi.

Dziękuję.
ODPOWIEDZ