Fayl gareeyaha Linux oo wata tusaalayaal

Mar aan waraysi la yeelanay ayaa la i waydiiyay maxaad samaynaysaa hadii aad hesho adeeg aan shaqaynayn sababtuna ay tahay in saxanka uu gabaabsi yahay?

Dabcan, waxaan ugu jawaabay in aan arki doono waxa meeshan lagu haysto, haddii ay suurtogal tahayna, waan nadiifin doonaa goobta.
Kadibna waraystaha ayaa waydiiyay, ka waran haddii aysan jirin meel banaan oo ku taal qaybta, laakiin sidoo kale ma arkin wax faylal ah oo qaadi doona dhammaan booska?

Tan waxaan ku idhi inaad had iyo jeer eegi karto sharraxayaasha faylka furan, tusaale ahaan amarka lsof, oo aad fahamto codsiga qaatay dhammaan boosaska la heli karo, ka dibna waxaad ku dhaqmi kartaa hadba duruufaha, iyadoo ku xiran haddii xogta loo baahan yahay. .

Waraystuhu wuxuu iga dhex gooyay ereygii ugu dambeeyay, isaga oo ku daray su'aashiisa: "Ka soo qaad inaan u baahnayn xogta, waa kaliya qoraalka debug, laakiin codsigu ma shaqeynayo sababtoo ah ma qori karo debug"?

"Hagaag," waxaan ku jawaabay, "waxaan damin karnaa cilladaha habaynta codsiga oo dib u bilaabi karnaa."
Waraysigii ayaa ka soo horjeestay: "Maya, dib uma bilaabi karno arjiga, wali waxaan haynaa xog muhiim ah oo lagu kaydiyay xusuusta, macaamiisha muhiimka ahna waxay ku xiran yihiin adeegga laftiisa, taas oo aanaan ku qasbi karin inay dib u xirmaan mar kale."

"Hagaag," waxaan idhi, "haddii aynaan dib u bilaabi karin codsiga oo xogtu aanay muhiim noo ahayn, markaa waxaan si fudud u nadiifin karnaa faylkan furan iyada oo loo marayo sharraxaadda faylka, xitaa haddii aynaan ku arkin amarka ls ee nidaamka faylka."

Waraysigii wuu ku farxay, laakiin ma aanan ahayn.

Markaas ayaan is idhi, muxuu qofka imtixaamayaa aqoontayda u sii qotomi waayay? Laakiin maxaa dhacaya haddii xogtu ay muhiim tahay dhammaan ka dib? Maxaa dhacaya haddii aynaan dib u bilaabi karin habka, oo nidaamku u qoro nidaamka faylka qayb aan lahayn meel bannaan? Maxaa dhacaya haddii aynaan lumin karin oo keliya xogta hore loo qoray, laakiin sidoo kale xogta uu habkani qoro ama isku dayo inuu qoro?

Tuzik

Horraantii xirfadayda, waxaan isku dayay inaan abuuro codsi yar oo u baahan inuu kaydiyo macluumaadka isticmaalaha. Kadibna waxaan is idhi, sidee baan ula jaan qaadi karaa isticmaalaha xogtiisa. Tusaale ahaan, waxaan haystaa Ivanov Ivan Ivanovich, oo wuxuu hayaa macluumaad, laakiin sidee baan saaxiib ula yeelan karaa iyaga? Waxaan si toos ah u tilmaami karaa in eyga lagu magacaabo "Tuzik" uu ka tirsan yahay kan Ivan. Laakiin maxaa dhacaya haddii uu beddelo magaciisa iyo halkii uu Ivan noqon lahaa, tusaale ahaan, Olya? Kadibna waxay soo baxaysaa in Olya Ivanovna Ivanova aysan mar dambe yeelan doonin eey, Tuzikkeena ayaa weli ka tirsan doona Ivan aan jirin. Xog ururin siisay isticmaale kasta aqoonsi u gaar ah (ID) ayaa caawiyay xallinta dhibaatadan, Tuzik-kaygana waxa uu ku xidhnaa aqoonsigan, kaas oo, dhab ahaantii, ahaa lambar taxane ah. Sidaa darteed, milkiilaha Ace ayaa lahaa aqoonsiga lambarka 2, iyo wakhti wakhti Ivan ah ayaa ku hoos jiray aqoonsigan, ka dibna Olya wuxuu ku hoos jiray aqoonsi isku mid ah. Dhibaatada bini'aadminimada iyo dhaqashada xoolaha ayaa si dhab ah loo xaliyay.

Sharaxa faylka

Dhibaatada faylka iyo barnaamijka ku shaqeeya faylkan ayaa qiyaastii la mid ah kan eyga iyo ninkayaga. Ka soo qaad in aan furay fayl la yiraahdo ivan.txt oo aan bilaabay in aan ku qoro ereyga tuzik, laakiin kaliya waxa ku guuleystey in aan ku qoro xarafka ugu horreeya ee "t", faylkan waxaa u beddelay qof, tusaale ahaan, olya.txt. Laakiin feylku sidiisii ​​ayuu ahaanayaa, waxaanan weli rabaa in aan ku duubo faylkayga. Mar kasta oo fayl lagu furo nidaamka wicitaanka furan Luuqad kasta oo barnaamij ah waxa aan helaa aqoonsi gaar ah oo i tilmaamaya fayl, aqoonsigani waa sharaxaha faylka. Wax dhib ah malaha wax kasta iyo cidda ku xigta faylkan, waa la tirtiri karaa, waa la bedeli karaa, waa la bedeli karaa milkiilaha, ama xuquuqda akhriska iyo qoraalka waa la qaadi karaa, weli waan heli doonaa. iyada, sababtoo ah wakhtiga furitaanka faylka, waxaan lahaa xuquuqda akhrinta iyo / ama qorista waxaanan ku guuleystey inaan bilaabo la shaqayntiisa, taas oo macnaheedu yahay waa inaan sii wadaa sidaas.

Linux dhexdeeda, maktabadda libca waxay fureysaa 3 fayl oo tilmaame ah codsi kasta oo socda (nidaam), lambarkiisuna yahay 0,1,2. Macluumaad dheeraad ah ayaa laga heli karaa xiriiriyeyaasha nin stdio ΠΈ nin stdout

  • Sharaxa faylka 0 waxaa loo yaqaan STDIN wuxuuna la xiriiraa gelinta codsiga
  • Faylka sharaxa 1 waxaa loo yaqaan STDOUT waxaana isticmaala codsiyada si ay u soo saaraan xogta, sida amarrada daabacaadda
  • Faylka sharaxa 2 waxaa loo yaqaan STDERR oo ay isticmaalaan codsiyada si ay u soo saaraan fariimaha khaldan.

Haddii barnaamijkaaga aad furto fayl kasta oo wax lagu akhriyo ama wax lagu qoro, markaas waxay u badan tahay inaad heli doonto aqoonsiga koowaad ee bilaashka ah wuxuuna noqon doonaa lambarka 3.

Liiska sharraxayaasha faylka waa loo eegi karaa nidaam kasta haddii aad taqaan PID-da.

Tusaale ahaan, aynu furno bash console oo aynu eegno PID-da habkayaga

[user@localhost ]$ echo $$
15771

Console labaad aan orodno

[user@localhost ]$ ls -lah /proc/15771/fd/
total 0
dr-x------ 2 user user  0 Oct  7 15:42 .
dr-xr-xr-x 9 user user  0 Oct  7 15:42 ..
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21

Waxaad si badbaado leh iskaga indhatiri kartaa lambarka tilmaame faylka 255 ujeeddooyinka maqaalkan; waxaa loo furay baahiyihiisa bash laftiisa, ee maaha maktabadda ku xidhan.

Hadda dhammaan 3-dii fayl ee sharraxay waxay ku xidhan yihiin aaladda terminalka been abuurka ah /dev/pts, laakiin wali waan ku maamuli karnaa iyaga, tusaale ahaan, ku socodsii konsole labaad

[user@localhost ]$ echo "hello world" > /proc/15771/fd/0

Oo Console ugu horeysay waxaan arki doonaa

[user@localhost ]$ hello world

Jihaynta iyo Dhuumaha

Waxaad si fudud u tirtiri kartaa 3-daan faylal ee sharraxaya hab kasta, oo ay ku jiraan bash, tusaale ahaan iyada oo loo marayo tuubo isku xidha laba habraac, eeg

[user@localhost ]$ cat /dev/zero | sleep 10000

Adiga ayaa amarkan ku maamuli kara dhuuban -f oo arag waxa gudaha ka socda, laakiin si kooban ayaan kuu sheegi doonaa.

Nidaamka bash-bash ee waalidka ee PID 15771 wuxuu qeexayaa amarkeena oo si sax ah u fahmaya inta amar ee aan rabno inaan ku socono, xaaladdeena waxaa jira laba ka mid ah: bisad iyo hurdo. Bash waa ogyahay in ay u baahan tahay in la abuuro laba hab oo ilmo ah, oo lagu daro hal tuubo. Wadar ahaan, bashku wuxuu u baahan doonaa 2 habraac ilmo iyo hal tubo.

Bash waxa uu wadaa wicitaan nidaam ka hor inta aanu abuurin hababka ilmaha biibiile oo ku helaya sharraxayaal cusub oo ku-meel-gaadhka ah ee tuubada ku-meel-gaadhka ah, laakiin kaydintan weli iskuma xidhin labadayada habraac ee canug.

Habka waalidku, waxa ay u eegtahay in ay jirto tubo, laakiin wali ma jiraan habab caruureed:

PID    command
15771  bash
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21

Kadibna isticmaal nidaamka wicitaanka Gadzhiyev bash waxa ay abuurtaa laba hab oo ilmaha ah, saddexdayada hab-socodkana waxa ay u eegi doonaan sidan:

PID    command
15771  bash
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21
PID    command
9004  bash
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 255 -> /dev/pts/21
PID    command
9005  bash
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 255 -> /dev/pts/21

Ha iloobin in clone ay xirto nidaamka oo ay la socdaan dhammaan sharraxayaasha faylka, si ay isku mid u noqdaan habka waalidka iyo kuwa ilmaha. Shaqada nidaamka waalidka ee PID 15771 waa in lala socdo hababka ilmaha, si ay si fudud u sugto jawaabta carruurta.

Sidaa darteed, uma baahna tuubo, waxayna xirtaa sharraxayaasha faylka ee lambarrada 3 iyo 4.

Habka bash-bashka ilmaha ee ugu horreeya ee leh PID 9004, nidaamka ayaa wacaya dup2, u beddela STDOUT faylka tilmaanta lambarka 1 una beddelo sharraxaha faylka tilmaamaya tuubada, xaaladdeenna waa lambarka 3. Sidaa darteed, wax kasta oo ubadka ugu horreeya ee PID 9004 u qoro STDOUT waxay si toos ah ugu dhammaanayaan tuubada tuubada.

Habka ilmaha labaad ee PID 9005, bash wuxuu isticmaalaa dup2 si uu u beddelo sharraxaadda faylka STDIN lambarka 0. Hadda wax kasta oo bashkeena labaad ee PID 9005 akhrin doono waxaa laga akhrin doonaa tuubada.

Taas ka dib, sharraxayaasha faylka ee nambarada 3 iyo 4 ayaa sidoo kale la xiray habka ilmaha, maadaama aan la isticmaalin.

