Skript zum Mounten von NTFS formatierten Partitionen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
phill971
Beiträge: 28
Registriert: 04.04.2016 12:54:40

Skript zum Mounten von NTFS formatierten Partitionen

Beitrag von phill971 » 08.04.2016 11:59:00

Hallo,

ich möchte ein Skript schreiben, welches sämtliche Partitionen daraufhin prüft, ob diese NTFS formatiert sind. Wenn dem so ist soll es diese Partition mounten und weitere Überprüfungen durchführen (ich möchte im Endeffekt nach Windowslogs suchen und diese kopieren, aber das ist eine andere Geschichte..).

Ich habe das Skript auch schon in soweit am Laufen gehabt, dass er die Partitionen versucht zu mounten mit

Code: Alles auswählen

mount -t ntfs $p /mnt/part
Allerdings, wenn ich das richtig im Kopf habe, versucht er damit jede Partition als NTFS Partition zu mounten und schlägt dann eben fehl, wenn diese nicht NTFS formatiert ist, richtig?

Deshalb habe ich mir folgendes ausgedacht:

Code: Alles auswählen

#!/bin/bash

mkdir -p /mnt/part

for p in $(ls /dev/[hs]d[a-z]*)
do
        echo "found partition: $p" #Erfolgsmeldung, Partitionen gefunden.. könnte man auch weglassen

        #funktion zum überprüfen, ob die gefundene Partition überhaupt NTFS formatiert ist. Filtert nur das Wort "ntfs" raus
        function fstest {
                blkid $p | sed 's/.*TYPE="//; s/".*$//' |grep "ntfs" #zeigt an, ob eine Partition ntfs formatiert ist
        }

        fstest #ausgabe falls diese partition ntfs formatiert ist, zur Verständlichkeit während der Testphase..
        if [[ fstest = "ntfs" ]] #abfrage, ob partition ntfs ist
                then
                        mount -t ntfs $p /mnt/part > /dev/null 2>&1 # durch die Umleitung der Kanäle out und error auf /dev/null werden diese Ausgaben ins Nirvarna umgeleitet
                        if [[ $? -eq 0 ]] # konnte die Partition gemounted werden (return value 0)
                        then
                                echo "mounted $p" #Ausgabe, welche Partition gemounted wurde..
                        fi
                        if [[ -d "/mnt/part/Windows/System32/winevt/Logs" ]] #Prüfe, ob der gesuchte Ordner auf dieser Partition vorhanden ist
                        then
                                echo "winlogs found"

                fi

                umount /mnt/part #wichtig, unmounten der Partition nicht vergessen, sonst kann die Schleife nicht weiter arbeiten
                else
                echo "no ntfs on $p" #Ausgabe, wenn das Dateisystem nicht ntfs ist
                fi
done
Damit lasse ich das Dateisystem der Partition ausgeben, wenn dieses "ntfs" ist wird die Partition gemounted, wenn nicht, dann nicht.
Das Skript läuft durch, gibt aus, dass Partitionen gefunden wurden, dann gibt die Funktion fstest auch aus, dass eine ntfs Partition gefunden wurde, jedoch scheitert es dann in der if-Abfrage. Das Skript sagt mir trotzdem, "no ntfs found on /dev/sdb1".

Ich finde leider den Fehler nicht und hoffe ihr könnt mir dabei behilflich sein.

Danke im voraus für eure Hilfe! :THX:

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Skript zum Mounten von NTFS formatierten Partitionen

Beitrag von smutbert » 08.04.2016 13:09:08

Wäre es nicht einfacher sich so eine Liste der ntfs-formatierten Partitionen (oder anderer Blockgeräte) zu holen?

Code: Alles auswählen

blkid | grep 'TYPE="ntfs"' | awk -F ":" '{ print $1 }'
und die dann mit einer for-Schleife abzuarbeiten?
Alternativ könntest du mit deinem fstest die Blockgeräte unter »/dev/disk/by-uuid/« durchgehen, statt nach dem Muster /dev/[hs]d[a-z]* zu suchen.


