Kaituhi konae i Linux me nga tauira

I tetahi wa, i te wa o te uiui, ka pataihia ahau, ka aha koe mena ka kitea e koe he ratonga kaore e mahi na te mea kua pau te mokowhiti o te kōpae?

Ko te tikanga, ka whakahoki ahau ka kite ahau i nga mea e nohoia ana e tenei waahi, a, ki te taea, ka horoi ahau i te waahi.
Katahi ka patai te kai-uiui, ka pehea mena karekau he mokowhiti mokowhiti i te wahanga, engari kare ano koe e kite i nga konae ka pau katoa nga waahi?

I kii ahau ka taea e koe te titiro tonu ki nga kaiwhakaahua konae tuwhera, hei tauira me te whakahau lsof, me te mohio ko tehea tono kua mau i nga waahi katoa e waatea ana, katahi ka taea e koe te mahi i runga i nga ahuatanga, i runga i te hiahia o nga raraunga. .

I haukotia ahau e te kai-uiui i runga i te kupu whakamutunga, me te tapiri atu ki tana patai: "Mehemea kaore e hiahiatia ana e matou nga raraunga, he raarangi patuiro noa, engari kaore te tono e mahi na te mea kaore e taea e ia te tuhi i te patuiro"?

"Ae," ka whakahoki ahau, "ka taea e tatou te whakakore i te patuiro i roto i te whirihora tono me te whakaara ano."
I whakahē te kai uiui: "Kao, kaore e taea e matou te whakaara ano i te tono, kei a matou tonu nga raraunga nui kei te rongoa i roto i te mahara, a ko nga kaihoko nui e hono ana ki te ratonga ake, kaore e taea e matou te kaha ki te hono ano."

"Ae," ka kii ahau, "ki te kore e taea e taatau te whakaara ano i te tono me te kore he mea nui nga raraunga ki a maatau, katahi ka taea e taatau te whakakore noa i tenei konae tuwhera ma te kaiwhakaahua konae, ahakoa kaore e kitea i roto i te whakahau ls i runga i te punaha konae."

I pai te kai uiui, engari kaore au.

Katahi ahau ka whakaaro, he aha te tangata kare ai e keri hohonu atu i aku matauranga? Engari mehemea he mea nui nga raraunga i muri i nga mea katoa? He aha mena ka kore e taea e taatau te whakaara ano i tetahi mahi, ka tuhi te tukanga ki te punaha konae i runga i te wehewehenga karekau he mokowhiti? He aha te mea kaore e taea e tatou te ngaro noa nga raraunga kua oti te tuhi, engari ano hoki nga raraunga e tuhia ana e tenei tukanga, e ngana ana ranei ki te tuhi?

Tuzik

I te timatanga o taku mahi, ka ngana ahau ki te hanga i tetahi tono iti e hiahia ana ki te penapena i nga korero kaiwhakamahi. Na ka whakaaro ahau, me pehea e taurite ai te kaiwhakamahi ki ana raraunga. Hei tauira, kei ahau a Ivanov Ivan Ivanovich, kei a ia etahi korero, engari me pehea e taea ai e au te whakahoahoa ki a raatau? Ka taea e au te tohu tika ko te kuri ko "Tuzik" te ingoa no tenei Ivan. Engari he aha mena ka hurihia e ia tona ingoa, ka huri ko Ivan, hei tauira, ko Olya? Na ka puta ko to tatou Olya Ivanovna Ivanova ka kore he kuri, ka noho tonu to tatou Tuzik ki te Ivan kore. Ko tetahi papaarangi i hoatu ki ia kaiwhakamahi he tohu motuhake (ID) i awhina ki te whakaoti i tenei raru, a ko taku Tuzik i herea ki tenei ID, he tau rangatū noa. No reira, ko te rangatira o te tuzik he nama ID 2, a i etahi wa i raro a Ivan i tenei ID, katahi ka riro a Olya i raro i tenei ID ano. Ko te raruraru o te tangata me te mahi kararehe i tino whakatauhia.

Whakaahuatanga kōnae

