os-system

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Hallo,
ich hab ne Frage generell. ich möchte mit os.system einen Befehl von der Konsole auslösen die Ausgabe in einer Text-Datei schreiben ( mehrere Befehle eig und verschiedene Dateien) und ich möchte die dann Splitten und in eine neue Text-Datei erfassen.
Das ganze brauche ich weil es auf Windows die Datei $bitmaps gibt und unter Linux nicht finde (vll gibts die auch nicht ich weis es nicht) jedenfalls is meine Frage generell kann man das so umsetzen? Danke


okay hab nun

os.system("fdisk -s /dev/sd*")
os.system("dumpe2fs /dev/sda2 >file.txt")
und das funktioniert auch. :)
das Problem ist allerdings wie sage ich das er die komplette Festplatte durch dumpe2fs durchlaufen soll und alles ausgeben soll?
BlackJack

@bluelagoon: Und jetzt bitte noch einmal so erklären, dass man es auch versteht. ;-)
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

ok warte also
ich weis nicht ob du das weisst, aber auf Windows gibts ne versteckte Datei die sich $bitmaps nennt. Was bitmaps sind weisst du warscheinlich, also ich möchte die Cluster der Festplatte bzw Partitionen sprich in der $bitmap steht z.b. 01011101 cluster0 heisst frei cluster 1 heisst belegt so ist der Aufbau der $bitmap.
Gibts so ne Datei unter Linux? ich hab mit dumpe2fs /dev/sda2 herausgefunden das man damit die Superblocks angezeigt bekommt und die einzelnen Sachen die dazu gehören. Nun möchte ich falls es die Datei nicht gibt die selbst basteln sprich mit dem Befehl in ne Text-Datei schreiben. Mein einziges Problem ist gerade bei dumpe2fs das er sagt wenn ich angeb /dev/sd* dumpe2fs: Bad magic number in super-block beim Versuch, /dev/sda1 zu öffnen
Die Ausgabe von dumpe2fs pack ich in eine Text-Datei und lies diese aus und erstell damit die Datei die ich brauch. (Hole nur paar Zeilen heraus). Das ist mein Problem gerade :)
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

so ich bin nun ziemlich weit gekommen nun verlässt mich mein Wissen :D
also die Datei hat ja ewig viele Zeilen und ich möchte nur Freie Blöcke: 131074-131075, 131078-131088, 131090-131092, 131123-131124, 131126-131135usw und freie inodes Freie Inodes: 16328-24480 (Nur ein Beispiel)
jetzt hab ich das so aufgebaut moment:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import os

os.system("dumpe2fs  /dev/sda3 >file.txt")
file = open("file.txt", 'r')
for line in file.readlines():
    if line.startswith("Freie Blöcke:"):
        print line
        datei = open("bitmap.txt", "w")
        datei.writelines(line)
        datei.close()

Wenn ich statt dem irgendwas anderes eingib von den Zeilen wird es automatisch hinzugefügt. aber wenn ich freie Blöcke haben will ändert sich dort nichts :/ Ich hoffe das ihr mir nun besser helfen könnt den Rest hab ich selbst ganz gut erledigt :)
okay Fehler gefunden wegen Leerzeichen.
Zuletzt geändert von bluelagoon am Dienstag 27. September 2011, 10:49, insgesamt 1-mal geändert.
BlackJack

@bluelagoon: So eine Datei gibt es unter Linux nicht. Es gibt ja auch eine ganze Reihe von verschiedenen Dateisystemen, die ihre Daten alle etwas anders auf der Platte organisieren. Es gibt solche die eine Bitmap mit belegten und freien Blöcken führen, aber auch welche die das nicht tun, wo man so etwas erst aus anderen Datenstrukturen errechnen müsste.

Ist ``/dev/sda2`` bei dem System denn überhaupt ein ext2-Dateissystem, oder ein Nachfolger von dem Format? Falls nicht, kann man da natürlich auch nicht mit ``dumpe2fs`` heran gehen. Die zweite Partition ist bei Linux zum Beispiel nicht selten eine Swap-Partition.

`os.system()` sollte man übrigens nicht verwenden. Beim `subprocess`-Modul kann man sich auch dem Umweg über Dateien sparen und die Ausgabe von extern aufgerufenen Programmen direkt verarbeiten.

Python-Quelltext bitte in Python-Code-Tag setzen, sonst kann man den nicht vernünftig lesen.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

naja ich hab nur ein kleines Problem noch entdeckt ich will zeilenweise schreiben:

Code: Alles auswählen

        datei = open("bitmap.txt", "w")
        for line in file.writelines():
                datei.write(line)
        datei.close()
Fehlermeldung:
Traceback (most recent call last):
File "dp_bitmap.py", line 11, in <module>
for line in file.writelines():
TypeError: writelines() takes exactly one argument (0 given)

ok dann werd ich das mit dem os.system ändern danke :)
ach Fehler gefunden ich bin heut so blind statt w einfach a xD
BlackJack

@bluelagoon: Die Fehlermeldung sagt es doch sehr deutlich wo das Problem ist. `file.writelines()` erwartet ein Argument und bekommt keines. Da schaut man jetzt in der Dokumentation nach was die Methode tut und was sie als Argument erwartet.

Ausserdem solltest Du Dich über die Semantik des 'w'-Modus beim öffnen von Dateien informieren. Steht ebenfalls in der Dokumentation.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

jo habs selber gesehn das es am append liegt denn write überschreibt ja jedes mal mehr hab ich net gebraucht :) trotzdem Danke.
UND ich finde meine Fehler selbst auch wenn ich manchmal blind bin und dann etwas brauch bis ichs check :P
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Code: Alles auswählen

        datei = open("bitmap.txt", "w")
        for line in file.writelines():
                datei.write(line)
        datei.close()
Dein Fehler war das du mit der "for" Schleife versuchst über file.writelines zu laufen :D Du meintes wohl readlines.
Außerdem wenn du BlackJacks Vorschlag os.system beiseite zu legen und statt dessen subprocess.Popen benutzt brauchst du die Datei gar nicht mehr.
Wenn du es vermeiden kannst solltest du nie auf die Festplatte schreiben. Das ist nur unnötig langsam.
Antworten