Indray mandeha, nandritra ny tafatafa iray, dia nanontaniana aho, inona no hataonao raha mahita serivisy tsy mandeha ianao noho ny tsy fisian'ny habaka?
Mazava ho azy fa namaly aho fa hojereko izay misy an'io toerana io ary, raha azo atao, dia hanadio ilay toerana aho.
Dia nanontany ilay mpanadihady hoe, ahoana raha tsy misy toerana malalaka eo amin'ny fizarazarana, nefa tsy hitanao koa izay rakitra mety haka ny habaka rehetra?
Tamin'izany dia nilaza aho fa afaka mijery ireo mpamoritra rakitra misokatra foana ianao, ohatra amin'ny baiko lsof, ary fantaro hoe iza no fampiharana naka ny habaka rehetra misy, ary avy eo dia afaka mihetsika araka ny toe-javatra ianao, miankina amin'ny hoe ilaina ny data. .
Ny mpanadihady dia nanapaka ahy tamin'ny teny farany, nanampy tamin'ny fanontaniany hoe: "Eritrereto hoe tsy mila ny angon-drakitra izahay, dia log debug fotsiny io, fa tsy mandeha ny fampiharana satria tsy afaka manoratra debug"?
"Eny," hoy aho namaly, "afaka mamono ny debug ao amin'ny config fampiharana ary mamerina azy indray."
Nanohitra ilay mpanadihady hoe: "Tsia, tsy afaka mamerina ny fampiharana izahay, mbola manana angon-drakitra manan-danja voatahiry ao anaty fitadidiana izahay, ary ny mpanjifa manan-danja dia mifandray amin'ny serivisy, izay tsy azontsika terena hifandray indray."
"eny ary," hoy aho, "raha tsy afaka mamerina ny fampiharana isika ary tsy manan-danja amintsika ny angon-drakitra, dia azonao atao ny mamafa ity rakitra misokatra ity amin'ny alΓ lan'ny famaritana ny rakitra, na dia tsy hitanay ao amin'ny baiko ls aza izany. amin'ny rafitra fichier."
Faly ilay mpanadinadina, fa tsy izaho.
Dia nieritreritra aho hoe, nahoana no tsy mihady lalina kokoa ilay olona mitsapa ny fahalalako? Ahoana anefa raha zava-dehibe ny angon-drakitra? Ahoana raha tsy afaka mamerina dingana iray isika, ary manoratra amin'ny rafi-drakitra amin'ny fizarazarana tsy misy habaka malalaka ny dingana? Ahoana raha tsy ny angon-drakitra efa voasoratra ihany no mety ho very, fa koa ny angon-drakitra izay soratan'ity dingana ity na ezahina soratana?
Tuzik
Tany am-piandohan'ny asako dia nanandrana namorona rindranasa kely mila fitahirizana ny mombamomba ny mpampiasa aho. Ary avy eo nieritreritra aho hoe ahoana no ahafahako mampifanaraka ny mpampiasa amin'ny angonany. Ohatra, manana an'i Ivanov Ivan Ivanovich aho, ary manana fampahalalana vitsivitsy izy, saingy ahoana no ahafahako minamana amin'izy ireo? Azoko marihina mivantana fa an'io Ivan io ilay alika antsoina hoe "Tuzik". Ahoana anefa raha hanova ny anarany izy, ary ho solon'i Ivan lasa, ohatra, Olya? Avy eo dia ho hita fa tsy hanana alika intsony ny Olya Ivanovna Ivanova, ary ny Tuzik-nay dia mbola ho an'i Ivan tsy misy. Nanampy tamin'ny famahana ity olana ity ny angon-drakitra iray izay nanome ny mpampiasa tsirairay ny famantarana (ID) tokana, ary ny Tuzik-ko dia nafatotra tamin'ity ID ity, izay, raha ny marina, dia laharana serial fotsiny. Noho izany, ny tompon'ilay ace dia nanana ID laharana 2, ary tamin'ny fotoana iray dia teo ambanin'io ID io i Ivan, ary avy eo dia lasa teo ambanin'ny ID mitovy i Olya. Saika voavaha ny olan'ny olombelona sy ny fiompiana.
Famaritana rakitra
Ny olan'ny rakitra sy ny programa miasa miaraka amin'ity rakitra ity dia mitovy amin'ny an'ny alika sy ny lehilahy. Eritrereto hoe nanokatra rakitra antsoina hoe ivan.txt aho ary nanomboka nanoratra ny teny hoe tuzik tao, fa ny litera voalohany "t" ihany no vitako tao amin'ilay rakitra, ary io rakitra io dia nosoloan'olona iray, ohatra, ho olya.txt. Saingy ny rakitra dia tsy miova, ary mbola te-handrakitra ny ace-ko ao aho. Isaky ny misy rakitra misokatra amin'ny alΓ lan'ny antso an-tariby
Ao amin'ny Linux, ny tranomboky libc dia manokatra rakitra descriptor 3 ho an'ny rindranasa tsirairay (process), misy isa 0,1,2. Misy fampahalalana bebe kokoa azo jerena ao amin'ny rohy
- Ny famaritana ny rakitra 0 dia antsoina hoe STDIN ary mifandray amin'ny fampidirana fampiharana
- Ny famaritana fisie 1 dia antsoina hoe STDOUT ary ampiasain'ny fampiharana hamoahana angona, toy ny baiko fanontana
- Ny famaritana ny rakitra 2 dia antsoina hoe STDERR ary ampiasain'ny fampiharana hamoaka hafatra diso.
Raha manokatra rakitra ho an'ny famakiana na fanoratana ao amin'ny programanao ianao, dia azo inoana fa hahazo ny ID maimaim-poana voalohany ianao ary ho laharana 3 izany.
Ny lisitry ny mpamoritra rakitra dia azo jerena amin'ny dingana rehetra raha fantatrao ny PID-ny.
Ohatra, andao hanokatra ny console bash ary hijery ny PID amin'ny dingana ataontsika
[user@localhost ]$ echo $$
15771
Ao amin'ny console faharoa andao hihazakazaka
[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
Azonao atao ny tsy miraharaha ny fisie descriptor laharana 255 ho an'ny tanjon'ity lahatsoratra ity; nosokafana ho an'ny filany tamin'ny alΓ lan'ny bash mihitsy izy io, fa tsy tamin'ny tranomboky mifandray.
Ankehitriny ny rakitra descriptor 3 rehetra dia mifandray amin'ny fitaovana pseudo terminal
[user@localhost ]$ echo "hello world" > /proc/15771/fd/0
Ary amin'ny console voalohany ho hitantsika
[user@localhost ]$ hello world
Redirect sy Pipe
Azonao atao ny manafoana mora foana ireo rakitra descriptor 3 ireo amin'ny dingana rehetra, ao anatin'izany ny bash, ohatra amin'ny alΓ lan'ny fantsona mampifandray ireo dingana roa, jereo
[user@localhost ]$ cat /dev/zero | sleep 10000
Azonao atao ny mampandeha ity baiko ity amin'ny tenanao strace -f ary jereo ny ao anatiny fa holazaiko fohifohy.
Ny fizotry ny bash ray aman-dreninay miaraka amin'ny PID 15771 dia mamadika ny baikonay ary mahatakatra tsara ny isan'ny baiko tiana atao, raha ny anay dia misy roa amin'izy ireo: saka sy torimaso. Fantatr'i Bash fa mila mamorona dingana roa amin'ny ankizy izy, ary manambatra azy ireo ho fantsona iray. Amin'ny fitambarany, ny bash dia mila fizotry ny zaza 2 ary fantsona iray.
Bash dia manao antso an-tariby alohan'ny hamoronana ny fizotran'ny ankizy
Ho an'ny fizotry ny ray aman-dreny dia toa efa misy ny fantsona, saingy tsy mbola misy ny fizotran'ny zaza:
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
Avy eo mampiasa ny antso rafitra
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
Aza adino fa clone clone ny dingana miaraka amin'ny antontan-taratasy rehetra descriptors, ka ho mitovy amin'ny ray aman-dreny sy ny zaza. Ny asan'ny fizotry ny ray aman-dreny miaraka amin'ny PID 15771 dia ny manara-maso ny fizotran'ny zaza, ka miandry valiny avy amin'ny ankizy fotsiny.
Noho izany, tsy mila fantsona, ary manidy ny rakitra descriptors 3 sy 4.
Ao amin'ny dingana bash ankizy voalohany miaraka amin'ny PID 9004, ny antson'ny rafitra
Ao amin'ny dingana faharoa amin'ny ankizy miaraka amin'ny PID 9005, bash dia mampiasa dup2 hanovana ny famaritana ny rakitra STDIN laharana 0. Ankehitriny dia hovakiana avy amin'ny sodina ny zavatra rehetra hovakian'ny bash faharoa miaraka amin'ny PID 9005.
Aorian'izany dia mihidy ao amin'ny fizotry ny ankizy ihany koa ny famaritana ny rakitra misy laharana 3 sy 4, satria tsy ampiasaina intsony izy ireo.
Iniana aho tsy miraharaha ny famaritana ny rakitra 255; ampiasaina amin'ny tanjona anatiny amin'ny alΓ lan'ny bash izy io ary hikatona ihany koa amin'ny fizotran'ny ankizy.
Manaraka, amin'ny dingana voalohany amin'ny ankizy miaraka amin'ny PID 9004, bash dia manomboka mampiasa antso an-tariby
Ao amin'ny dingana faharoa amin'ny zaza miaraka amin'ny PID 9005, ny bash dia mitantana ny executable faharoa nofaritanay, amin'ny tranga misy anay /usr/bin/sleep.
Ny antson'ny rafitra exec dia tsy manidy ny fisie raha tsy nosokafana tamin'ny saina O_CLOEXEC tamin'ny fotoana nanaovana ny antso misokatra. Amin'ny tranga misy antsika, aorian'ny fandefasana ireo rakitra azo tanterahana dia hovonjena avokoa ireo mpamoritra rakitra ankehitriny.
Jereo ao amin'ny console:
[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
Araka ny hitanao dia mitovy ny isa tokana amin'ny fantsonay amin'ny dingana roa. Noho izany dia manana fifandraisana eo amin'ny dingana roa samy hafa miaraka amin'ny ray aman-dreny iray ihany isika.
Ho an'ireo izay tsy zatra amin'ny antso an-tariby ampiasain'ny bash, dia manoro hevitra mafy aho ny fampandehanana ny baiko amin'ny alΓ lan'ny strace ary mijery ny zava-mitranga ao anatiny, ohatra toy izao:
strace -s 1024 -f bash -c "ls | grep hello"
Andao hiverina amin'ny olan'ny tsy fahampian'ny habaka kapila ary manandrana mitahiry angona nefa tsy manomboka ny dingana. Andao hanoratra programa kely izay hanoratra 1 megabyte isan-tsegondra eo ho eo amin'ny kapila. Ankoatra izany, raha toa ka tsy afaka nanoratra angona tamin'ny kapila izahay noho ny antony iray, dia tsy hiraharaha izany fotsiny izahay ary hiezaka hanoratra ny angona indray ao anatin'ny segondra. Ao amin'ny ohatra ampiasaiko Python, afaka mampiasa fiteny fandaharana hafa ianao.
[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
Andeha hojerentsika ny programa ary hijery ny famaritana ny rakitra
[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
Araka ny hitanao dia manana ny famaritana rakitra mahazatra 3 izahay ary iray hafa nosokafanay. Andeha hojerentsika ny haben'ny rakitra:
[user@localhost ]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 117M Oct 7 16:30 123.txt
Efa voasoratra ny angon-drakitra, miezaka manova ny fahazoan-dΓ lana amin'ny rakitra izahay:
[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
Hitanay fa mbola voasoratra ny angon-drakitra, na dia tsy mahazo alalana hanoratra amin'ny rakitra aza ny mpampiasa anay. Andeha isika hanala azy:
[user@localhost ]$ sudo rm 123.txt
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory
Aiza ny angon-drakitra voasoratra? Ary voasoratra daholo ve? Manamarina izahay:
[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)
Eny, mbola misy ny famariparitana ny rakitra ary azontsika atao toy ny rakitra taloha io mpamoritra rakitra io, afaka mamaky, mamafa ary mandika azy io isika.
Andeha hojerentsika ny haben'ny rakitra:
[user@localhost ]$ lsof | grep 123.txt
python 31083 user 3w REG 8,5 19923457 2621522 /home/user/123.txt
Ny haben'ny rakitra dia 19923457. Andao hanandrana hanadio ilay rakitra:
[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
Araka ny hitanao dia mitombo ihany ny haben'ny rakitra ary tsy mandeha ny vatantsika. Andeha hojerentsika ny antontan-taratasy momba ny antso an-tariby
with open("123.txt", "w") as f:
tsy maintsy mametraka
with open("123.txt", "a") as f:
Fanamarinana amin'ny saina "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
ary miaraka amin'ny saina "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
Fandaharana dingana efa mandeha
Matetika ny mpandrindra, rehefa mamorona sy manandrana programa, dia mampiasa debugger (ohatra GDB) na ambaratonga samihafa amin'ny fidirana amin'ny fampiharana. Ny Linux dia manome fahafahana manoratra sy manova programa efa mandeha, ohatra, manova ny soatoavin'ny variables, mametraka teboka, sns., sns.
Miverina amin'ny fanontaniana tany am-boalohany momba ny tsy fahampian'ny habaka kapila hanoratana rakitra, andao hiezaka hanahaka ny olana.
Andao hamorona rakitra iray ho an'ny fizarazarantsika, izay hapetraka ho kapila misaraka:
[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 ~]$
Andao hamorona rafitra fichier:
[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 ~]$
Apetaho ny rafitra fichier:
[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
Mamorona lahatahiry miaraka amin'ny tompony izahay:
[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs
Andao hanokatra ny rakitra ho soratana ao amin'ny programantsika ihany:
with open("/mnt/logs/123.txt", "w") as f:
fandefasana
[user@localhost ]$ python openforwrite.py
Miandry segondra vitsy izahay
[user@localhost ~]$ df -h | grep mnt
/dev/loop0 8.7M 8.0M 0 100% /mnt
Noho izany, manana ny olana voalaza tany am-piandohan'ity lahatsoratra ity isika. Toerana malalaka 0, 100% mipetraka.
Tsaroantsika fa araka ny fepetran'ny asa, dia miezaka ny mirakitra angon-drakitra tena manan-danja izay tsy ho very. Ary miaraka amin'izay koa, mila manamboatra ny serivisy isika nefa tsy mamerina ny dingana.
Andeha atao hoe mbola manana habaka kapila isika, fa amin'ny fizarazarana hafa, ohatra ao amin'ny /home.
Andeha isika hiezaka ny "reprogram on the fly" ny code.
Andeha hojerentsika ny PID amin'ny fizotrantsika, izay nandany ny habaka kapila rehetra:
[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
Mifandraisa amin'ny dingana amin'ny alΓ lan'ny gdb
[user@localhost ~]$ gdb -p 10078
...
(gdb)
Andeha hojerentsika ny famaritana ny rakitra misokatra:
(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
Mijery ny fampahalalana momba ny famaritana ny rakitra laharana 3 izahay, izay mahaliana anay
(gdb) shell cat /proc/10078/fdinfo/3
pos: 8189952
flags: 0100001
mnt_id: 482
Raha mitadidy ny atao hoe rafitra antsoina hoe Python (jereo etsy ambony ny toerana nihazakazaka strace ary nahita ny antso misokatra), rehefa manamboatra ny code mba hanokafana rakitra, dia manao toy izany koa ny tenantsika amin'ny anaran'ny dingana ataontsika, fa mila ny O_WRONLY|O_CREAT| Ny bits O_TRUNC dia manolo amin'ny sanda isa. Mba hanaovana izany, sokafy ny loharano kernel, ohatra
#farito O_WRONLY 00000001
#define O_CREAT 00000100
#define O_TRUNC 00001000
Atambatra ho iray ny soatoavina rehetra, mahazo 00001101
Manao antso avy amin'ny gdb izahay
(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4
Noho izany dia nahazo famariparitana rakitra vaovao misy laharana 4 sy rakitra misokatra vaovao amin'ny fizarazarana hafa izahay, jereo:
(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
Tsaroantsika ny ohatra miaraka amin'ny pipe - ny fomba hanovan'ny bash ny famaritana ny rakitra, ary efa nianatra ny antson'ny rafitra dup2 izahay.
Miezaka ny manolo ny famaritana rakitra iray amin'ny iray hafa izahay
(gdb) call dup2(4,3)
$2 = 3
Hamarininay:
(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
Manakatona ny famaritana ny rakitra 4 izahay, satria tsy mila izany izahay:
(gdb) call close (4)
$1 = 0
Ary mivoaka ny 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
Fanamarinana ny rakitra vaovao:
[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
Araka ny hitanao, ny angon-drakitra dia voasoratra amin'ny rakitra vaovao, andao hojerentsika ny taloha:
[user@localhost ~]$ ls -lah /mnt/logs/123.txt
-rw-rw-r-- 1 user user 7.9M Oct 8 11:08 /mnt/logs/123.txt
Tsy misy angon-drakitra very, miasa ny fampiharana, soratana any amin'ny toerana vaovao ny logs.
Aleo hanasarotra kely ny asa
Alao sary an-tsaina fa zava-dehibe amintsika ny angon-drakitra, saingy tsy manana habaka kapila amin'ny fizarana rehetra isika ary tsy afaka mampifandray ny kapila.
Ny azontsika atao dia ny mamindra ny angonay any amin'ny toerana iray, ohatra amin'ny fantsona, ary avy eo mamindra ny angona avy amin'ny fantsona mankany amin'ny tambajotra amin'ny alΓ lan'ny programa sasany, ohatra ny netcat.
Afaka mamorona fantsona antsoina amin'ny baiko mkfifo isika. Hamorona rakitra pseudo eo amin'ny rafi-drakitra izany na dia tsy misy toerana malalaka aza.
Avereno indray ny fampiharana ary jereo:
[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
Tsy misy habaka kapila, fa nahavita namorona sodina antsoina hoe:
[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
Ankehitriny dia mila mametaka ny angon-drakitra rehetra miditra amin'ity sodina ity mankany amin'ny mpizara hafa amin'ny alΓ lan'ny tambajotra isika; io netcat io ihany no mety amin'izany.
Ao amin'ny server remote-server.example.com no atombotsika
[user@localhost ~]$ nc -l 7777 > 123.txt
Amin'ny mpizara misy olana dia manomboka amin'ny terminal misaraka izahay
[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe
Ankehitriny ny angon-drakitra rehetra izay miafara amin'ny sodina dia mandeha ho azy any amin'ny stdin amin'ny netcat, izay handefa izany amin'ny tambajotra amin'ny port 7777.
Ny hany tsy maintsy ataontsika dia ny manomboka manoratra ny angonay amin'ity fantsona nomena anarana ity.
Efa mandeha ny fampiharana:
[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
Amin'ireo saina rehetra, O_WRONLY ihany no ilaintsika satria efa misy ilay rakitra ary tsy mila mamafa azy
[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
Fanamarinana ny mpizara lavitra remote-server.example.com
[user@localhost ~]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 38M Oct 8 14:21 123.txt
Tonga ny angon-drakitra, jereo ny mpizara olana
[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
Voavonjy ny angona, voavaha ny olana.
Manararaotra miarahaba ireo mpiara-miasa amiko avy any Degiro aho.
Henoy ny podcast Radio-T.
Tsara daholo.
Amin'ny maha enti-mody, manoro hevitra anao aho hieritreritra izay ho ao amin'ny fizotry ny fichier descriptors cat and sleep raha toa ka manatanteraka izao baiko manaraka izao ianao:
[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000
Source: www.habr.com