Waxaan si ula kac ah u iska indho-tiray sharraxaadda faylka 255; waxaa loo istcimaalayaa ujeeddooyin gudaha bash laftiisa oo sidoo kale waa la xidhi doonaa hababka carruurta.

Marka xigta, habka ilmaha ugu horreeya ee PID 9004, bash wuxuu bilaabaa isticmaalka nidaamka wicitaanka Exec faylka la fulin karo ee aan ku qeexnay khadka taliska, kiiskeena waa /usr/bin/cat.

Habka ilmaha labaad ee PID 9005, bash wuxuu wadaa fulinta labaad ee aan qeexnay, xaaladdeena /usr/bin/sleep.

Wicitaanka nidaamka exec ma xidho gacan-ku-haynta faylka ilaa lagu furay calanka O_CLOEXEC wakhtiga wicitaanka furan la sameeyay. Xaaladeena, ka dib marka la bilaabo faylasha la fulin karo, dhammaan sharraxayaasha faylka hadda waa la keydin doonaa.

Hubi console-ka:

[user@localhost ]$ pgrep -P 15771
9004
9005
[user@localhost ]$ ls -lah /proc/15771/fd/
total 0
dr-x------ 2 user user  0 Oct  7 15:42 .
dr-xr-xr-x 9 user user  0 Oct  7 15:42 ..
lrwx------ 1 user user 64 Oct  7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:42 255 -> /dev/pts/21
[user@localhost ]$ ls -lah /proc/9004/fd
total 0
dr-x------ 2 user user  0 Oct  7 15:57 .
dr-xr-xr-x 9 user user  0 Oct  7 15:57 ..
lrwx------ 1 user user 64 Oct  7 15:57 0 -> /dev/pts/21
l-wx------ 1 user user 64 Oct  7 15:57 1 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
lr-x------ 1 user user 64 Oct  7 15:57 3 -> /dev/zero
[user@localhost ]$ ls -lah /proc/9005/fd
total 0
dr-x------ 2 user user  0 Oct  7 15:57 .
dr-xr-xr-x 9 user user  0 Oct  7 15:57 ..
lr-x------ 1 user user 64 Oct  7 15:57 0 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct  7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct  7 15:57 2 -> /dev/pts/21
[user@localhost ]$ ps -up 9004
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user  9004  0.0  0.0 107972   620 pts/21   S+   15:57   0:00 cat /dev/zero
[user@localhost ]$ ps -up 9005
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user  9005  0.0  0.0 107952   360 pts/21   S+   15:57   0:00 sleep 10000

Sida aad arki karto, tirada gaarka ah ee tuubadayadu waa isku mid labada habraac. Markaa waxaanu xidhiidh ka dhexeeya laba hab oo kala duwan oo isku waalid ah.

Kuwa aan aqoon u lahayn nidaamka wicitaanada ee bash isticmaalo, waxaan aad ugu talinayaa in lagu socodsiiyo amarada iyada oo loo marayo strace oo ay arkaan waxa gudaha ka dhacaya, tusaale ahaan sidan oo kale:

strace -s 1024 -f bash -c "ls | grep hello"

Aan dib ugu laabano dhibka naga haysta booska diskooga oo gabaabsi ah oo aan isku dayno inaan keydino xogta anagoon dib u bilaabin howsha. Aynu qorno barnaamij yar oo ku qori doona qiyaastii 1 megabyte ilbiriqsikiiba diskka. Waxaa intaa dheer, haddii sabab qaar ka mid ah aynaan awoodin in aan u qorno xogta diskka, si fudud ayaanu iska indhatirin doonaa tan oo aan isku dayno inaan mar kale ku qorno xogta hal ilbiriqsi. Tusaalaha aan isticmaalaya Python, waxaad isticmaali kartaa luuqad kasta oo kale oo barnaamijka ah.

[user@localhost ]$ cat openforwrite.py 
import datetime
import time