Ko te raru o te konae me te hotaka e mahi ana me tenei konae he rite tonu ki to taatau kuri me te tangata. Ki te mea kua whakatuwherahia e ahau tetahi konae ko ivan.txt ka timata ahau ki te tuhi i te kupu tuzik ki roto, engari ka taea e au te tuhi i te reta tuatahi "t" i roto i te konae, ka whakaingoatia tenei konae e tetahi, hei tauira, ki olya.txt. Engari he rite tonu te konae, kei te pirangi tonu ahau ki te tuhi i taku ace ki roto. I nga wa katoa ka whakatuwherahia he konae ma te waea punaha tuwhera i roto i tetahi reo hootaka ka whiwhi au i tetahi ID ahurei e tohu ana i ahau ki tetahi konae, ko tenei ID te kaiwhakaahua konae. A kare he aha he aha me ko wai te mahi ki tenei konae ka whai ake, ka taea te whakakore, ka whakaingoatia ano, ka taea te whakarereke i te rangatira, ka tangohia ranei nga mana ki te panui me te tuhi, ka whai waahi tonu ahau ki a ia, na te mea i te wa i whakatuwherahia ai te konae, i whai mana ahau ki te panui me te tuhi ranei, ka tiimata ahau ki te mahi me te mahi, ko te tikanga me mahi tonu ahau.

I roto i te Linux, ka whakatuwherahia e te whare pukapuka libc nga konae whakamaarama e 3 mo ia tono whakahaere (tukatuka), ko te nama 0,1,2. Ka kitea etahi atu korero i runga i nga hononga tangata stdio и tangata stdout

  • Ko te kaiwhakaahua konae 0 e kiia ana ko STDIN me te hono ki te whakauru tono
  • Ko te kaiwhakaahua konae 1 e kiia ana ko STDOUT ka whakamahia e nga tono ki te whakaputa raraunga, penei i nga tono taa
  • Ko te kaiwhakaahua kōnae 2 e kiia ana ko STDERR ka whakamahia e nga tono ki te whakaputa i nga karere hapa.

Mena kei roto i to kaupapa ka whakatuwherahia e koe tetahi konae mo te panui me te tuhi, tera pea ka whiwhi koe i te ID koreutu tuatahi ka waiho hei nama 3.

Ka taea te tiro i te rarangi o nga kaiwhakaahua konae mo nga mahi katoa mena ka mohio koe ki tana PID.

Hei tauira, me whakatuwhera te papatohu bash ka titiro ki te PID o ta maatau mahi

[user@localhost ]$ echo $$
15771

I roto i te papatohu tuarua kia rere tatou