Aber zum eigentlich Problem: Hast du Debianntfs-3g installiert? Der im Kernel eingebaute Treiber ist soweit ich weiß für aktuelle ntfs-Versionen unbrauchbar.

phill971
Beiträge: 28
Registriert: 04.04.2016 12:54:40

Re: Skript zum Mounten von NTFS formatierten Partitionen

Beitrag von phill971 » 08.04.2016 14:38:54

smutbert hat geschrieben:Wäre es nicht einfacher sich so eine Liste der ntfs-formatierten Partitionen (oder anderer Blockgeräte) zu holen?

Code: Alles auswählen

blkid | grep 'TYPE="ntfs"' | awk -F ":" '{ print $1 }'
und die dann mit einer for-Schleife abzuarbeiten?
Alternativ könntest du mit deinem fstest die Blockgeräte unter »/dev/disk/by-uuid/« durchgehen, statt nach dem Muster /dev/[hs]d[a-z]* zu suchen.


Aber zum eigentlich Problem: Hast du Debianntfs-3g installiert? Der im Kernel eingebaute Treiber ist soweit ich weiß für aktuelle ntfs-Versionen unbrauchbar.
ntfs-3g ist installiert.

Habe es jetzt so gemacht wie du vorgeschlagen hast, mit blkid die ntfs formatierten Partitionen auszugeben und diese dann in einer For-Schleife zu verarbeiten.
Das Skript tut nun, was es soll. Ich hänge es mal an, für den Fall, dass dieser Thread mal ausgegraben wird und jemand das gleiche vor hat wie ich.

Code: Alles auswählen

#!/bin/bash

mkdir -p /mnt/part

# p wie partition.. mache für jede Partition, welche über ls /dev/[hs]d[a-z]* ausgegeben wird folgende Befehle..
# ls /dev/[hs]d[a-z]* wird benötigt, um alle Festplattenarten (hd*, sd*) abzudecken, a-z um alle angeschlossenen Platten aufzuzählen, inklusive der Partitionen -> *

#für jede ntfs Partition mache ...
for p in $(blkid | grep 'TYPE="ntfs"' | awk -F ":" '{ print $1 }')
do
        echo "NTFS formatierte Partition gefunden: $p" #Erfolgsmeldung, Partitionen gefunden.. könnte man auch weglassen

                mount -t ntfs $p /mnt/part > /dev/null 2>&1 # durch die Umleitung der Kanäle out und error auf /dev/null werden diese Ausgaben ins Nirvarna umgeleitet
                if [[ $? -eq 0 ]] # konnte die Partition gemounted werden (return value 0)
                then
                        echo "Partition $p eingehängt" #Ausgabe, welche Partition gemounted wurde..
                else
                        echo "Partition $p konnte nicht gemounted werden"
                fi
                if [[ -d "/mnt/part/Windows/System32/winevt/Logs" ]] #Prüfe, ob der gesuchte Ordner auf dieser Partition vorhanden ist
                then
                        echo "winlogs gefunden"
                        # hier muss noch das komprimieren der Windowslogs passieren..
                fi

        umount /mnt/part #wichtig, unmounten der Partition nicht vergessen, sonst kann die Schleife nicht weiter arbeiten
        echo "Partition $p ausgehängt"

done
Nochmals vielen Dank für eure(deine) Hilfe! :THX:

halo44
Beiträge: 703
Registriert: 12.05.2015 15:19:13

Re: Skript zum Mounten von NTFS formatierten Partitionen

Beitrag von halo44 » 08.04.2016 19:51:56

Ich hab zwar nicht das Gleiche vor wie Du, aber ich halte mir gerne interessante Lösungswege fest, um sie - wie Du ja richtig annimmst - eventuell irgendwann mal nützen zu können.

Dafür teste ich die Skripte natürlich, bevor ich sie "abstaube". Das habe ich auch mit Deinem Skript gemacht, wobei ich an zwei Stellen auflief:

1.) Die If-Abfragen funktionieren bei mir nur mit einfachen eckigen Klammern ( [ und ] ) und abschließendem Semikolon:

Code: Alles auswählen

if [ $? -eq 0 ];
2.) Die ntfs-Partitionen kann ich nur read only einhängen, also

Code: Alles auswählen

mount -r -t ntfs $p /mnt/part > /dev/null 2>&1
Diese Ergänzung könnte vielleicht auch hilfreich sein.

Gruss H.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Skript zum Mounten von NTFS formatierten Partitionen

Beitrag von smutbert » 08.04.2016 23:32:48

Die doppelten [[ … ]] sind eine Besonderheit der bash und phill971 verwendet ja auch die bash. Die doppelten Klammern der bash bieten ein paar Vorteile und halten soweit ich gelesen habe weniger Überraschungen für Ungeübte bereit.
Ich bemühe mich zwar auf bash-Besonderheiten zu verzichten, finde aber auch nichts dabei, wenn andere das nicht tun...

… und mir ist ehrlich gesagt nichts aufgefallen, das das Scheitern von phill971s Originalskript erklären würde. Ich habe irgendein Problem mit dem Dateisystemtreiber vermutet oä, aber das ists ja offensichtlich nicht.
(Das fehlende Debianntfs-3g oder ein aus ntfs-3g-Sicht beschädigtes Dateisystem, wobei glaube ich ntfs-3g sehr vorsichtig ist, könnten verantwortlich dafür sein, dass halo44 nur read-only mounten kann.)


Einen Änderungsvorschlag habe ich. Nichts wichtiges, aber wenn du den exit-Status von mount abfragen willst, kannst du direkt das mount in die if-Abrage setzen:

Code: Alles auswählen

#!/bin/bash

mkdir -p /mnt/part

#für jede ntfs Partition mache ...
for p in $(blkid | grep 'TYPE="ntfs"' | awk -F ":" '{ print $1 }')
do
        echo "NTFS formatierte Partition gefunden: $p"

        if mount -t ntfs $p /mnt/part &> /dev/null; then
        # &> leitet alle Ausgaben um
                echo "Partition $p eingehängt" #Ausgabe, welche Partition gemounted wurde..

                # hier könntest du gleich auch if mit der Suche nach den Logs machen...
                # sie komprimieren oder was du sonst noch damit machen willst...
                # und die Partition vor allem auch wieder unmounten, immerhin unmountest du sie bei
                # deiner Variante auch dann, wenn sie gar nicht gemountet werden konnte

                if [[ -d "/mnt/part/Windows/System32/winevt/Logs" ]]; then
                        echo "winlogs gefunden"
                else
                        echo "keine logs gefunden"
                fi
                umount /mnt/part && echo "Partition $p ausgehängt"
        else
                echo "Partition $p konnte nicht gemounted werden"
        fi
done

halo44
Beiträge: 703
Registriert: 12.05.2015 15:19:13

Re: Skript zum Mounten von NTFS formatierten Partitionen

Beitrag von halo44 » 09.04.2016 09:59:59

smutbert hat geschrieben:... Das fehlende Debianntfs-3g oder ein aus ntfs-3g-Sicht beschädigtes Dateisystem, wobei glaube ich ntfs-3g sehr vorsichtig ist, könnten verantwortlich dafür sein, dass halo44 nur read-only mounten kann ...
Das Paket Debianntfs-3g ist installiert. In der Tat aber meldete mir der schon gestern der Versuch schreibbar zu mounten ein beschädigtes Dateisystem

Code: Alles auswählen

The disk contains an unclean file system (0, 0).
Metadata kept in Windows cache, refused to mount.
Failed to mount '/dev/sda11': Die Operation ist nicht erlaubt
The NTFS partition is in an unsafe state. Please resume and shutdown
Windows fully (no hibernation or fast restarting), or mount the volume
read-only with the 'ro' mount option.
Da habe ich mich wohl gestern zu schnell auf das read-only gestürzt. Anscheinend ist aber der per default in Windows aktivierte Schnellstart verantwortlich.

Gruss H.

Antworten