mit bash eine ascii datei zerlegen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
cordovan
Beiträge: 467
Registriert: 03.01.2004 22:37:28

mit bash eine ascii datei zerlegen

Beitrag von cordovan » 05.07.2004 13:17:50

hi!

geht das und wenn ja einen anhaltspunkt wie ich so was machen könnte?

ich hab eine txt datei mit einem pool von ip addressen die schoen untereinander stehen. ich moechte nun mit einem prozess drauf zugreifen, eine ip schnappen, in eine variable einlesen und dann aus der datei löschen. und ich möchte prüfen ob die datei schon von einem anderen prozess genützt wird.

thx4help

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Beitrag von peschmae » 05.07.2004 18:02:28

Der einzige Haken ist eigentlich das Prüfen ob die Datei schon von einem anderen Prozess genutzt wird.

Code-Stückchen:

Code: Alles auswählen

#erste IP lesen 
IP=$(head -1 datei.txt)
#n-te IP lesen
n=7
IP=$(sed -n "$np" datei.txt)

#IP aus Datei entfernen
grep -v $IP datei.txt > datei.txt.old
mv datei.txt.old datei.txt
Vor allem das letzte bedingt aber exklusiven Zugriff auf die Datei damits kein Chaos gibt

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

Benutzeravatar
domo
Beiträge: 268
Registriert: 11.07.2002 18:18:27

Beitrag von domo » 05.07.2004 18:27:14

und ich möchte prüfen ob die datei schon von einem anderen prozess genützt wird.
Es gibt verschienden Methoden, eine Datei vor Zugriff durch einen anderen Prozess zu schützen, aber keinen auf Betriebsystemebene.

a) Es gibt da lsof, aber da hast du ein Zeit Problem: Was wenn ein anderer Prozess auf das File zugreift, nachdem du geprüft hast, ob es von einem anderen Prozess geöffnet wurde, aber bevor/wärend dein Prozess liest/schreibt ?
b) Verschieden Methoden von file lock: Problem ist hier, dass alle Prozesse, welche auf das File zugreifen, dieselbe Methoden benutzen müssen Es gibt meines Wissens in Linux keinen file lock auf Betriebsystem resp. Kernelebene. Schreibst du selber alle diese Prozesse, dann geht ein file lock.

Andere Idee: Kopiere das File in ein anderes und arbeite mit der Kopie.

Du musst schon genauer sagen, was genau du tun willst, damit eine Lösung gefunden werden kann....

Have fun...
Freedom is the freedom to say that two plus two make four. If that is granted, all else follows.

Benutzeravatar
cordovan
Beiträge: 467
Registriert: 03.01.2004 22:37:28

Beitrag von cordovan » 05.07.2004 20:19:52

danke für eure antworten :-)

ok also was ich vorhabe ist ein skript welches ich zb 3 oder 4 mal starte. aus der datei eine ip zieht. mit smbmount c$ und d$ der ip mountet und mit verschiedenen viren scannern drübergeht.
möchte also mein skript die ganze zeit in unserem lan kreisen lassen (trend micro hat sich als sehr ineffizient erwiesen ...)
bis dato füttere ich über meine firewall das skript automatisch nach auffälligen ip addressen, möcht nun aber einen permanenten scan laufen lassen auf diese art und weise.

Benutzeravatar
cordovan
Beiträge: 467
Registriert: 03.01.2004 22:37:28

Beitrag von cordovan » 07.07.2004 08:40:36

habs jetzt wie folgt gelöst. vielleicht kann es ja mal jemand brauchen :-)

while test -f pool.txt.lock
do
sleep 2
done

touch pool.txt.look
target_maschine=`head -n 1 pool.txt`
sed '1d' pool.txt > pool.txt.new
rm pool.txt
mv pool.txt.new pool.txt
rm pool.txt.look

Benutzeravatar
domo
Beiträge: 268
Registriert: 11.07.2002 18:18:27

Beitrag von domo » 07.07.2004 10:44:36

Ich hoffe, du hast hier falsch kopiert hast, denn sonst wird dein script nicht richtig laufen:

einmal schreibst du: pool.txt.lock
und zweimal: pool.txt.loock

Ausserdem gibt es ein kleines Zeitproblem: Zwischen dem Test, ob das File exisitert und dem touch-Befehl liegt eine kleine Zeitspanne. Hier könnte ein anderer Prozess schneller sein. Ob das jedoch relevant ist weiss ich nicht.
Freedom is the freedom to say that two plus two make four. If that is granted, all else follows.

Benutzeravatar
cordovan
Beiträge: 467
Registriert: 03.01.2004 22:37:28

Beitrag von cordovan » 07.07.2004 10:52:04

tippfehler, skript funktioniert und gräbt sich durch mein lan :-)

ich hab nicht das gesamte skript gepostet, sondern nur den teil dieser funktion wie ich hier danch gefragt hab.

thx aber fürs mitdenken :-)

Benutzeravatar
domo
Beiträge: 268
Registriert: 11.07.2002 18:18:27

Beitrag von domo » 07.07.2004 10:59:12

Und hier noch eine Lösung aus dem "Advanced Bash-Scripting Guide" auf http://www.linuxvoodoo.com/resources/gu ... hells.html

Code: Alles auswählen

if (set -C; : > lock_file) 2> /dev/null
then
  echo "Another user is already running that script."
  exit 65
fi   
Natürlich müsstest die Logik anpassen. (while statt if)

Vorteil: Es wird in einem Befehl getestet und das lockfile erstellt. Es gibt also keine Möglichkeit mehr für einen anderern Prozess, dazwischenzufunken.
Freedom is the freedom to say that two plus two make four. If that is granted, all else follows.

stargaizer
Beiträge: 152
Registriert: 01.04.2004 10:09:25
Kontaktdaten:

Beitrag von stargaizer » 07.07.2004 17:55:17

Hi,

ne andere Lösung wäre noch, die IP's in eine FIFO (named pipe) zu schreiben. Dann mußt du die gerade gelesene IP nicht manuell löschen.

Code: Alles auswählen

man mkfifo
Grüße

stargaizer

Antworten