mystr="a"*1024*1024+"n"
with open("123.txt", "w") as f:
    while True:
        try:
            f.write(str(datetime.datetime.now()))
            f.write(mystr)
            f.flush()
            time.sleep(1)
        except:
            pass

Aan socodsiino barnaamijka oo aan eegno sharraxayaasha faylka

[user@localhost ]$ python openforwrite.py &
[1] 3762
[user@localhost ]$ ps axuf | grep [o]penforwrite
user  3762  0.0  0.0 128600  5744 pts/22   S+   16:28   0:00  |   _ python openforwrite.py
[user@localhost ]$ ls -la /proc/3762/fd
total 0
dr-x------ 2 user user  0 Oct  7 16:29 .
dr-xr-xr-x 9 user user  0 Oct  7 16:29 ..
lrwx------ 1 user user 64 Oct  7 16:29 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  7 16:29 3 -> /home/user/123.txt

Sida aad arki karto, waxaanu haynaa 3-da nooc ee fayl-gale ee qeexitaannada iyo mid kale oo aanu furnay. Aan hubino xajmiga faylka:

[user@localhost ]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 117M Oct  7 16:30 123.txt

Xogta waa la qorayaa, waxaan isku dayeynaa inaan bedelno ogolaanshaha faylka:

[user@localhost ]$ sudo chown root: 123.txt
[user@localhost ]$ ls -lah 123.txt 
-rw-rw-r-- 1 root root 168M Oct  7 16:31 123.txt
[user@localhost ]$ ls -lah 123.txt 
-rw-rw-r-- 1 root root 172M Oct  7 16:31 123.txt

Waxaan aragnaa in xogta weli la qorayo, in kasta oo isticmaaleheennu aanu haysan oggolaansho uu ku qoro faylka. Aan isku dayno inaan ka saarno:

[user@localhost ]$ sudo rm 123.txt 
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory

Xaggee xogta ku qoran tahay? Oo gabi ahaanba miyay qoran yihiin? Waxaan hubineynaa:

[user@localhost ]$ ls -la /proc/3762/fd
total 0
dr-x------ 2 user user  0 Oct  7 16:29 .
dr-xr-xr-x 9 user user  0 Oct  7 16:29 ..
lrwx------ 1 user user 64 Oct  7 16:29 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  7 16:29 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  7 16:29 3 -> /home/user/123.txt (deleted)

Haa, sharaxaha faylkayagu wali wuu jiraa oo waxaanu ula dhaqmi karnaa sharaxaha faylka sidii faylkeenii hore, waanu akhrin karnaa, nadiifin karnaa oo koobi karnaa

Aynu eegno xajmiga faylka:

[user@localhost ]$ lsof | grep 123.txt
python    31083             user    3w      REG                8,5   19923457   2621522 /home/user/123.txt

Cabbirku waa 19923457. Aan isku dayno inaan tirtirno faylka:

[user@localhost ]$ truncate -s 0 /proc/31083/fd/3
[user@localhost ]$ lsof | grep 123.txt
python    31083             user    3w      REG                8,5  136318390   2621522 /home/user/123.txt

Sida aad arki karto, cabbirka feylku waa sii kordhayaa oo jirkeena ma shaqayn. Aynu eegno dukumentiyada wicitaanka nidaamka furan. Haddii aan isticmaalno calanka O_APPEND marka aan furayno faylka, ka dib qoraal kasta, nidaamka hawlgalka waxa uu eegayaa cabbirka faylka oo u qoraa xogta illaa dhammaadka faylka, oo tan si attomical ah ayuu u sameeyaa. Tani waxay u oggolaaneysaa dhowr qaybood ama habab inay wax u qoraan isla fayl isku mid ah. Laakiin xeerkayaga ma isticmaalno calankan. Waxaan ku arki karnaa cabbir ka duwan faylka lsof ka dib jirridda kaliya haddii aan furno faylka qoraal dheeri ah, taas oo macnaheedu yahay koodkayaga.

with open("123.txt", "w") as f:

waa inaan dhignaa

with open("123.txt", "a") as f:

Ku hubinta calanka "w".

[user@localhost ]$ strace -e trace=open python openforwrite.py 2>&1| grep 123.txt
open("123.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3

oo leh calanka "a".

[user@localhost ]$ strace -e trace=open python openforwrite.py 2>&1| grep 123.txt
open("123.txt", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3

Barnaamijaynta hannaan hore u socday

Inta badan barnaamijyada, marka ay abuurayaan oo ay tijaabinayaan barnaamijyada, waxay isticmaalaan debuggers (tusaale GDB) ama heerarka kala duwan ee gelitaanka codsiga. Linux waxa ay siisaa awood ay ku qorto oo ay u beddesho barnaamij horeba u socday, tusaale ahaan, bedelida qiyamka doorsoomayaasha, dejiso meel goyn, iwm, iwm.

Ku soo noqoshada su'aasha asalka ah ee ku saabsan boos disk ku filan oo lagu qoro fayl, aan isku dayno inaan ka dhigno dhibaatada.

Aan u abuurno fayl qaybtayada, kaas oo aan ku dhejin doono disk gaar ah:

[user@localhost ~]$ dd if=/dev/zero of=~/tempfile_for_article.dd bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00525929 s, 2.0 GB/s
[user@localhost ~]$

Aan abuurno nidaam faylal:

[user@localhost ~]$ mkfs.ext4 ~/tempfile_for_article.dd
mke2fs 1.42.9 (28-Dec-2013)
/home/user/tempfile_for_article.dd is not a block special device.
Proceed anyway? (y,n) y
...
Writing superblocks and filesystem accounting information: done
[user@localhost ~]$

Ku dheji nidaamka faylka:

[user@localhost ~]$ sudo mount ~/tempfile_for_article.dd /mnt/
[sudo] password for user: 
[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  172K  7.9M   3% /mnt

Waxaan la abuurnay hagaha mulkiilahayaga:

[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs

Aan furno faylka si loogu qoro kaliya barnaamijkayaga:

with open("/mnt/logs/123.txt", "w") as f:

Daahfurka

[user@localhost ]$ python openforwrite.py 

Waxaan sugeynaa dhowr ilbiriqsi

[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  8.0M     0 100% /mnt

Markaa, waxaynu haynaa dhibaatada lagu tilmaamay bilawga maqaalkan. Meel banaan 0, 100% waa la qabsaday.

Waxaan xasuusannahay in marka loo eego shuruudaha shaqada, waxaan isku dayeynaa inaan duubno xog aad muhiim u ah oo aan la lumin karin. Isla mar ahaantaana, waxaan u baahanahay inaan hagaajino adeegga iyada oo aan dib loo bilaabin habka.

Aynu nidhaahno waxaan weli haysanaa boos disk, laakiin qayb ka duwan, tusaale ahaan / guriga.

Aan isku dayno inaan "dib-u-bardhig ku samayno" koodkayaga.

Aynu eegno PID-da habkayaga, kaas oo cunay dhammaan meelihii saxanka:

[user@localhost ~]$ ps axuf | grep [o]penfor
user 10078 27.2  0.0 128600  5744 pts/22   R+   11:06   0:02  |   _ python openforwrite.py

Ku xidh habka gdb

[user@localhost ~]$ gdb -p 10078
...
(gdb) 

Aynu eegno sharraxayaasha faylka furan:

(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /mnt/logs/123.txt

Waxaan eegnaa macluumaadka ku saabsan faylka sharraxaaha lambarka 3, kaas oo na daneynaya

(gdb) shell cat /proc/10078/fdinfo/3
pos:    8189952
flags:  0100001
mnt_id: 482

Anigoo maskaxda ku hayna waxa nidaamka loo yaqaan Python sameeyo (eeg xagga sare halka aan ku orodnay oo aan helnay wicitaanka furan), marka la shaqeynayo koodkayaga si aan u furno faylka, annagu sidaas oo kale ayaan sameynaa annagoo ka wakiil ah hannaankayaga, laakiin waxaan u baahanahay O_WRONLY|O_CREAT| Qaybaha O_TRUNC waxay ku beddelaan qiime tiro Si tan loo sameeyo, fur ilaha kernel-ka, tusaale ahaan halkan oo bal eega calamada ka masuulka ah waxa

#Qeex O_QALDOON 00000001
# qeex O_CREAT 00000100
# qeex O_TRUNC 00001000

Waxaan isku darnaa dhammaan qiyamka hal, waxaan helnaa 00001101

Wicitaankeena waxaan ka wadnaa gdb

(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4

Markaa waxaanu helnay sharraxa faylka cusub oo leh lambarka 4 iyo fayl cusub oo furan oo qayb kale ah, waxaanu hubinay:

(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /mnt/logs/123.txt
l-wx------ 1 user user 64 Oct  8 11:15 4 -> /home/user/123.txt

Waxaan ku xasuusanaa tusaalaha tuubada - sida bash u beddelo sharraxayaasha faylka, waxaanan horay u baranay nidaamka dup2 call.

Waxaan isku dayeynaa in aan hal fayl ku bedelno mid kale

(gdb) call dup2(4,3)
$2 = 3

Hubinta:

(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user  0 Oct  8 11:06 .
dr-xr-xr-x 9 user user  0 Oct  8 11:06 ..
lrwx------ 1 user user 64 Oct  8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:09 3 -> /home/user/123.txt
l-wx------ 1 user user 64 Oct  8 11:15 4 -> /home/user/123.txt

Waxaan xireynaa sharraxaaha faylka 4, maadaama aanan u baahnayn:

(gdb) call close (4)
$1 = 0

Oo ka bax gdb

(gdb) quit
A debugging session is active.

    Inferior 1 [process 10078] will be detached.

Quit anyway? (y or n) y
Detaching from program: /usr/bin/python2.7, process 10078

Hubinta faylka cusub:

[user@localhost ~]$ ls -lah /home/user/123.txt
-rw-rw-r-- 1 user user 5.1M Oct  8 11:18 /home/user/123.txt
[user@localhost ~]$ ls -lah /home/user/123.txt
-rw-rw-r-- 1 user user 7.1M Oct  8 11:18 /home/user/123.txt

Sida aad arki karto, xogta waxaa lagu qoraa fayl cusub, aan hubinno kii hore:

[user@localhost ~]$ ls -lah /mnt/logs/123.txt 
-rw-rw-r-- 1 user user 7.9M Oct  8 11:08 /mnt/logs/123.txt

Wax xog ah oo lumay ma jirto, codsigu wuu shaqeeyaa, diiwaannada ayaa lagu qoraa meel cusub.

Aynu hawsha yara adkayno

Aynu qiyaasno in xogtu ay muhiim noo tahay, laakiin ma haysanno meel disk ah mid ka mid ah qaybaha oo ma isku xiri karno diskka.

Waxa aan samayn karno ayaa ah in aan xogtayada meel ku hagano, tusaale ahaan in aan tuubooyin u gudbino, oo markeedana xogta laga soo wareejiyo beebka una gudubto shabakadda iyada oo loo marayo barnaamijka qaarkood, tusaale ahaan netcat.
Waxaan samayn karnaa tuubo magac leh oo leh amarka mkfifo. Waxay ku abuuri doontaa faylka been abuurka ah ee nidaamka faylka xitaa haddii aysan jirin meel bannaan oo ku taal.

Dib u bilow codsiga oo hubi:

[user@localhost ]$ python openforwrite.py 
[user@localhost ~]$ ps axuf | grep [o]pen
user  5946 72.9  0.0 128600  5744 pts/22   R+   11:27   0:20  |   _ python openforwrite.py
[user@localhost ~]$ ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123.txt
[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  8.0M     0 100% /mnt

Ma jiro meel saxan ah, laakiin waxaan si guul leh ugu abuurnay tuubo magaceedu halkaas:

[user@localhost ~]$ mkfifo /mnt/logs/megapipe
[user@localhost ~]$ ls -lah /mnt/logs/megapipe 
prw-rw-r-- 1 user user 0 Oct  8 11:28 /mnt/logs/megapipe

Hadda waxaan u baahanahay inaan si uun u duubno dhammaan xogta ku socota tuubadan oo loo diro server kale iyada oo loo marayo shabakadda; isla netcat ayaa ku habboon tan.

Serverka remote-server.example.com ayaanu ku bilownay

[user@localhost ~]$ nc -l 7777 > 123.txt 

Seerfarkeena dhibaatada leh waxaan ku furaynaa terminal gooni ah

[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe 

Hadda dhammaan xogta ku dhammaata tuubada waxay si toos ah u tagi doontaa stdin ee netcat, taas oo u diri doonta shabakadda dekedda 7777.

Waxa kaliya ee ay tahay inaan sameyno waa inaan bilowno inaan xogtayada ku qorno tuubadaan magacaaban.

Waxaan horey u haynay codsigu:

[user@localhost ~]$ ps axuf | grep [o]pen
user  5946 99.8  0.0 128600  5744 pts/22   R+   11:27 169:27  |   _ python openforwrite.py
[user@localhost ~]$ ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123.txt

Dhammaan calamada, waxaan kaliya uga baahanahay O_WRONLY maadaama feylku uu hore u jiray umana baahnin inaanu nadiifinno

[user@localhost ~]$ gdb -p 5946
...
(gdb) call open("/mnt/logs/megapipe", 00000001,0666)
$1 = 4
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/123.txt
l-wx------ 1 user user 64 Oct  8 14:20 4 -> /mnt/logs/megapipe
(gdb) call dup2(4,3)
$2 = 3
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/megapipe
l-wx------ 1 user user 64 Oct  8 14:20 4 -> /mnt/logs/megapipe
(gdb) call close(4)
$3 = 0
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user  0 Oct  8 11:27 .
dr-xr-xr-x 9 user user  0 Oct  8 11:27 ..
lrwx------ 1 user user 64 Oct  8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct  8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct  8 11:28 3 -> /mnt/logs/megapipe
(gdb) quit
A debugging session is active.

    Inferior 1 [process 5946] will be detached.

Quit anyway? (y or n) y
Detaching from program: /usr/bin/python2.7, process 5946

Hubinta fog ee server-ka remote-server.example.com

[user@localhost ~]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 38M Oct  8 14:21 123.txt

Xogtu waa soo socotaa, waxaan hubineynaa server-ka dhibaatada

[user@localhost ~]$ ls -lah /mnt/logs/
total 7.9M
drwxr-xr-x 2 user user 1.0K Oct  8 11:28 .
drwxr-xr-x 4 root     root     1.0K Oct  8 10:55 ..
-rw-rw-r-- 1 user user 7.9M Oct  8 14:17 123.txt
prw-rw-r-- 1 user user    0 Oct  8 14:22 megapipe

Xogta waa la keydiyay, dhibaatada waa la xaliyay.

Waxaan fursadan uga faa’iidaysanayaa in aan salaan ku idhaahdo asxaabtayda Degiro.
Dhageyso muuqaalada Radio-T

Wanaag oo dhan.

Shaqa-guri ahaan, waxaan kuu soo jeedinayaa inaad ka fikirto waxa ku jiri doona nidaamka faylka sharraxaadaha bisad iyo hurdo haddii aad maamusho amarkan soo socda:

[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000

Source: www.habr.com

Add a comment