Faʻamatalaga faila i Linux ma faʻataʻitaʻiga

I se tasi taimi, i le taimi o se faatalanoaga, na fesiligia ai aʻu, o le a se mea e te faia pe a e mauaina se auaunaga e le o galue ona o le mea moni o le disk ua leai se avanoa?

Ioe, sa ou tali atu o le a ou vaai po o le a le mea o nofoia e lenei nofoaga ma, afai e mafai, o le a ou faamamaina le nofoaga.
Ona fesili lea o le tagata fai faatalanoaga, e faapefea pe a leai se avanoa avanoa i luga o le vaeluaga, ae e te le o vaaia foi ni faila e alu uma ai le avanoa?

I lenei mea na ou fai atu e mafai ona e vaʻavaʻai i faila faila tatala, mo se faʻataʻitaʻiga ma le lsof command, ma malamalama po o le a le talosaga na faʻaaogaina avanoa avanoa uma, ona mafai lea ona e galue e tusa ai ma tulaga, faʻatatau i le manaʻomia o faʻamatalaga. .

Na faʻalavelaveina aʻu e le tagata faʻatalanoaina i le upu mulimuli, faʻaopoopo i lana fesili: "Faʻapea tatou te le manaʻomia le faʻamaumauga, ua naʻo se faʻailoga faʻapipiʻi, ae e le aoga le talosaga ona e le mafai ona tusia se debug"?

“Ua lelei,” sa ou tali atu ai, “e mafai ona matou tapeina le debug i le seti o talosaga ma toe amata.”
Na tetee le tagata fai faatalanoaga: "Leai, e le mafai ona matou toe amataina le talosaga, o loʻo i ai pea a matou faʻamaumauga taua o loʻo teuina i le manatua, ma o tagata taua e fesoʻotaʻi i le auaunaga lava ia, lea e le mafai ona matou toe faʻamalosia e toe faʻafesoʻotaʻi."

"Ua lelei," na ou fai atu ai, "afai e le mafai ona toe amataina le talosaga ma e le taua ia i matou faʻamatalaga, ona mafai lea ona matou faʻamamaina lenei faila tatala e ala i le faila faila, e tusa lava pe matou te le vaʻaia i le ls command i luga o le faila faila."

Sa fiafia le tagata fai faatalanoaga, ae sa ou le fiafia.

Ona ou mafaufau lea, aisea e le suʻesuʻe ai e le tagata loʻu malamalama loloto? Ae faʻafefea pe afai e taua le faʻamatalaga pe a uma? Ae fa'afefea pe a le mafai ona toe amataina se faagasologa, ma tusi le faagasologa i le faila faila i luga o se vaeluaga e leai se avanoa avanoa? Ae faʻapefea pe afai e le mafai ona tatou leiloa e le gata o faʻamaumauga ua uma ona tusia, ae faʻapea foʻi ma faʻamaumauga o loʻo tusia e lenei faagasologa pe taumafai e tusi?

Tuzik

I le amataga o laʻu galuega, sa ou taumafai e fai se tamaʻi talosaga e manaʻomia e teu ai faʻamatalaga faʻaoga. Ona ou mafaufau lea, faʻafefea ona ou faʻafetaui le tagata faʻaoga i ana faʻamatalaga. Mo se faʻataʻitaʻiga, o loʻo ia te aʻu Ivanov Ivan Ivanovich, ma e iai ni ana faʻamatalaga, ae faʻapefea ona ou faauo ia i latou? E mafai ona ou faʻasino saʻo atu o le taifau e igoa ia "Tuzik" e patino i lenei lava Ivan. Ae faapefea pe afai na te suia lona igoa ae nai lo Ivan e avea, mo se faataitaiga, Olya? Ona oo mai lea o le a le toe i ai se taifau a le matou Olya Ivanovna Ivanova, ma o le a avea pea le matou Tuzik ma le Ivan e le o iai. O se faʻamaumauga na tuʻuina atu i tagata taʻitoʻatasi se faʻamatalaga tulaga ese (ID) na fesoasoani e foia lenei faʻafitauli, ma o laʻu Tuzik na nonoa i lenei ID, lea, o le mea moni, na o se numera telefoni. O le mea lea, o le tagata e ona le tuzik sa i ai le ID numera 2, ma i se taimi i le taimi na i ai Ivan i lalo o lenei ID, ona avea ai lea o Olya i lalo o lenei ID tutusa. O le faʻafitauli o tagata soifua ma faʻatoaga manu na mafai ona foia.