[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

Ka taea e koe te wareware i te nama kaiwhakaahua konae 255 mo nga kaupapa o tenei tuhinga; i whakatuwherahia mo ona hiahia ma te bash ake, kaua ma te whare pukapuka hono.

Inaianei ko nga konae whakamaarama e 3 e hono ana ki te taputapu pseudo terminal /dev/pts, engari ka taea tonu e tatou te whakahaere i a raatau, hei tauira, whakahaere i roto i te papatohu tuarua

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

A i roto i te papatohu tuatahi ka kite tatou

[user@localhost ]$ hello world

Anō me te Paipa

Ka taea e koe te whakakore i enei konae whakamaarama e toru i roto i nga mahi katoa, tae atu ki te bash, hei tauira ma te paipa e hono ana i nga tikanga e rua, tirohia.

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

Ka taea e koe te whakahaere i tenei whakahau i a koe ano strace -f ka kite i nga mea kei roto, engari ka korero poto ahau ki a koe.

Ko ta maatau mahi matua me te PID 15771 e tarai ana i ta maatau whakahau me te mohio ki te maha o nga whakahau e hiahia ana matou ki te whakahaere, i a maatau e rua enei: ngeru me te moe. E mohio ana a Bash me hanga e ia nga tikanga tamariki e rua, ka hanumi ki te paipa kotahi. Hui katoa, kia 2 nga tukanga tamariki me te paipa kotahi.

Ka whakahaerehia e Bash tetahi waea punaha i mua i te hanga i nga tukanga tamariki pipe ka whiwhi whakaahua hou i runga i te putunga paipa rangitahi, engari kare ano tenei parepare i te hono i a maatau tukanga tamariki e rua.

Mo te tukanga matua, te ahua nei he paipa kee, engari karekau ano nga tukanga tamariki:

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

Na ka whakamahi i te waea punaha ki tou Ka hangaia e te bash nga tukanga tamariki e rua, a ka penei te ahua o a maatau tukanga e toru:

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

Kaua e wareware ko te katote i te tukanga me nga kaiwhakaahua konae katoa, na reira ka rite tonu i roto i nga mahi a nga matua me nga mahi a te tamaiti. Ko te mahi a te tukanga matua me te PID 15771 he aroturuki i nga mahi a te tamaiti, no reira ka tatari noa mo te whakautu a nga tamariki.

No reira, kaore e hiahiatia he paipa, ka kati i nga whakaahuatanga konae kua nama 3 me te 4.

I roto i te tukanga bash tamaiti tuatahi me PID 9004, te waea waea taarua2, ka huri i to maatau whakaahua konae STDOUT te nama 1 ki te kaiwhakaahua konae e tohu ana ki te paipa, i roto i ta maatau ko te nama 3. No reira, ko nga mea katoa e tuhia ana e te tukanga tamaiti tuatahi me te PID 9004 ki te STDOUT ka mutu i roto i te putunga paipa.

I te tukanga tamaiti tuarua me te PID 9005, ka whakamahia e te bash te dup2 ki te huri i te kaiwhakaahua konae STDIN nama 0. Inaianei ko nga mea katoa ka panuihia e to maatau tuarua me te PID 9005 ka panuihia mai i te paipa.

Whai muri i tenei, ka kati ano nga kaiwhakaahua konae 3 me te 4 i roto i nga mahinga tamariki, na te mea kua kore e whakamahia.

Ka warewarehia e au te whakaahuatanga o te konae 255; ka whakamahia mo nga kaupapa o roto na te bash ano, ka kati ano i roto i nga tikanga tamariki.

I muri mai, i te tukanga tamaiti tuatahi me te PID 9004, ka timata te bash ki te whakamahi i te waea waea exec Ko te konae whakahaere i tohua e matou i runga i te raina whakahau, i roto i a maatau ko /usr/bin/cat.

I roto i te tukanga tamaiti tuarua me te PID 9005, ka whakahaerehia e te bash te tuarua o nga mahi i tohua e matou, i roto i to maatau /usr/bin/sleep.

Ko te waea punaha whakahaere e kore e kati i nga kakau konae mena ka whakatuwherahia me te haki O_CLOEXEC i te wa i tuwhera ai te waea. I a maatau, i muri i te whakarewatanga o nga konae ka taea te whakahaere, ka tiakina nga kaiwhakaahua konae katoa.

Tirohia i roto i te papatohu:

[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

Ka kite koe, he rite tonu te tau ahurei o a maatau paipa i roto i nga mahi e rua. No reira he hononga kei waenganui i nga tukanga rereke e rua me te matua kotahi.

Mo te hunga kaore i te mohio ki nga waea punaha e whakamahia ana e te bash, ka tino taunaki ahau ki te whakahaere i nga whakahau ma te strace me te kite i nga mea e tupu ana i roto, hei tauira penei:

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

Me hoki ano ki to maatau raruraru mo te iti o te mokowā kōpae me te ngana ki te tiaki raraunga me te kore e timata ano i te tukanga. Me tuhi he kaupapa iti ka tuhi tata ki te 1 mekapaita ia hekona ki te kōpae. I tua atu, ki te kore e taea e matou te tuhi raraunga ki te kōpae, ka warewarehia e matou tenei ka ngana ki te tuhi ano i nga raraunga mo te tuarua. I roto i te tauira e whakamahi ana ahau i te Python, ka taea e koe te whakamahi i etahi atu reo hotaka.

[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

Me whakahaere te hotaka ka titiro ki nga kaiwhakaahua konae

[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

Kei te kite koe, e 3 o maatau whakaahua konae paerewa me tetahi atu i whakatuwherahia e matou. Kia tirohia te rahi o te konae:

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

Kei te tuhia nga raraunga, ka ngana matou ki te huri i nga whakaaetanga i runga i te konae:

[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

Ka kite matou kei te tuhia tonu nga raraunga, ahakoa kaore he whakaaetanga a to maatau kaiwhakamahi ki te tuhi ki te konae. Me ngana ki te tango:

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

Kei hea nga raraunga i tuhia? A kua tuhia katoatia? Ka tirohia e matou:

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

Ae, kei te noho tonu to tatou kaiwhakaahua konae, a ka taea e tatou te whakarite i tenei kaiwhakaahua konae penei i to tatou konae tawhito, ka taea e tatou te panui, te whakamarama me te kape.

Kia titiro tatou ki te rahi o te konae:

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

Ko te rahi o te konae ko 19923457. Me ngana ki te ūkui i te konae:

[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

Kei te kite koe, kei te piki noa te rahi o te konae, karekau i mahi to maatau. Me titiro ki nga tuhinga waea punaha tuwhera. Mena ka whakamahi tatou i te haki O_APPEND i te wa e whakatuwhera ana i te konae, katahi ka tuhia e ia, ka tirohia e te punaha whakahaere te rahi o te konae me te tuhi i nga raraunga ki te pito rawa o te konae, ka mahia tenei ma te ngota. Ma tenei ka taea e nga miro maha, nga tukanga ranei te tuhi ki te konae kotahi. Engari i roto i ta maatau waehere kaore matou e whakamahi i tenei haki. Ka taea e tatou te kite i te rahi o te konae kei roto i te lsof i muri i te pouaka mena ka whakatuwherahia e tatou te konae mo etahi atu tuhi, ko te tikanga kei roto i ta tatou waehere.

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

me hoatu e matou

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

Te tirotiro me te haki “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

me te haki "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

Te whakahōtaka i tētahi hātepe e rere kē ana

I te nuinga o nga wa ka whakamahia e nga kaihōtaka, i te wa e hanga ana, e whakamatautau ana hoki i nga kaupapa patuiro (hei tauira GDB) me nga momo reanga o te takiuru ki te tono. Ka whakawhiwhia e Linux te kaha ki te tuhi me te whakarereke i tetahi kaupapa kua rere ke, hei tauira, whakarereke i nga uara o nga taurangi, tautuhi i te waahi pakaru, aha atu, aha atu.

Ka hoki ki te patai taketake mo te kore rawa o te mokowā kōpae hei tuhi i tetahi konae, me ngana ki te whakataurite i te raru.

Me hanga he konae mo ta tatou wehewehenga, ka whakairihia hei kopae motuhake:

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

Me hanga he punaha konae:

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

Whakapuruhia te punaha konae:

[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

Ka hangaia e matou he whaiaronga me to matou rangatira:

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

Me whakatuwhera te konae hei tuhi i roto i ta maatau kaupapa:

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

Whakarewatanga

[user@localhost ]$ python openforwrite.py 

Ka tatari tatou mo etahi hēkona

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

Na, kei a maatau te raru i whakaahuahia i te timatanga o tenei tuhinga. Mokowā wātea 0, 100% kua nohoia.

E mahara ana matou i runga i nga tikanga o te raruraru, kei te ngana matou ki te tuhi i nga raraunga tino nui e kore e ngaro. A i te wa ano, me whakatika taatau i te ratonga me te kore e timata ano te mahi.

Me kii kei a tatou tonu te mokowā kōpae, engari i roto i te wehewehenga rereke, hei tauira i /home.

Me ngana ki te "whakahotaka ano i runga i te rere" to tatou waehere.

Me titiro ki te PID o ta tatou mahi, kua pau katoa te mokowā kōpae:

[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

Hono atu ki te tukanga ma te gdb

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

Kia titiro tatou ki nga kaiwhakaahua konae tuwhera:

(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

Ka titiro matou ki nga korero mo te tuhinga whakaahua nama 3, e pai ana ki a matou

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

Ma te maumahara he aha te punaha e kiia nei e Python (tirohia i runga ake i te waahi i rere ai matou ka kitea te waea tuwhera), i te wa e tukatuka ana i ta matou waehere hei whakatuwhera i tetahi konae, ka pera ano matou mo ta matou mahi, engari me O_WRONLY|O_CREAT| Ka whakakapi nga moka O_TRUNC ki te uara tau. Ki te mahi i tenei, whakatuwhera i nga puna kernel, hei tauira konei a ka titiro ki nga haki he aha

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

Ka whakakotahihia e matou nga uara katoa ki te kotahi, ka whiwhi matou i te 00001101

Ka whakahaerehia ta maatau waea mai i te gdb

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

Na ka whiwhi matou i tetahi kaiwhakaahua konae hou me te nama 4 me tetahi konae tuwhera hou ki tetahi atu waahanga, ka tirohia e matou:

(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

Ka maumahara matou ki te tauira me te putorino - me pehea te whakarereke a te bash i nga kaiwhakaahua konae, kua ako ano matou i te waea punaha dup2.

Ka ngana taatau ki te whakakapi i tetahi kaiwhakaahua konae ki tetahi atu

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

Ka tirohia e matou:

(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

Ka kati tatou i te whakaahuatanga konae 4, na te mea kaore e hiahiatia ana:

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

Na ka puta te 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

Takina te kōnae hōu:

[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

Kei te kite koe, kua tuhia nga raraunga ki tetahi konae hou, tirohia te mea tawhito:

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

Kaore he raraunga i ngaro, ka mahi te tono, ka tuhia nga raarangi ki tetahi waahi hou.

Kia whakamaarama iti te mahi

Whakaarohia he mea nui nga raraunga ki a tatou, engari kaore he mokowā kōpae i roto i tetahi o nga wehewehenga kaore e taea te hono i te kōpae.

Ko te mea ka taea e matou ko te tuku i a matou raraunga ki tetahi waahi, hei tauira ki te paipa, ka huri ano i nga raraunga mai i te paipa ki te whatunga ma etahi kaupapa, hei tauira netcat.
Ka taea e tatou te hanga paipa ingoa me te whakahau mkfifo. Ka waihangahia he konae pseudo i runga i te punaha konae ahakoa karekau he mokowhiti kei runga.

Tīmatahia te tono ka tirohia:

[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

Karekau he mokowā kōpae, engari he pai te hanga paipa ki reira:

[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

Inaianei me takai tatou i nga raraunga katoa ka uru ki roto i tenei paipa ki tetahi atu tūmau ma te whatunga; he pai te netcat mo tenei.

I runga i te tūmau remote-server.example.com ka whakarewahia e matou

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

I runga i ta maatau tūmau raru ka whakarewahia e matou ki tetahi tauranga motuhake

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

Inaianei ko nga raraunga katoa ka mutu i roto i te paipa ka haere aunoa ki te stdin i netcat, ka tukuna atu ki te whatunga i runga i te tauranga 7777.

Ko te mahi anake ko te timata ki te tuhi i o maatau raraunga ki tenei paipa ingoa.

Kei a maatau te tono e whakahaere ana:

[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

O nga haki katoa, me O_WRONLY noa tatou i te mea kei te noho kee te konae, kaore e tika kia hurahia.

[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

Takina te tūmau mamao remote-server.example.com

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

Kei te haere mai nga raraunga, ka tirohia e matou te tūmau raru

[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

Ka tiakina nga raraunga, ka whakatauhia te raru.

Ka whai waahi ahau ki te oha atu ki aku hoa mahi mai i Degiro.
Whakarongo ki Radio-T podcasts.

Nga mea pai katoa.

Hei mahi a-whare, ka kii ahau kia whakaaro koe mo nga mea ka puta i roto i nga konae whakaahua whakaahua ngeru me te moe mena ka whakahaerehia e koe te whakahau e whai ake nei:

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

Source: will.com

Tāpiri i te kōrero