------------------------------------------------------------

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
schorschruffneck
Beiträge: 174
Registriert: 29.04.2012 22:55:06

------------------------------------------------------------

Beitrag von schorschruffneck » 21.04.2014 21:51:15

---------------------------------------------------------------------------------------------------------------------------------------------------
Zuletzt geändert von schorschruffneck am 06.06.2014 10:05:26, insgesamt 2-mal geändert.

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Umleitung von ls -i in zweiten Befehl

Beitrag von uname » 21.04.2014 22:18:16

Leider verstehe ich das Problem nicht. Eigentlich erwartet "stat" einen Dateinamen und keine Inode. Somit sollte

Code: Alles auswählen

debugfs -R 'stat /Pfad/datei.txt' /dev/sda5
korrekt sein.

Oder kennst du vielleicht gar nicht mehr den Dateinamen, da du die Datei versehentlich gelöscht hast? Oder hast du die Datei nicht gelöscht aber kennst den Namen nicht. Aber in der jetzigen Beschreibung macht es eher weniger Sinn.

Dateinamen suchen mit deiner Inode (falls Dateien noch vorhanden):

Code: Alles auswählen

find /Pfad -inum 527332

Benutzeravatar
habakug
Moderator
Beiträge: 4313
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Umleitung von ls -i in zweiten Befehl

Beitrag von habakug » 21.04.2014 22:28:01

Hallo!

Code: Alles auswählen

# ino=`ls -i /path/ | awk -F\  '{ print $1 }'`; debugfs -R 'stat <$ino>' /dev/sda5
Debugfs gibt nimmt sehr wohl eine Inode als <filespec>:
man debugfs hat geschrieben:[...]The filespec argument may be specified in two
forms. The first form is an inode number surrounded by angle brackets,
e.g., <2>. The second form is a pathname;[...]
stat filespec
Display the contents of the inode structure of the inode file-
spec.[...]
Gruss, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Umleitung von ls -i in zweiten Befehl

Beitrag von Cae » 21.04.2014 23:02:06

Bitte never ever versuchen, ls zu parsen, das Ding ist fuer interaktive Bedienung gedacht und nicht fuer maschinelle Auswertung. Das explodiert einem sonst irgendwann, wenn wegen locale oder warumauchimmer die Spalte eben nicht da ist, wo man sie erwartet.

Stattdessen gibt es stat(1), was oben bereits angesprochen, aber verwechselt wurde. Zur Verdeutlichung: Der Parameter debugfs frisst u.a. auch den internen Befehl "stat <{inode}>", wobei {inode} eine numerische Inode ist.

Gesucht ist also etwas wie

Code: Alles auswählen

# debugfs -R "stat <$(stat -c %i {file})>" {dev}
-- wobei {file} fuer eine Datei im Dateisystem {dev} steht. Konkretes Beispiel:

Code: Alles auswählen

# debugfs -R "stat <$(stat -c %i /etc/passwd)>" "$(mount | awk '"/"==$3{print$1}')"
(der hintere Teil bestimmt, wo das root-Dateisystem liegt.)

Es fragt sich allerdings, ob der TE nicht einfach stat(1) sucht, insbesondere die unterschiedlichen Zugriffs-/sonstewas-Zeiten bekommt man damit schon heraus.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
habakug
Moderator
Beiträge: 4313
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Umleitung von ls -i in zweiten Befehl

Beitrag von habakug » 21.04.2014 23:13:45

Hallo!

Ja, "ls" ist wohl nicht so schön. Ich weiss aber ja gar nicht, was hier gewollt ist. Aber das

Code: Alles auswählen

mount | awk '"/"==$3{print$1}'
funktioniert nicht, wenn die Datei z.B. in einem extra gemounteten Homeverzeichnis liegt. Das

Code: Alles auswählen

df /home/user/myfile.txt | awk '{getline; print $1}'
vielleicht schon.

Gruss, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

schorschruffneck
Beiträge: 174
Registriert: 29.04.2012 22:55:06

Beitrag von schorschruffneck » 21.04.2014 23:34:17

---------------------------------------------------------------------------------------------------------------------------------
Zuletzt geändert von schorschruffneck am 06.06.2014 10:05:59, insgesamt 1-mal geändert.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Umleitung von ls -i in zweiten Befehl

Beitrag von Cae » 21.04.2014 23:38:06

Und ich muss nochmal draufkloppen ;) auch hier ist stat(1) besser als das eher auf interaktive Benutzung ausgelegte df(1):

Code: Alles auswählen

$ stat -c %m /etc/passwd
/
$ stat -c %m /boot/grub/
/boot
$ 
Das muss man allerdings noch per awk oder so nachbearbeiten, um das eigentliche Device rauszubekommen (bisher hat man nur den Mountpunkt):

Code: Alles auswählen

$ awk -vmount="$(stat -c %m /boot/grub/)" 'mount==$2&&/^\//{print$1}' /etc/mtab 
/dev/sda1
$ 
Eine komplette Shellfunktion saehe also so aus:

Code: Alles auswählen

debugfs_path() {
	[ 1 -ne $# ] && return 1 # exactly one argument
	file="$1"
	mount="$(stat -c %m $file)"
	inode="$(stat -c %i $file)"
	dev="$(awk -vmount=$mount 'mount==$2&&/^\//{print$1}' /etc/mtab)"

	debugfs -R "stat <$inode>" "$dev"
}
(natuerlich ungetestet...)

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten