Linux Gazette Prevodi
Nalaženje svih fajlova sa istim i-čvorom
By Steve O'Neil

Slede 2 programa, šel i awk skript, koji nalaze sve fajlove na tvom sistemu, koji imaju isti i-čvor. Zašto ti ovo treba? Evo tri razloga.

Prvo, pri administraciji je korisno znati linkove/veze svih fajlova. Pošto i-čvor u Linuksu nije oslobođen sve dok se poslednji link ne ukloni, korisno je znati koliko fajlova treba da ukloniš da bi stvarno obrisao fajl.

Drugo, u slučaju provale tvog sistema, korisno je znati gde su ti trvdi linkovi. Predpostavimo da neko provali u tvoj sistem i instalira programe za "njuškanje" paketa i otkucaja na tastaturi, ili neki drugi odvratni program. Provalnik će garantovati rad svog programa (čak i da nađeš koji je to program), tako što će kreirati tvrdi link na neko skriveno mesto. Znači iako obrišeš njegov originalni program, on će ga pokrenuti pod alternativnim imenom, pod predpostavkom da ima pristup tvom sistemu. Ali ako naćeš i-čvor originalnog programa, pa koristiš moje skriptove, naći ćeš potrebne linkove. Da, možeš koristiti komandu "find", ali ipak nećeš otkriti sve linkove na sistemu.

Ako si proaktivan što se tiče sigurnosti sistema, onda ćeš koristiti mnoge skenirajuće programe. Ako koristiš ove skriptove kada je tvoj sistem "iskonski", i ako čuvaš listu linkova na sigurnom mestu, onda možeš koristite ove skriptove ponovo recimo svaki dan, i upoređivati rezultate. Bilo koja razlika u direktorijima kao što su /bin, /lib, /etc je znak za uzbunu.

Skriptovi će raditi na bilo kom sistemu uz pomoć bash ili zsh "školjki" i svaka Linuks distribucija ima neku vrstu awk-a. Fajl mehanizam za listanje se zasniva na korišćenju bolje verzije "ls" programa ("els"), koju su pisali Mark Baranowski i James Gleasons. Za razliku od "ls", "els" daje punu kontrolu nad izgledom rezultujuće liste. To je super program i moja je preporuka da se koristi bez obzira da li koristiš moje skriptove ili ne. Jedina mana je da ne pokazuje razne tipove fajlova u raznim bojama, ali u poređenju sa ostalim karakteristikama, to je ništa. Uzmi ge preko ftp-a sa ftp://perseus.elen.utah.edu/pub/markb/els.tar.Z. Sadašnja verzija je 1.44.

(Napomena prevodioca) U vreme kada je ovo prevođeno, sadašnja verzija je 1.5 i može se naći na sajtu http://els-software.org/

Slede skriptovi. Podesi list tvojih direktorijuma u "findhardlinks.sh" i lokaciju awk-a u "showsame.awk" da odgovara tvom sistemu.

Prvo koristi "findhardlinks.sh" sa komandne linije kao root. Fajl "allfiles.lst.srt" će biti napravljen u /temp (ili neki drugi po tvojoj želji). Budi strpljiv, ovo može da potraje ako imaš mnogo fajlova. Kada je gotovo, kopiraj "showsame.awk" u isti direktorijum gde je "allfiles.lst.srt" i uradi sledeće

showsame.awk allfiles.lst.srt

Ovo će napraviti fajl "outfile.txt", koji sadrži spisak istih linkova/veza. Prođi sa "uniq" kroz ovo da eliminišeš duplikate, vidi sledeću komandu

uniq outfile.txt > outfile.nodup

i gotovo je. Fajl "outfile.nodup" je spisak linkova koji ti treba. Da, mogao sam sve ovo staviti u jedan skript/program, ali sam hteo da pokažem kako pojedini koraci rade. Slobodno kombinuj skriptove kako ti srce želi.

I poslednja naznaka: tvrdi linkovi važe samo za fajlove na istom fajl sistemu, tako da kada staviš spisak direktorijuma u šel skript, obrati pažnju da su svi oni deo jednog fajl sistema, kao "/".

findhardlinks.sh
#These directories are all under "/" on my system; you may have to change
#the list to suit your configuration. 

for i in bin boot etc home lib opt root sbin tmp usr var
	do

#This line generates a file listing for all the specified directories and
#their subdirectories, showing each files i-node number, and its complete
#path name, and puts all of it into "allfiles.lst"

	els -a -i +R +NF $i >> /temp/allfiles.lst
	done
cd /temp
sort allfiles.lst > allfiles.lst.srt 
rm allfiles.lst
showsame.awk
#! /usr/bin/awk -f
BEGIN {

	getline  #get the first line of the file, then,
	n1=split($0, test1) #put its fields into an array, then,

#increment the line pointer by one

}
{
#this is the i-node comparison loop

	n2=split($0, test2) #put the next line into an array
	if (test1[1] == test2[1]) { #see if the i-node numbers of the two
				    #lines are the same(field 1 of both
				    #strings)

#if they're the same, print the contents of both arrays

		for (i=1; i <= n1; i++) {
			printf ("%s ", test1[i]) >> "outfile.txt"
					} #note (space) after %s; this puts
					  #back spaces between fields lost
					  #when the strings were split into
					  #the arrays

			printf ("\n") >> "outfile.txt"
		for (i=1; i <= n2; i++)  {
			printf ("%s ", test2[i]) >> "outfile.txt"
				        }
			printf ("\n") >> "outfile.txt"	
				   }

#Now put the most recent string into the array that holds the previous
#string; this allows us to do comparison between each line and the one
#before it.

	for (i=1; i <= n2; i++) { 
		test1[i] = test2[i]
				}
	n1 = n2 #set the count of fields in the array that is holding what
		#is now the previous string to the number of fields in that
		#string

	next	#go get the next string and do it again
}
Copyright © 1999, Steve O'Neill
Published in Issue 44 of Linux Gazette, August 1999

Strana na Engleskom jeziku je ovde
Napomena prevodioca:
Ја sam 100% amater u prevođenju i veoma se dvoumim kada treba da prevedem neke reči karakteristične za oblast računara.
Biće mi drago ako ima onih koji su veštiji u prevođenju i voljni da razvijaju ovaj sajt.