Fa'amatalaga faila

O le faʻafitauli o le faila ma le polokalame o loʻo galue i lenei faila e foliga tutusa ma le matou taifau ma le tagata. Faapea na ou tatalaina se faila e taʻua o ivan.txt ma amata ona tusia le upu tuzik i totonu, ae na o le mafai ona tusia le mataitusi muamua "t" i le faila, ma o lenei faila na toe faaigoa e se tasi, mo se faataitaiga, i le olya.txt. Ae o loʻo tumau pea le faila, ma ou te manaʻo e faʻamaumau laʻu ace i totonu. Soo se taimi lava e tatalaina ai se faila i se telefoni feaveaʻi tatala i soʻo se gagana faʻapolokalame ou te maua se ID tulaga ese e faasino aʻu i se faila, o lenei ID o le faila faila. Ma e le afaina lava po o le a ma o ai e faia i le faila lea e sosoo ai, e mafai ona tape, e mafai ona toe faʻaigoaina, e mafai ona suia lē e ona, pe aveesea le aia tatau e faitau ma tusitusi ai, o le a ou maua pea le avanoa. i ai, aua i le taimi o le tatalaina o le faila, sa ia te aʻu le aia tatau e faitau ma / pe tusi ai ma na mafai ona ou amata galue i ai, o lona uiga e tatau ona ou faʻaauau pea.

I Linux, e tatalaina e le faletusi libc 3 faʻamatalaga faila mo taʻaloga taʻitasi (faʻagasologa), faʻanumera 0,1,2. E mafai ona maua nisi fa'amatalaga i luga ole so'oga tagata stdio и tagata stdout

  • Fa'amatalaga faila 0 ua ta'ua o le STDIN ma e feso'ota'i ma fa'aoga talosaga
  • Fa'amatalaga faila 1 ua ta'ua o le STDOUT ma e fa'aogaina e tusi talosaga e fa'ailoa ai fa'amaumauga, e pei o le lolomi tulafono
  • Fa'amatalaga faila 2 ua ta'ua o le STDERR ma e fa'aaogaina e tusi talosaga e fa'aulu ai fe'au sese.

Afai i lau polokalama e te tatalaina se faila mo le faitau poʻo le tusitusi, e foliga mai o le ae mauaina le ID muamua e leai se totogi ma o le numera 3.

O le lisi o faila faila e mafai ona vaʻaia mo soʻo se faagasologa pe afai e te iloa lona PID.

Mo se faʻataʻitaʻiga, seʻi o tatou tatalaina le bash console ma vaʻai i le PID o la tatou gaioiga

[user@localhost ]$ echo $$
15771

I le faamafanafana lona lua tatou tamoe

[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

E mafai ona e le amanaiaina ma le saogalemu le faila faila numera 255 mo faamoemoega o lenei tusiga; na tatalaina mo ona manaoga e ala i le bash lava ia, ae le o le faletusi fesoʻotaʻi.

O le taimi nei o faila faʻamatalaga uma e 3 e fesoʻotaʻi ma le masini faʻailoga pseudo /dev/pts, ae e mafai lava ona tatou faʻaogaina i latou, mo se faʻataʻitaʻiga, taʻavale i latou i se faʻamafanafanaga lona lua

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

Ma i le faʻamafanafanaga muamua o le a tatou vaʻaia

[user@localhost ]$ hello world

Toe fa'atonu ma Pipe

E faigofie ona e fa'amalo nei 3 fa'amatalaga faila i so'o se faiga, e aofia ai i le bash, mo se fa'ata'ita'iga e ala i se paipa e fa'afeso'ota'i faiga e lua, va'ai

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

E mafai ona e faia lenei poloaiga oe lava ia fa'ailoga -f ma vaʻai poʻo le a le mea o loʻo tupu i totonu, ae o le a ou taʻu atu ia te oe puupuu.

O a matou matua faʻasolosolo faʻatasi ma le PID 15771 faʻasalalau la matou poloaiga ma malamalama lelei i le tele o poloaiga matou te mananaʻo e tamoʻe, i la matou tulaga e lua o latou: pusi ma moe. Ua iloa e Bash e mana'omia ona faia ni faiga a tamaiti se lua, ma tu'u fa'atasi i le paipa e tasi. I le aofaʻi, o le a manaʻomia e le bash 2 tamaiti faiga ma le paipa e tasi.

Bash e fa'atautaia se telefoni a'o le'i faia faiga a tamaiti paipa ma maua fa'amatalaga faila fou i le paipa le tumau, ae le'i fa'afeso'ota'i e lenei pa'u faiga a le ma fanau e lua.

Mo le faagasologa o matua, e foliga mai ua uma ona i ai se paipa, ae e leʻi iai ni faiga a tamaiti:

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

Ona faʻaaogaina lea o le system call ufiufi bash e faia ni gaioiga se lua a tamaiti, ma o a tatou faiga e tolu o le a pei o lenei:

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

Aua neʻi galo o loʻo faʻapipiʻi e clone le faagasologa faatasi ai ma faila faila uma, ina ia tutusa i le faagasologa o matua ma le tamaititi. O le galuega a le matua i le PID 15771 o le mataʻituina lea o gaioiga a tamaiti, o lea e faʻatali mo se tali mai tamaiti.

O le mea lea, e le manaʻomia le paipa, ma e tapunia faʻamatalaga faila faanumera 3 ma le 4.

I le faiga muamua o tamaiti bash ma le PID 9004, o le telefoni feaveaʻi dup2, suia la matou faila faila STDOUT numera 1 i se faila faila e faasino i le paipa, i la matou tulaga o le numera 3. O le mea lea, o mea uma lava e tusia e le tamaititi muamua ma le PID 9004 i le STDOUT o le a otometi lava ona iu i le paipa paipa.

I le faagasologa o le tamaititi lona lua ma le PID 9005, e faʻaaoga e le bash le dup2 e sui ai le faila faila STDIN numera 0. O le taimi nei o mea uma o le a faitauina e le matou bash lona lua ma le PID 9005 mai le paipa.

A maeʻa lenei, faila faʻamatalaga faʻanumera 3 ma 4 ua tapunia foi i faiga a tamaiti, talu ai e le o toe faʻaaogaina.

Ou te le amanaiaina ma le loto i ai le faila faila 255; e faʻaaogaina mo faamoemoega i totonu e ala i le bash lava ia ma o le a tapunia foi i faiga a tamaiti.

I le isi, i le faʻagasologa muamua o tamaiti ma le PID 9004, o le bash e amata faʻaaogaina se telefoni exec le faila faila na matou faʻamaonia i luga o le laina o le poloaiga, i la matou tulaga o le /usr/bin/cat.

I le faʻasologa lona lua o tamaiti ma le PID 9005, e faʻatautaia e le bash le faʻaaogaina lona lua na matou faʻamaonia, i la matou tulaga /usr/bin/sleep.

O le exec system call e le tapunia faila faila se'i vagana ua tatalaina i le fu'a O_CLOEXEC i le taimi na tatala ai le valaau. I la matou tulaga, pe a uma ona faʻalauiloa faila faila, o faila faila uma o loʻo iai nei o le a faʻasaoina.

Siaki i totonu o le fa'amafanafanaga:

[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

E pei ona e vaʻai, o le numera tulaga ese o le matou paipa e tutusa i faiga uma e lua. O lea ua i ai se tatou sootaga i le va o faiga eseese e lua ma le matua e tasi.

Mo i latou e le masani i le faiga o loʻo faʻaaogaina e le bash, ou te fautuaina tele le faʻatinoina o poloaiga e ala i le vaʻaia ma vaʻai i mea o loʻo tupu i totonu, mo se faʻataʻitaʻiga pei o lenei:

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

Sei o tatou toe foʻi i la tatou faʻafitauli i le maualalo o le disk space ma taumafai e teu faʻamaumauga e aunoa ma le toe amataina o le faagasologa. Se'i o tatou tusia se polokalame la'ititi e tusi pe tusa ma le 1 megabyte ile sekone ile tisiki. E le gata i lea, afai mo nisi mafuaaga na le mafai ai ona matou tusia faʻamatalaga i le disk, matou te le amanaiaina lenei mea ma taumafai e toe tusi faʻamaumauga i le lua. I le faʻataʻitaʻiga o loʻo ou faʻaogaina le Python, e mafai ona e faʻaogaina soʻo se isi gagana polokalame.

[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

Tatou fa'agasolo le polokalame ma va'ai i fa'amatalaga faila

[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

E pei ona e vaʻaia, o loʻo i ai a matou faʻamatalaga faila faila 3 ma le isi na matou tatalaina. Sei o tatou siaki le tele o faila:

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

O loʻo tusia faʻamaumauga, matou te taumafai e sui faʻatagaga i luga o le faila:

[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

Matou te vaʻai o loʻo tusia pea faʻamaumauga, e ui lava e leai se faʻatagaga a le matou tagata faʻaoga e tusi ai i le faila. Tatou taumafai e aveese:

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

O fea o lo'o tusia ai fa'amaumauga? Ma pe ua tusia uma? Matou te siaki:

[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)

Ioe, o loʻo i ai pea la matou faʻamatalaga faila ma e mafai ona matou faʻaogaina le faila faila e pei o la matou faila tuai, e mafai ona matou faitau, faʻamama ma kopi.

Se'i tatou va'ai i le tele o le faila:

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

Ole tele ole faila ole 19923457. Tatou taumafai e fa'amama le faila:

[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

E pei ona e vaʻaia, o le faila faila ua faʻateleina ma e leʻi galue le matou ogalaau. Se'i o tatou va'ai ile fa'amaumauga ole system call tatala. Afai tatou te faʻaogaina le fuʻa O_APPEND pe a tatalaina se faila, ona faʻatasi ai lea ma tusi taʻitasi, e siaki e le faiga faʻaogaina le tele o faila ma tusi faʻamatalaga i le pito o le faila, ma faia lenei mea faʻatometi. E mafai ai e le tele o filo po'o faiga e tusi ai i le faila e tasi. Ae i la matou code matou te le faʻaaogaina lenei fuʻa. E mafai ona tatou vaʻaia se isi faila faila ile lsof pe a uma le ogalaau pe a tatou tatalaina le faila mo tusitusiga faaopoopo, o lona uiga i la tatou code nai lo.

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

e tatau ona tatou tuu

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

Siaki i le fu'a "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

ma le fu'a "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

Fa'apolokalameina se fa'agasologa o lo'o fa'agasolo

E masani lava o le au fai polokalame, pe a fatuina ma suʻeina polokalame, faʻaaoga debuggers (mo se faʻataʻitaʻiga GDB) poʻo tulaga eseese o le faʻapipiʻiina o le talosaga. Linux e maua ai le tomai e tusi moni ai ma suia se polokalame ua uma ona taʻavale, mo se faʻataʻitaʻiga, suia le tau o fesuiaiga, seti se vaeluaga, ma isi, ma isi.

Toe fo'i i le fesili muamua e uiga i le le lava o le disk space e tusi ai se faila, tatou taumafai e fa'atusa le fa'afitauli.

Sei o tatou fatuina se faila mo la tatou vaeluaga, lea o le a tatou faʻapipiʻiina o se tisiki ese:

[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 ~]$

Sei o tatou faia se faiga faila:

[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 ~]$

Fa'amau le faiga faila:

[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

Matou te fatuina se lisi ma lo matou pule:

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

Sei o tatou tatalaina le faila mo le tusitusi na o la tatou polokalama:

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

Fa'alauiloa

[user@localhost ]$ python openforwrite.py 

Matou te faatali mo ni nai sekone

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

O lea la, o loʻo ia i matou le faʻafitauli o loʻo faʻamatalaina i le amataga o lenei tusiga. Avanoa avanoa 0, 100% nofoia.

Matou te manatua e tusa ai ma tulaga o le galuega, matou te taumafai e faʻamaumau faʻamaumauga taua tele e le mafai ona leiloa. Ma i le taimi lava e tasi, matou te manaʻomia le faʻaleleia o le auaunaga e aunoa ma le toe amataina o le faagasologa.

Fa'apea o lo'o i ai pea le matou va'a va'aiga, ae i se isi vaeluaga, mo se fa'ata'ita'iga ile /home.

Sei o tatou taumafai e “reprogram on the fly” a tatou code.

Se'i o tatou va'ai i le PID o la tatou fa'agasologa, lea na 'ai uma ai le avanoa tisiki:

[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

Faʻafesoʻotaʻi i le faagasologa e ala ile gdb

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

Se'i tatou va'ai i fa'amatalaga faila faila:

(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

Matou te vaʻavaʻai i faʻamatalaga e uiga i faila faila numera 3, lea e fiafia i ai i matou

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

I le manatuaina o le mea e fai e le Python (vaai i luga o le mea na matou tamoe ai ma maua ai le valaau tatala), pe a faʻagasolo a matou code e tatala ai se faila, matou te faia lava e tasi e fai ma sui o la matou faagasologa, ae matou te manaʻomia le O_WRONLY|O_CREAT| O_TRUNC bits e sui i se tau numera. Ina ia faia lenei mea, tatala le kernel puna, mo se faʻataʻitaʻiga iinei ma vaai po o fea fu'a e nafa ma le a

#define O_WRONLY 00000001
#define O_CREAT 00000100
#define O_TRUNC 00001000

Matou te tuʻufaʻatasia uma tau i le tasi, matou te maua 00001101

Matou te faʻatautaia la matou telefoni mai le gdb

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

O lea na matou maua ai se faila faila fou ma le numera 4 ma se faila fou tatala i luga o se isi vaeluaga, matou te siaki:

(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

Matou te manatua le faʻataʻitaʻiga i le paipa - faʻafefea ona suia e le bash faila faila, ma ua uma ona matou aʻoaʻoina le dup2 system call.

Matou te taumafai e sui le tasi faila faila i le isi

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

Matou siaki:

(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

Matou te tapunia faila faʻamatalaga 4, talu ai matou te le manaʻomia:

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

Ma alu ese mai le 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

Siaki le faila fou:

[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

E pei ona e vaʻaia, o faʻamaumauga ua tusia i se faila fou, seʻi o tatou siaki le mea tuai:

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

Leai se faʻamatalaga e leiloa, o le talosaga e galue, ogalaau e tusia i se nofoaga fou.

Sei o tatou faafaigata teisi le galuega

Sei o tatou mafaufau e taua le faʻamatalaga ia i tatou, ae leai so matou vaʻa vaʻaia i soʻo se vaega ma e le mafai ona matou faʻafesoʻotaʻi le disk.

O le mea e mafai ona matou faia o le toe faʻafeiloaʻi o matou faʻamatalaga i se mea, mo se faʻataʻitaʻiga i le paipa, ma faʻafeiloaʻi faʻamatalaga mai le paipa i le fesoʻotaʻiga e ala i se polokalame, mo se faʻataʻitaʻiga netcat.
E mafai ona tatou fatuina se paipa igoa ma le mkfifo poloaiga. O le a faia ai se faila pseudo i luga o le faila faila tusa lava pe leai se avanoa avanoa i luga.

Toe amata le talosaga ma siaki:

[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

E leai se avanoa tisiki, ae matou faia ma le manuia se paipa igoa iina:

[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

Ole taimi nei e tatau ona tatou afifi uma faʻamatalaga e alu i totonu o lenei paipa i se isi faʻaumau e ala ile fesoʻotaʻiga; ole netcat tutusa e talafeagai mo lenei.

I luga o le server remote-server.example.com matou te tamoe

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

I luga o la matou 'au'aunaga fa'afitauli matou te fa'asolo i se isi nofoaga

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

O le taimi nei o faʻamatalaga uma e faʻamutaina i le paipa o le a otometi lava ona alu i le stdin i le netcat, lea o le a tuʻuina atu i le fesoʻotaʻiga i luga o le taulaga 7777.

Pau lava le mea e tatau ona matou faia o le amata tusia o matou faʻamatalaga i totonu o le paipa lea e igoa.

Ua uma ona matou fa'aogaina le talosaga:

[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

Mai fu'a uma, matou te mana'omia lava O_WRONLY talu ai o lo'o iai le faila ma matou te le mana'omia le kilia.

[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

Siaki le server mamao remote-server.example.com

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

O loʻo oʻo mai faʻamatalaga, matou te siakiina le faʻafitauli o le server

[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

Ua fa'asaoina fa'amaumauga, ua fo'ia le fa'afitauli.

Ou te faʻaaogaina lenei avanoa e faʻafeiloaʻi ai i aʻu uo mai Degiro.
Faalogo i le Radio T podcasts.

Lelei i tagata uma.

I le avea ai ma meaaoga, ou te fautua atu e te mafaufau pe o le a le mea o le a i ai i le faagasologa o faila faila pusi ma moe pe afai e te faʻatinoina le poloaiga lenei:

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

puna: www.habr.com

Faaopoopo i ai se faamatalaga