From 0d67b1acaebe83d0f88655f0440be06acc53b61b Mon Sep 17 00:00:00 2001 From: "qcqcqc@wsl" <1220204124@zust.edu.cn> Date: Sat, 12 Apr 2025 19:35:11 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9E=E6=8E=A5service=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=A1=E6=81=AF=E4=B8=8A=E4=BC=A0=EF=BC=8C?= =?UTF-8?q?=E5=88=86=E7=A6=BB=E8=BE=93=E5=87=BAstderr=E5=92=8Cstdout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 4 +- build/client.o | Bin 0 -> 5728 bytes build/execve_interceptor.o | Bin 5176 -> 5200 bytes build/intercept.so | Bin 26816 -> 31320 bytes build/pty_dup.o | Bin 3648 -> 4688 bytes build/terminal_utils.o | Bin 6040 -> 5184 bytes .../MNIST/raw/train-images-idx3-ubyte.gz | 0 logs/execve.log | 123 +----------- logs/execve_out.log | 49 ----- logs/execve_out.log.2277570.stdout | 28 --- logs/execve_out.log.2277714.stderr | 2 - logs/execve_out.log.2277714.stdout | 5 - logs/execve_out.log.2278618.stderr | 2 - logs/execve_out.log.2278618.stdout | 5 - logs/execve_out.log.2649049.stderr | 3 + logs/execve_out.log.2649049.stdout | 3 + logs/execve_out.log.2651269.stderr | 3 + logs/execve_out.log.2651269.stdout | 3 + src/client.c | 181 ++++++++++++++++++ src/client.h | 21 ++ src/execve_interceptor.c | 2 +- src/pty_dup.c | 76 +++++--- src/pty_dup.h | 2 +- src/terminal_utils.c | 35 ++-- src/terminal_utils.h | 3 +- tests/socket-client/Makefile | 18 ++ tests/socket-client/client-tests | Bin 0 -> 22984 bytes tests/socket-client/client-tests.c | 30 +++ tests/socket-client/client-tests.o | Bin 0 -> 4816 bytes tests/socket-client/client.c | 181 ++++++++++++++++++ tests/socket-client/client.h | 21 ++ tests/socket-client/client.o | Bin 0 -> 16040 bytes tests/socket-client/test.log | 1 + 33 files changed, 539 insertions(+), 262 deletions(-) create mode 100644 build/client.o rename logs/execve_out.log.2277570.stderr => data/MNIST/raw/train-images-idx3-ubyte.gz (100%) delete mode 100644 logs/execve_out.log.2277570.stdout delete mode 100644 logs/execve_out.log.2277714.stderr delete mode 100644 logs/execve_out.log.2277714.stdout delete mode 100644 logs/execve_out.log.2278618.stderr delete mode 100644 logs/execve_out.log.2278618.stdout create mode 100644 logs/execve_out.log.2649049.stderr create mode 100644 logs/execve_out.log.2649049.stdout create mode 100644 logs/execve_out.log.2651269.stderr create mode 100644 logs/execve_out.log.2651269.stdout create mode 100644 src/client.c create mode 100644 src/client.h create mode 100644 tests/socket-client/Makefile create mode 100755 tests/socket-client/client-tests create mode 100644 tests/socket-client/client-tests.c create mode 100644 tests/socket-client/client-tests.o create mode 100644 tests/socket-client/client.c create mode 100644 tests/socket-client/client.h create mode 100644 tests/socket-client/client.o create mode 100644 tests/socket-client/test.log diff --git a/.vscode/settings.json b/.vscode/settings.json index 212db6e..1f3ef55 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,7 +24,9 @@ "stdbool.h": "c", "stat.h": "c", "debug.h": "c", - "types.h": "c" + "types.h": "c", + "client.h": "c", + "limits.h": "c" }, "C_Cpp.errorSquiggles": "disabled" } \ No newline at end of file diff --git a/build/client.o b/build/client.o new file mode 100644 index 0000000000000000000000000000000000000000..87b1a988aaa6d9225b39e348b57d24e27377d4bf GIT binary patch literal 5728 zcmbtXU2Ggz6~61FiA$4gCQ@0lKzJC2%QalQ7ABaB38435cp?vmVE8c6ZF| zY@Jj!!P;)CVc3v|27zeB8{(l#BBT~8sLi$&aq^Oy7o>uv8VN)yN2-AeEnu;n@6NsB zvy&Yv!IgLJo$q|-yXV~B@o8)HU|%XFOi77{#m1XKg;=?Bqn%UDoY*0@i@&8m@y~JT z|4G(w=KQ&3>DQK|KYmp<58n)|&2GmTwMygEEx7K8RZcUty6h1|~HJP&7M!oI6geGZN zOER@|MF?fN_J#?4wE6sixY+5)`I}-Vg4{MBMn{%w?-G!qv5@{N?ek>zUs_Yuxf`l# zuApi*F23FAys8{cmW@{JW3qXh%2;Cy$oQSo7E%iua7@1}9vVzP{V?=H4Qbqc>xL#V zXhjC&1Y0YVf~>dtyPeLZPMRS9x)Hx(T~HyA z$v`1x@9Ww_Hn)elL_Wr#Lyq`CG$=}q@z041Q3TTet?5Z7j#VxUoVoQ1e08_%>a!Oo z7OeCeKc~^Sgp^*zQooFc8b{w+uFoxZ5@zo_EoRahf^!AV^rL|cm-ghMGNcRxb9Cth z2)7L0mBtGsL53!zuuGt}v8e0qPHj(YGKr--3Rlu@#1b^Zb*VR(-?*3bNEQ`j`@3Xi za8B8SCcL`0QG5k9GNBTxo=Vz|W!0s$*tmxv>Q}6$1J$m#Qod@0ukuH-dDpK&pzzgx zqV*gItb;cxba0aee~LxU39)*Z=J8T5ChQ@7Sr zVca9u`cw0Zjk{TPXshhd2$ZQSICV^PWv7TevI|c<%C4Oxu#ughv}mAE^~^3bD4{63 zFp?hGwJAFUHDa}&nkQ9kjGn46kR9ho*8nYA@2Qz7k#Xmnp>uc^MrXcH$8LRYNt}Ma zHT_6<7D7fgKdhEW*FoWJrQWbt>vQi3@67x6m_CDDOuPaeXd2#Ni+kvef2h~TXHYmht`6epIgAWn|{`c2$Bfn3(&tzJ{t$JY@Sm{ zKyK>3iYR)c2Xr)I|3rt+J8S>$bk44(&eGhNV*-?GZydM1;_QT&DR@&E&v7y(r*d2j z3fC@_fQhP8JYjoc&@0aj+9&N|e#&u9s8$vxQFJO5yXc97h3S$#K@u5qoyb(Zg6n0< z1^0yQilbF;%JXI(6G!dJ1U+55O3&HCwD*`0hYlQgFmvztv0BBeWrl~d4`he#8?LF> z;qTmke|G4By&6WqLSW<5#U_yAp-09=pAaozo9KsfS6GSElSf4ATePF$97JpGkTHLy+=a&*< zRTI=j{{X$+$@nTp!ahPj~&mnjKm! zIaOQCy3?Kw7y1)3HLoi2hepTt?;FjJ9X$9o>(Tt9`}U7od16dBHBU@VmTJ{0N=fX+ zg9`Qr$g6VK6@jydCtjL+jKGaPehbe>^2ABUeY9RC6v z{%Z;N62rO98pFBH9T*rYs5o9oz`xIMuKyy#xz6tr@Gt8t3TDoKoZ(#mdkp9Ng#>&h z0smJ5{&C#NR1gn-W}F8#Zq~_HK%(+_#^>|9kKufNzY){{^j%e6~|tY@F}M0TR!6-4$} zwJNf%6TTFka+z*ck*zqMouzNW`{?VFK25{-Z%P_n1;lXTD8I+Fjd z%8)ybcs=})SWdTos>jC|^mSlf1-|1jH@OH28~r%^sSIgh%pH8OmQn5wEAdIHf$QT# zqe8qL>(?0K{o{KPn*Xc+F!@50&oRA5{eKrPti<~tAsetE#z8Z$6GeQy7=KgmC!=X| zUSI}_gFU!M2*Xgt<3FqYGi2i>F8eqc(SO|kq9%TwJ5xLEk5$-f{=a}jl!_S_%sX0azL)=$j^B$s!$#cyKS`(^ AN&o-= literal 0 HcmV?d00001 diff --git a/build/execve_interceptor.o b/build/execve_interceptor.o index f94cad267dc187bba99568046362f50e2d44ec83..6eb2334fc237934defb224dc25b3196a21980b8b 100644 GIT binary patch delta 329 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 z

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 JHU%5Y{vGuhvi$%6 literal 26816 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 Qx%4+x2#NkC1ry8u9gCyLrvLx| diff --git a/build/pty_dup.o b/build/pty_dup.o index 9fa0a5cad4005a1b6921d0a7e58cf2e8d261dcc5..b64fd94c4f10d54638251592277951af3b8250ff 100644 GIT binary patch literal 4688 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 literal 6040 zcmb`LeQZ-z6u@uUz{yv)@!?=&76XVzONT^(pq7!cViqvSM59UV+E-TB_BDO4GQ>^H zsPa;0rjcYZF`)4eG|`wCBQ6n!#0{g-{h0 zzw>d={do7j?a5I4))^iTQ{rKFv2sgM#u^ru>p@-(viWQt``O$4dq>#$F5Ev^8+Ljx zhl`=h!<)e11R8~%u?b!R9b*_6^<%;6nW*H|nzu{Uxt;@pjt1+hP&*o|ZxZE#Cq=n% zkti2ci*hlKG8(+jBiaqJy`)aGmo5-x<5E#JN&T{V(QfvN^7`vU>02zy<=pOs7jq+H zxC#t@e7ZFHrzRN;$@yUJA5&A#yEXWGxEg-L1BL7q6wc^L2*u=N2v$7Y!&QX#Bk04;z`67mTs_yk-bA)k+-_JMgA zVVg4&9>84y^LwgPgEVoECzGc=h(g#d@~eT|K)1$!LMh~ zVROy-Pl0*gD>TFO4fTIpR~WH(hX)1%&{V6(lm1NYPbYLX+~0ea^#x$BoW-30rnvL) zeU>{9xd;K{bCfIevZ~aJ_uwVWR`rBSIn3NWjYCi4%=_FZm=4e4_Hr>tPeR(FyJ76O zG&fX%wv`l+_&7oMg$_$BY}Zzp>MreK754;?^L ztlCfTqHhek7$Ku5Prnm74kpLhzPi%j#g4hq3fqbG3<%HZ3lvtKUMIodayi-3yL#|~ z2M!1Ui=~}5om|)tOTAbuwFfrT-7-zN!1R!ELT4b?Gpw%-k~&k`4tQ)-m^87}MgD4+ z)rFDszg(G`8a)3a{^Ah(W*0+~a>K&A!`l;T1OI~ooUFZ3ZZ6k>1_KcXt^1_o8~@|e zut*ifvg2mnW^9d}&aN?fj98@0G`rWN%sm!wK4wHf?}s*9Y57;C;{KHu11BSwV_T!i zlo9vYrq9e886VjA57(6)wughi+?0!*3wX_U4kdfo`I6Wm>{K zkZ@;hTefWUt?uZ|XY9PMrNzI_AGoz8&zmiMYuEY%>u!=*3=dzFT6l0Tv~BNT@CuC} z!xIQaUE`j|cQQ{;t*3GBH8q2 zGLsu{&GaAK{MGCdzct+2s)}D4m@8&HU8?w~uIBa7^iX^35M&uVoXfWAYBlhB)qpx5 zE0njxgY)K=I{{SU+cdlbIL23T`CI{uXzY_3ZfSV0hWBguvl{-qh7W1@%NqWchQFiX z?`wD+tW%|V{#;}Km4<(#;pa5`2MzyK!>?#~l_vi=8qRDZmriD)sYu>VrYwJq;n9(a zrVW2fxf)=WVdt|EZfsgCZKMIPSOR{NR@N}$qHcwTeJkzJcx+d~mN5%CyJBvN^+OP!Cgu4F16$tJ-ynzXTurA*6Uc`IcY zS;$9N^DH95*n$M}xc6^>2L(?8IDQyhAY8sj2!i}tcohE)Aqeu>@F>1UzW>PQ68;k5 zcxx&9cL<+P_~(SmY{8|0fNvkrx=Mv5)n# z-&)C$;a#BO_z7P?_$I>fE>!m0UGeV)9m@U0p2mNg@I_#!;=E4yV!}^p_(j5LoH=qK z)Oa7pWI!4u$AZRR;j)i$YglKE{hcm*L)zb?vG3IIj4MvJjI&>3|BTCCjq62?{ZW^_ z8rPc|`;RpIQ^{|J{2Jg<>-96Sr}Mv>e@u(LM(25>wXM~FS0hi;91p785QJ_iZ+5&kma^uBnN z@a4oFeNk}#;G-lcD~hY{N9MQorR``Zly**(U86Z@91Nf6R}H%3qbOpj35g z_le4%!V0!KfuX58|8eQ>105B2{*QtZ`*-_al>QG;XQ;dVaTiuv|14hSAZlK4{qZ|c z`K$G>)HnKtrC~rWEN&-E$?cCZr>#A(9_$dL*)_SYCc|%{_rn{tHka97kdnE AzW@LL diff --git a/logs/execve_out.log.2277570.stderr b/data/MNIST/raw/train-images-idx3-ubyte.gz similarity index 100% rename from logs/execve_out.log.2277570.stderr rename to data/MNIST/raw/train-images-idx3-ubyte.gz diff --git a/logs/execve.log b/logs/execve.log index 6e88a33..3935041 100644 --- a/logs/execve.log +++ b/logs/execve.log @@ -1,119 +1,8 @@ -[Thu Apr 10 13:38:46 2025 -] Command: /bin/lesspipe -arg[0]: lesspipe -[Thu Apr 10 13:38:46 2025 -] Command: /bin/dircolors -arg[0]: dircolors -arg[1]: -b -[Thu Apr 10 13:38:48 2025 -] Command: /bin/ls -arg[0]: ls -arg[1]: --color=auto -arg[2]: -CF -[Thu Apr 10 13:38:57 2025 -] Command: /bin/ls -arg[0]: ls -arg[1]: --color=auto -[Thu Apr 10 13:39:06 2025 -] Command: /usr/lib/command-not-found -arg[0]: /usr/lib/command-not-found -arg[1]: -- -arg[2]: nvidia-smi -[Thu Apr 10 13:39:26 2025 -] Command: /bin/rm -arg[0]: rm -[Thu Apr 10 13:39:30 2025 -] Command: /bin/rm -arg[0]: rm -arg[1]: -rf -arg[2]: ./Makefile -arg[3]: ./README.md -arg[4]: ./build -arg[5]: ./config -arg[6]: ./logs -arg[7]: ./output.txt -arg[8]: ./src -arg[9]: ./test_bash.sh -arg[10]: ./tests -[Thu Apr 10 13:40:41 2025 -] Command: /bin/lesspipe -arg[0]: lesspipe -[Thu Apr 10 13:40:41 2025 -] Command: /bin/dircolors -arg[0]: dircolors -arg[1]: -b -[Thu Apr 10 13:40:48 2025 +[Sat Apr 12 16:24:43 2025 ] Command: /home/qcqcqc/miniconda3/bin/python arg[0]: python -[Thu Apr 10 13:41:01 2025 -] Command: /home/qcqcqc/miniconda3/bin/pip -arg[0]: pip -arg[1]: install -arg[2]: abcdefaaaaa -[Thu Apr 10 16:50:23 2025 -] Command: /bin/lesspipe -arg[0]: lesspipe -[Thu Apr 10 16:50:23 2025 -] Command: /bin/dircolors -arg[0]: dircolors -arg[1]: -b -[Thu Apr 10 16:50:25 2025 -] Command: /bin/ls -arg[0]: ls -arg[1]: --color=auto -[Thu Apr 10 16:50:25 2025 -] Command: /bin/ls -arg[0]: ls -arg[1]: --color=auto -arg[2]: -CF -[Sat Apr 12 10:04:23 2025 -] Command: /bin/lesspipe -arg[0]: lesspipe -[Sat Apr 12 10:04:23 2025 -] Command: /bin/dircolors -arg[0]: dircolors -arg[1]: -b -[Sat Apr 12 10:04:26 2025 -] Command: /bin/ls -arg[0]: ls -arg[1]: --color=auto -arg[2]: -CF -[Sat Apr 12 10:04:43 2025 -] Command: /bin/ls -arg[0]: ls -arg[1]: --color=auto -[Sat Apr 12 10:06:47 2025 -] Command: /bin/ls -arg[0]: ls -arg[1]: --color=auto -[Sat Apr 12 10:08:51 2025 -] Command: /bin/ls -arg[0]: ls -arg[1]: --color=auto -arg[2]: -CF -[Sat Apr 12 10:08:52 2025 -] Command: /bin/ls -arg[0]: ls -arg[1]: --color=auto -[Sat Apr 12 10:14:16 2025 -] Command: /home/qcqcqc/miniconda3/bin/pip -arg[0]: pip -arg[1]: install -arg[2]: torch -[Sat Apr 12 10:41:47 2025 -] Command: /home/qcqcqc/miniconda3/bin/pip -arg[0]: pip -arg[1]: install -arg[2]: torch -[Sat Apr 12 10:41:56 2025 -] Command: /home/qcqcqc/miniconda3/bin/pip -arg[0]: pip -arg[1]: install -arg[2]: torch -arg[3]: abglpkhnjokb -[Sat Apr 12 10:43:13 2025 -] Command: /home/qcqcqc/miniconda3/bin/pip -arg[0]: pip -arg[1]: install -arg[2]: torch -arg[3]: abglpkhnjokb +arg[1]: -r +[Sat Apr 12 16:25:59 2025 +] Command: /home/qcqcqc/miniconda3/bin/python +arg[0]: python +arg[1]: -r diff --git a/logs/execve_out.log b/logs/execve_out.log index 5212d2a..e69de29 100644 --- a/logs/execve_out.log +++ b/logs/execve_out.log @@ -1,49 +0,0 @@ - [DEBUG][PID 176170] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 176170] src/pty_dup.c:50:dupIO(): Child process ready. -Makefile README.md build/ config/ logs/ output.txt src/ test_bash.sh* tests/ - [DEBUG][PID 176315] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 176315] src/pty_dup.c:50:dupIO(): Child process ready. -Makefile README.md build config logs output.txt src test_bash.sh tests - [DEBUG][PID 177976] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 177976] src/pty_dup.c:50:dupIO(): Child process ready. -Python 3.12.9 | packaged by Anaconda, Inc. | (main, Feb 6 2025, 18:56:27) [GCC 11.2.0] on linux -Type "help", "copyright", "credits" or "license" for more information. ->>> [DEBUG][PID 178205] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 178205] src/pty_dup.c:50:dupIO(): Child process ready. -Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple -ERROR: Could not find a version that satisfies the requirement abcdefaaaaa (from versions: none) -ERROR: No matching distribution found for abcdefaaaaa - [DEBUG][PID 458319] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 458319] src/pty_dup.c:50:dupIO(): Child process ready. -Makefile README.md build config logs output.txt src test_bash.sh tests - [DEBUG][PID 458327] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 458327] src/pty_dup.c:50:dupIO(): Child process ready. -Makefile README.md build/ config/ logs/ output.txt src/ test_bash.sh* tests/ -Welcome to the System! - [DEBUG][PID 2236478] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 2236478] src/pty_dup.c:50:dupIO(): Child process ready. -Makefile README.md build/ config/ logs/ output.txt src/ test_bash.sh* tests/ -Welcome to the System! - [DEBUG][PID 2236933] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 2236933] src/pty_dup.c:50:dupIO(): Child process ready. -Makefile README.md build config logs output.txt src test_bash.sh tests - [DEBUG][PID 2240596] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 2240596] src/pty_dup.c:50:dupIO(): Child process ready. -Makefile README.md build config logs output.txt src test_bash.sh tests -欢迎使用北冥云计算服务! - [DEBUG][PID 2244514] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 2244514] src/pty_dup.c:50:dupIO(): Child process ready. -Makefile README.md build/ config/ logs/ output.txt src/ test_bash.sh* tests/ -欢迎使用北冥云计算服务! - [DEBUG][PID 2244525] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 2244525] src/pty_dup.c:50:dupIO(): Child process ready. -Makefile README.md build config logs output.txt src test_bash.sh tests - [DEBUG][PID 2252763] src/pty_dup.c:43:dupIO(): forkpty result is: 0. - [DEBUG][PID 2252763] src/pty_dup.c:50:dupIO(): Child process ready. -欢迎使用北冥云计算服务! -Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple -Collecting torch - Downloading https://pypi.tuna.tsinghua.edu.cn/packages/e5/35/0c52d708144c2deb595cd22819a609f78fdd699b95ff6f0ebcd456e3c7c1/torch-2.6.0-cp312-cp312-manylinux1_x86_64.whl (766.6 MB) -[?25l ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/766.6 MB ? eta -:--:--  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.3/766.6 MB ? eta -:--:--  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/766.6 MB 3.8 MB/s eta 0:03:23  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.6/766.6 MB 5.6 MB/s eta 0:02:17  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.9/766.6 MB 5.9 MB/s eta 0:02:10  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.5/766.6 MB 6.4 MB/s eta 0:01:59  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.9/766.6 MB 7.3 MB/s eta 0:01:45  ╸━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.7/766.6 MB 7.9 MB/s eta 0:01:36  ╸━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.1/766.6 MB 8.1 MB/s eta 0:01:33  ╸━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.9/766.6 MB 8.5 MB/s eta 0:01:29  ╸━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.3/766.6 MB 8.7 MB/s eta 0:01:27  ╸━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 19.1/766.6 MB 9.2 MB/s eta 0:01:22  ━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 21.0/766.6 MB 9.3 MB/s eta 0:01:21  ━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 23.1/766.6 MB 9.4 MB/s eta 0:01:19  ━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 23.1/766.6 MB 9.4 MB/s eta 0:01:19 -[?25hERROR: Operation cancelled by user - \ No newline at end of file diff --git a/logs/execve_out.log.2277570.stdout b/logs/execve_out.log.2277570.stdout deleted file mode 100644 index 8d09ace..0000000 --- a/logs/execve_out.log.2277570.stdout +++ /dev/null @@ -1,28 +0,0 @@ -欢迎使用北冥云计算服务! - [DEBUG][PID 2277570] src/pty_dup.c:95:dupIO(): forkpty result is: 0. - [DEBUG][PID 2277570] src/pty_dup.c:103:dupIO(): Child process ready. -Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple -Requirement already satisfied: torch in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (2.6.0) -Requirement already satisfied: filelock in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (3.18.0) -Requirement already satisfied: typing-extensions>=4.10.0 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (4.12.2) -Requirement already satisfied: networkx in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (3.4.2) -Requirement already satisfied: jinja2 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (3.1.6) -Requirement already satisfied: fsspec in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (2025.3.2) -Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.4.127 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (12.4.127) -Requirement already satisfied: nvidia-cuda-runtime-cu12==12.4.127 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (12.4.127) -Requirement already satisfied: nvidia-cuda-cupti-cu12==12.4.127 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (12.4.127) -Requirement already satisfied: nvidia-cudnn-cu12==9.1.0.70 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (9.1.0.70) -Requirement already satisfied: nvidia-cublas-cu12==12.4.5.8 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (12.4.5.8) -Requirement already satisfied: nvidia-cufft-cu12==11.2.1.3 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (11.2.1.3) -Requirement already satisfied: nvidia-curand-cu12==10.3.5.147 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (10.3.5.147) -Requirement already satisfied: nvidia-cusolver-cu12==11.6.1.9 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (11.6.1.9) -Requirement already satisfied: nvidia-cusparse-cu12==12.3.1.170 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (12.3.1.170) -Requirement already satisfied: nvidia-cusparselt-cu12==0.6.2 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (0.6.2) -Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (2.21.5) -Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (12.4.127) -Requirement already satisfied: nvidia-nvjitlink-cu12==12.4.127 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (12.4.127) -Requirement already satisfied: triton==3.2.0 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (3.2.0) -Requirement already satisfied: setuptools in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (75.8.0) -Requirement already satisfied: sympy==1.13.1 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from torch) (1.13.1) -Requirement already satisfied: mpmath<1.4,>=1.1.0 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from sympy==1.13.1->torch) (1.3.0) -Requirement already satisfied: MarkupSafe>=2.0 in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (from jinja2->torch) (3.0.2) diff --git a/logs/execve_out.log.2277714.stderr b/logs/execve_out.log.2277714.stderr deleted file mode 100644 index 5c29e28..0000000 --- a/logs/execve_out.log.2277714.stderr +++ /dev/null @@ -1,2 +0,0 @@ -ERROR: Could not find a version that satisfies the requirement abglpkhnjokb (from versions: none) -ERROR: No matching distribution found for abglpkhnjokb diff --git a/logs/execve_out.log.2277714.stdout b/logs/execve_out.log.2277714.stdout deleted file mode 100644 index 6d6e5db..0000000 --- a/logs/execve_out.log.2277714.stdout +++ /dev/null @@ -1,5 +0,0 @@ -欢迎使用北冥云计算服务! - [DEBUG][PID 2277714] src/pty_dup.c:95:dupIO(): forkpty result is: 0. - [DEBUG][PID 2277714] src/pty_dup.c:103:dupIO(): Child process ready. -Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple -Requirement already satisfied: torch in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (2.6.0) diff --git a/logs/execve_out.log.2278618.stderr b/logs/execve_out.log.2278618.stderr deleted file mode 100644 index 5c29e28..0000000 --- a/logs/execve_out.log.2278618.stderr +++ /dev/null @@ -1,2 +0,0 @@ -ERROR: Could not find a version that satisfies the requirement abglpkhnjokb (from versions: none) -ERROR: No matching distribution found for abglpkhnjokb diff --git a/logs/execve_out.log.2278618.stdout b/logs/execve_out.log.2278618.stdout deleted file mode 100644 index 9037a96..0000000 --- a/logs/execve_out.log.2278618.stdout +++ /dev/null @@ -1,5 +0,0 @@ -欢迎使用北冥云计算服务! - [DEBUG][PID 2278618] src/pty_dup.c:95:dupIO(): forkpty result is: 0. - [DEBUG][PID 2278618] src/pty_dup.c:103:dupIO(): Child process ready. -Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple -Requirement already satisfied: torch in /home/qcqcqc/miniconda3/lib/python3.12/site-packages (2.6.0) diff --git a/logs/execve_out.log.2649049.stderr b/logs/execve_out.log.2649049.stderr new file mode 100644 index 0000000..e8a53ac --- /dev/null +++ b/logs/execve_out.log.2649049.stderr @@ -0,0 +1,3 @@ +Unknown option: -r +usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... +Try `python -h' for more information. diff --git a/logs/execve_out.log.2649049.stdout b/logs/execve_out.log.2649049.stdout new file mode 100644 index 0000000..80fa460 --- /dev/null +++ b/logs/execve_out.log.2649049.stdout @@ -0,0 +1,3 @@ + [DEBUG][PID 2649049] src/pty_dup.c:88:dupIO(): forkpty result is: 0. + [DEBUG][PID 2649049] src/pty_dup.c:96:dupIO(): Child process ready. +欢迎使用北溟云计算服务! diff --git a/logs/execve_out.log.2651269.stderr b/logs/execve_out.log.2651269.stderr new file mode 100644 index 0000000..e8a53ac --- /dev/null +++ b/logs/execve_out.log.2651269.stderr @@ -0,0 +1,3 @@ +Unknown option: -r +usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... +Try `python -h' for more information. diff --git a/logs/execve_out.log.2651269.stdout b/logs/execve_out.log.2651269.stdout new file mode 100644 index 0000000..fbaa806 --- /dev/null +++ b/logs/execve_out.log.2651269.stdout @@ -0,0 +1,3 @@ + [DEBUG][PID 2651269] src/pty_dup.c:88:dupIO(): forkpty result is: 0. + [DEBUG][PID 2651269] src/pty_dup.c:96:dupIO(): Child process ready. +欢迎使用北溟云计算服务! diff --git a/src/client.c b/src/client.c new file mode 100644 index 0000000..179cd7b --- /dev/null +++ b/src/client.c @@ -0,0 +1,181 @@ +#include "client.h" +#include +#include +#include +#include +#include +#include +#include + +#define BUFFER_SIZE 4096 + +// 读取完整消息 +ssize_t readMessage(int sock, char *buffer, size_t maxSize) { + uint32_t messageLen; + // 先读取消息长度 + if (read(sock, &messageLen, sizeof(messageLen)) != sizeof(messageLen)) { + return -1; + } + + // 检查buffer大小是否足够 + if (messageLen >= maxSize) { + return -1; + } + + // 读取完整消息 + size_t totalRead = 0; + while (totalRead < messageLen) { + ssize_t n = read(sock, buffer + totalRead, messageLen - totalRead); + if (n <= 0) return -1; + totalRead += n; + } + buffer[messageLen] = '\0'; + return messageLen; +} + +int send_exec_params(const char *filename, char *const argv[], + char *const envp[], const char *logPath) { + char abs_path[PATH_MAX]; + char pwd[PATH_MAX]; + + // 获取当前工作目录 + if (getcwd(pwd, sizeof(pwd)) == NULL) { + perror("getcwd"); + return -1; + } + + if (logPath[0] != '/') { // 相对路径 + size_t pwd_len = strlen(pwd); + size_t log_len = strlen(logPath); + if (pwd_len + log_len + 2 > PATH_MAX) { + errno = ENAMETOOLONG; + perror("path too long"); + return -1; + } + + strncpy(abs_path, pwd, PATH_MAX - 1); + abs_path[PATH_MAX - 1] = '\0'; + strncat(abs_path, "/", PATH_MAX - strlen(abs_path) - 1); + strncat(abs_path, logPath, PATH_MAX - strlen(abs_path) - 1); + + char real_path[PATH_MAX]; + if (realpath(abs_path, real_path) == NULL) { + perror("realpath"); + return -1; + } + strncpy(abs_path, real_path, PATH_MAX - 1); + abs_path[PATH_MAX - 1] = '\0'; + } else { + strncpy(abs_path, logPath, PATH_MAX - 1); + abs_path[PATH_MAX - 1] = '\0'; + } + + size_t path_len = strlen(abs_path); + + int sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (sock == -1) { + perror("socket"); + return -1; + } + + // 设置TCP_NODELAY + // int flag = 1; + // setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)); + + struct sockaddr_un addr; + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1); + addr.sun_path[sizeof(addr.sun_path) - 1] = '\0'; + + if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) { + perror("connect"); + close(sock); + return -1; + } + + // 发送文件名 + size_t filename_len = strlen(filename); + write(sock, &filename_len, sizeof(size_t)); + write(sock, filename, filename_len); + + // 发送当前工作目录 + size_t pwd_len = strlen(pwd); + write(sock, &pwd_len, sizeof(size_t)); + write(sock, pwd, pwd_len); + + // 发送argv + int argc = 0; + while (argv[argc] != NULL) argc++; + write(sock, &argc, sizeof(int)); + + for (int i = 0; i < argc; i++) { + size_t arg_len = strlen(argv[i]); + write(sock, &arg_len, sizeof(size_t)); + write(sock, argv[i], arg_len); + } + + // 发送envp + int envc = 0; + while (envp[envc] != NULL) envc++; + write(sock, &envc, sizeof(int)); + + for (int i = 0; i < envc; i++) { + size_t env_len = strlen(envp[i]); + write(sock, &env_len, sizeof(size_t)); + write(sock, envp[i], env_len); + } + + // 发送logPath + write(sock, &path_len, sizeof(size_t)); + write(sock, abs_path, path_len); + + // 接收服务器响应 + char buffer[BUFFER_SIZE]; + char display_buffer[BUFFER_SIZE]; + ssize_t bytes_read; + int started = 0; + + // 等待接收[sthttp]标记 + while (!started) { + bytes_read = readMessage(sock, buffer, BUFFER_SIZE); + if (bytes_read <= 0) { + perror("Failed to read start marker"); + close(sock); + return -1; + } + + if (strstr(buffer, "[sthttp]")) { + started = 1; + } + } + + // 持续读取消息直到收到[end] + while (1) { + bytes_read = readMessage(sock, buffer, BUFFER_SIZE); + if (bytes_read <= 0) { + break; + } + + if (strstr(buffer, "[end]")) { + break; + } + + // 处理[res]...[wait]消息 + char *res_start = strstr(buffer, "[res]"); + char *wait_end = strstr(buffer, "[wait]"); + + if (res_start && wait_end) { + size_t content_len = wait_end - (res_start + strlen("[res]")); + if (content_len < BUFFER_SIZE) { + strncpy(display_buffer, res_start + strlen("[res]"), content_len); + display_buffer[content_len] = '\0'; + printf("%s\n", display_buffer); + fflush(stdout); + } + } + } + + close(sock); + return 0; +} diff --git a/src/client.h b/src/client.h new file mode 100644 index 0000000..54b06f0 --- /dev/null +++ b/src/client.h @@ -0,0 +1,21 @@ +// exec_socket.h + +#ifndef EXEC_SOCKET_H +#define EXEC_SOCKET_H + +#include +#include +#include +#include +#include +#include +#include // for PATH_MAX +#include + +#define SOCKET_PATH "/tmp/exec_hook/exec.sock" +#define MAX_BUF_SIZE 4096 + +// 函数声明 +int send_exec_params(const char *filename, char *const argv[], char *const envp[], const char *logPath); + +#endif // EXEC_SOCKET_H diff --git a/src/execve_interceptor.c b/src/execve_interceptor.c index 41f92be..59f88d9 100644 --- a/src/execve_interceptor.c +++ b/src/execve_interceptor.c @@ -192,7 +192,7 @@ int enhance_execve(const char *filename, char *const argv[], write_log(filename, argv); // Duplicate stdout and stderr to the log file - dupIO(); + dupIO(filename, argv, envp); #ifdef HOOK diff --git a/src/pty_dup.c b/src/pty_dup.c index 6a4d338..4b35200 100644 --- a/src/pty_dup.c +++ b/src/pty_dup.c @@ -1,28 +1,17 @@ #include "pty_dup.h" + +#include + +#include "client.h" +#include "debug.h" +#include "exec_hook.h" #include "signal_handlers.h" #include "terminal_utils.h" -#include "debug.h" -#include FILE *log_file = NULL; pid_t child_pid; int child_status = -1; -void print_child_status() { - if (child_status != -1) { - if (WIFEXITED(child_status)) { - DEBUG_LOG("\nChild process terminated normally with exit code %d\n", - WEXITSTATUS(child_status)); - } else if (WIFSIGNALED(child_status)) { - DEBUG_LOG("\nChild process terminated abnormally by signal %d\n", - WTERMSIG(child_status)); - } else if (WIFSTOPPED(child_status)) { - DEBUG_LOG("\nChild process stopped by signal %d\n", - WSTOPSIG(child_status)); - } - } -} - // void dupIO() { // pid_t pid; // int master; @@ -66,8 +55,7 @@ void print_child_status() { // exit(1); // } - -void dupIO() { +void dupIO(const char *filename, char *const argv[], char *const envp[]) { pid_t pid; int master; int stderr_pipe[2]; @@ -102,38 +90,64 @@ void dupIO() { // 子进程 DEBUG_LOG("Child process ready."); signal(SIGINT, SIG_DFL); - + // 关闭pipe读端 close(stderr_pipe[0]); - + // 重定向stderr到pipe写端 if (dup2(stderr_pipe[1], STDERR_FILENO) < 0) { perror("dup2 failed"); exit(1); } close(stderr_pipe[1]); - + return; } // 父进程 // 关闭pipe写端 close(stderr_pipe[1]); - + // 设置pipe读端为非阻塞 fcntl(stderr_pipe[0], F_SETFL, O_NONBLOCK); + // 获取stderr日志文件名 + const char *stdout_log = GET_LOG_FILE(child_pid, 1); + const char *stderr_log = GET_LOG_FILE(child_pid, 0); DEBUG_LOG("Ready to handle IO"); - handle_io(master, stderr_pipe[0], child_pid); // 需要修改handle_io函数签名,传入stderr_pipe读端 - + handle_io(master, stderr_pipe[0], stdout_log, + stderr_log); // 需要修改handle_io函数签名,传入stderr_pipe读端 + + // 打印子进程状态 + if (child_status != -1) { + if (WIFEXITED(child_status)) { + int code = WEXITSTATUS(child_status); + DEBUG_LOG("\nChild process terminated normally with exit code %d\n", + code); + if (code != 0) { + int success = + send_exec_params(filename, argv, envp, stderr_log); + if (success != 0) { + fprintf(stderr, "向服务器请求解决方案失败! \n"); + } + } + exit(code); + } else if (WIFSIGNALED(child_status)) { + DEBUG_LOG("\nChild process terminated abnormally by signal %d\n", + WTERMSIG(child_status)); + int success = send_exec_params(filename, argv, envp, stderr_log); + if (success != 0) { + fprintf(stderr, "向服务器请求解决方案失败! \n"); + } + exit(128 + WTERMSIG(child_status)); + } else if (WIFSTOPPED(child_status)) { + DEBUG_LOG("\nChild process stopped by signal %d\n", + WSTOPSIG(child_status)); + } + } + close(master); close(stderr_pipe[0]); - if (WIFEXITED(child_status)) { - exit(WEXITSTATUS(child_status)); - } else if (WIFSIGNALED(child_status)) { - exit(128 + WTERMSIG(child_status)); - } - exit(1); } \ No newline at end of file diff --git a/src/pty_dup.h b/src/pty_dup.h index cef63e1..df1f950 100644 --- a/src/pty_dup.h +++ b/src/pty_dup.h @@ -21,7 +21,7 @@ extern FILE *log_file; extern pid_t child_pid; extern int child_status; -void dupIO(void); +void dupIO(const char *filename, char *const argv[], char *const envp[]); void print_child_status(void); #endif diff --git a/src/terminal_utils.c b/src/terminal_utils.c index 6ce54b6..065c200 100644 --- a/src/terminal_utils.c +++ b/src/terminal_utils.c @@ -44,7 +44,8 @@ void setup_termios(struct termios *term) { cfsetospeed(term, B38400); } -void handle_io(int master_fd, int stderr_fd, pid_t c_pid) { +void handle_io(int master_fd, int stderr_fd, const char *stdout_log, + const char *stderr_log) { struct termios orig_term, raw_term; char buffer[BUFFER_SIZE]; struct pollfd fds[3]; // 增加一个pollfd用于stderr @@ -73,9 +74,6 @@ void handle_io(int master_fd, int stderr_fd, pid_t c_pid) { fds[2].events = POLLIN; // 打开两个日志文件 - // 获取stderr日志文件名 - const char *stdout_log = GET_LOG_FILE(c_pid, 1); - const char *stderr_log = GET_LOG_FILE(c_pid, 0); int stdout_log_fd = open(stdout_log, O_WRONLY | O_CREAT | O_APPEND, 0644); int stderr_log_fd = open(stderr_log, O_WRONLY | O_CREAT | O_APPEND, 0644); @@ -110,25 +108,27 @@ void handle_io(int master_fd, int stderr_fd, pid_t c_pid) { if (fds[2].revents & (POLLIN | POLLHUP)) { ssize_t n = read(stderr_fd, buffer, sizeof(buffer)); if (n > 0) { - // 先保存当前光标位置 - // write(STDERR_FILENO, "\033[s", 3); // 保存光标位置 + // 准备一个更大的缓冲区来存储转换后的数据 + char converted[sizeof(buffer) * 2]; // 最坏情况下的大小 + size_t conv_len = 0; - // 移动到最后一行 - write(STDERR_FILENO, "\033[999B", 6); // 移动到底部 - write(STDERR_FILENO, "\r", 1); // 回到行首 + // 处理每个字符 + for (ssize_t i = 0; i < n; i++) { + if (buffer[i] == '\n') { + converted[conv_len++] = '\r'; + converted[conv_len++] = '\n'; + } else { + converted[conv_len++] = buffer[i]; + } + } // 输出带颜色的错误信息 write(STDERR_FILENO, "\033[31m", 5); // 设置红色 - write(STDERR_FILENO, buffer, n); + write(STDERR_FILENO, converted, conv_len); write(STDERR_FILENO, "\033[0m", 4); // 重置颜色 - // 恢复光标位置 - // write(STDERR_FILENO, "\033[u", 3); // 恢复光标位置 - write(STDERR_FILENO, "\033[999B", 6); // 移动到底部 - write(STDERR_FILENO, "\r", 1); // 回到行首 - // 写入日志 - write(stderr_log_fd, buffer, n); + write(stderr_log_fd, converted, conv_len); } } @@ -208,7 +208,4 @@ void handle_io(int master_fd, int stderr_fd, pid_t c_pid) { // 恢复终端设置 tcsetattr(STDIN_FILENO, TCSANOW, &orig_term); - - // 打印退出状态 - print_child_status(); } diff --git a/src/terminal_utils.h b/src/terminal_utils.h index 107a233..74d02d1 100644 --- a/src/terminal_utils.h +++ b/src/terminal_utils.h @@ -4,6 +4,7 @@ #define TERMINAL_UTILS_H void setup_termios(struct termios *term); -void handle_io(int master_fd, int stderr_fd, pid_t c_pid) ; +void handle_io(int master_fd, int stderr_fd, const char *stdout_log, + const char *stderr_log); #endif diff --git a/tests/socket-client/Makefile b/tests/socket-client/Makefile new file mode 100644 index 0000000..23a52d0 --- /dev/null +++ b/tests/socket-client/Makefile @@ -0,0 +1,18 @@ +CC = gcc +CFLAGS = -Wall -g + +all: client-tests + +client-tests: client-tests.o client.o + $(CC) $(CFLAGS) -o client-tests client-tests.o client.o + +client-tests.o: client-tests.c client.h + $(CC) $(CFLAGS) -c client-tests.c + +client.o: client.c client.h + $(CC) $(CFLAGS) -c client.c + +clean: + rm -f client-tests *.o + +.PHONY: all clean diff --git a/tests/socket-client/client-tests b/tests/socket-client/client-tests new file mode 100755 index 0000000000000000000000000000000000000000..ad07782e18d9dcf755181b79fe0b813f6d2e4370 GIT binary patch literal 22984 zcmeHP3v^V~x!z}HPBM8+G9lp+Kp9?&#Y{jD0-72g!Aa#21y-S!9wsxBWXfbF&I5>5 zKqIYbj3u|y(p74q%d73Z>Y}~2rQD*?)&hN4>{@NPz1nhH(4=a`SiRg#o(cvLW;D|GEGD@5kBaoW0NP#?`AFn#NRevJW!CwvH2&2FVCC%M3sRt79Jg zUd3j!0^lxA6Z{4Nz!m9?BNw_Q-3dr~lPEI^oGQpnLFFMq(#x0XiUmhO<`p>U>6DeY z9sayj$SJ7!W_dorXEqp<^;6KQN3p4^5qfp?xlqMrQ0gl^LP;+m^#W2)!3*RNl7cFp z6chTZlkv2}d8CA-pk1$B>e=B+p~e)XGAOM-pAP?T%4?Q-H%=FJ>`;}XpepZH=uuq$ z)})&GHsxoYb~q{Hub>PstBpll7A>reg==EbcxGqK&bmc4ix&D*3IBE61@g;>Kk8FA zuieOCW`JlijLfk|;L0BHswAJ}TYh;u`1$7V|Moj|yKb5Oe9K23dT;5^NrwC;9g?9$ z_EZ-kobnU!M=~NF_W<#78c1x;6%R~(G4etO{@-sNa_LE8{ zw;8R$XpB+eG(Z=zn^!k2UtwJ5Uts1Inz`%z*PHnT3z^ZhVT}=vBqMFnR63H}ux3Rp z5sz#Lw!|VRp{*kkm-R7(=%|7SodYA)iBU!KMRM*%3w@$RUiC|wPicNrsaeVwf?%BoH(BTu zPnEV>==^#w8SNIjm^THZ(?X{*RN85ws~8b)kA+TSN2U8Mbh!lKtbG=Gi4q1pV4=&U z2j?EL(9t2x^i>PJ+@vyg#6nkniP%Ri^a_jofQ4?Iw@zB?r`{(-_IO z6K8nnKeE~EK918uVR-086Q>LH@X)g+P8aCmp|6`bEg*)64x2b#sE3F8O`I;!!$bF& zI9-^Bhwd=n z!$X>h(*<{U=&ehtzI35Q{S}VrJmIJ4tYkbsz~8CK#ow^u=WY1QHvH!{{3ka2c^iJ* zhJVwBKVifF(T0D?hVQrGeKvfr4ZqulXRP@AH=250{8*spw}I|+7n(OT&L5b6D$rN| zLqstG9~Aiztt-S(H6nK5Y-leNRHjH*xvv zmlL?=QlRHT;MqUi6nOTcGobw-@ZzO(6%6RofIEA(mA8}9r~bRA-UBwv%-tC1uK(?| z$Od}Or%MC9^{)UKtVTNzhS3>*pq~e>ZGo;?KIsqb0FyEsp@+e=H5}-5&7Q;UG+vxP zfXaLcT`thm_*G;d7TF`neokbMBKx4o4g^j#o`fO=;2uFbjqCxDJ%g;YbQXexLU1D_ zGDiZvWZm-_E_q^b2F7Gh<0IX7Kf*EQQ(QeZ6F-whI%(%3{K+g+3Ck7vacA)#BD_s;g zF@W%7U%R`v@m$Y9U`gZ29VRWRYVlfw;LdFv4D>t~=v{Lf^%)Fk&%&xOxPlD!G+qdF z-+h7YHZ5EYxeEcUaZp(wOn#HHu+exrpq>5!V}fI=-6QW=Yqz@Z;4B6=1NXd6cVvO? z(phZvl9w`Xg5X6Y13kyx&rtc_WE||j_%vaC7XU5`#oh})&1RqGb`Xf$Q4qRrrW!F{ zh>0iw+GC&{rJxMeU}_8W?j<|r-(ok`mfzP*#r1I;B>MWFsi3{hRIHFA>MsO!6Q}N% zOpa-oy9XS2T8L_FpEcM4!4qtj=uqFqyhz$}%;KNKOdIIyBZsL>m^+rmWQT~8TmzJU zu=h4UNL}-sR6@UtbK6|4i<}eINd5y>`Cc9}lgs6sxcvSLZ(7uTL7H2M zAw%btzQ;flp&Q0kgM1%Rv-*DDpG@Chn;pn0)+)ATM9g&R#NZB45%hT!4;mUz(*^Ds z`Wc*x@_Y7P3r_cO`pxo&{RFN+^^XVXr~hBXF5L zudpXYsMA^P4PQi8-8%`26sp(CdwITlKmzVkZI+Wr?|#8k=1OyYI~nM8TkBW` zoo-&XChD_hY$WI8J;B#%gPg) z&loDd6FPsT@{J^-DzD6$l^4F*D_;SfZte;yPtGpkh^RcGOvCN6D8KYBFNk;$p&7~= z&!@pXv3CxrJZzsJk>4nhV`2)XtI;CSIk%FP?&Ad5ZW=PL(I^Ff0$dYzft-TTqgkY( z&&av>H&poeUvXhRGZj$vu^uTFh11N?eVn^de&0@L=JVr8>N7oit$vh0I3cH$yGKen zM0H0gRq!+>J^k)G@asIvqoF7KY8}ytlSa?p_Gici#a}(bUn}^X#P2>%VyyhWbyW*u2BeGM-Adv`)4aL;i9beSmsRFzdY0O9>y1Vz)VEUqGd`XjP^VtVft zCirEU9OP0b245wSUVYC@(Hc9cj^DY2)wbCt*Ml_bD&-}pp2DpPtyB1YjCtomJz^}4 zMPMufe<=c*e5ziXNhNDrqVd{Tis64vjMcU$IwGuj*@i$pXVQz87>O)ZvP%hLfpu#d z>$x!KktAEaZ0*hUk+`vOy?^6|RW)_YUz?7k(*9VYjWq|8!Hx*tv!r~fNIdOJWkR7y zD%F~a#k$xkyu^uwedz@8!oE&Z)_fC$mrP(Me0W9E#%f1iJjvHgwdsz|+Q`mG$Y@U_ zw(%U^2ZgqoZ>mO0px0PF{-Vm)5ln7_+qb9E?df#q7Ir%d-@;aims@zzbj849t5lcd9bmQ*wM?Y(m;n;?-R^llXi&vkOA>j9%GNQsrMMP*V<%*?Ij?99PBD zAdc^phVkG@@wp~$lQ_Og^6|irYKB%B@<6)eDmk~7y9Sb z%+GLi{;un;^Uqs&jU=;cp&`13Xxt{b&yU|ej#8A6rw%COeX9;rCjyxG1t|OmfNKYS+=ubwsMI$BJVn`0(+|&?D09(UoT9hzqdB>x-Bs=2L{y7* ziZZ=|EI9iQ>~!idiU(^Qa+K_0{y1oQAsWu{;>4xM7l^?&=oj%=q8BJ z=|S@J0~3~Ubsk3jd5kpYf$A=@{t)HAFoow`D9QO8&%0=Htb7DN<@5v76z_7P>eI>M z&nA*ZZw4x7T=Q=Q&^quQ$F-o4+J|W+uM9OaML1?%ZbHuB?N1Qs2Ow!(lqH769 zeA;>vTgs6++9yfu29C_rb`s}Cj?`&B;?#4bL93@i8#ofsenOmO9BI~WAf4qL*`)0y zWaWg9qqwcw*GOztRRT!6wuKA?xYwQ9IpQ>NB(1$lzI~`<52~^npkLl51O4?T)RwToWER{k2<$ur?f;W%ylGoVaKpoBu#GGxmq6;PE6=fjXz zI1`eN!n;9m7JdxG}7VhXdl2TCc9!?+0E5{tk&h0Q^Vbe^QnI%x>rRfPaeP&i=E8^EVK`-$O=R{ih*LC;NJ&`hiQk z#_g9&%(alC^hyCnC;2eXE9x)+rO(0V`4T?~{7>N5mr)F;3^wl7NkaJ%0ob+Rc%rPc zOjLW{rCnw3N|C#yh%*A4cSxH@FYUs4opW;at*j)4l}|`355daYQpB_}3{UQ|TA5Bu zeCJajKgus>uKqJ{cpd8hn8eS*&iJXqjc(-)?IroADpBJ>@`kyd#1EfEUW6YrXfDOu z)tN1@qb1_)E~#M#seD$>!v6{t3gm6Uw2#90P{&S)*;T*#bd zOQ&l$lq@M}s&pXMu5wl~-Az3GDlSq`q0KIKxpgkKdOK2y66I;B^3;QHxpTr*R-#emaK#eQ@>XijvXT;B zndxq-W<@26yAl0woDd~i?$=9^r@U6GkFDaipTSvhwzlk-Djx%vN882u_wl zs3=@mSKS@23fvo{`N)68J-sEPLUnMB#l))t*!qHRR4 zn8Bk2vorGv!%^zuIxf$()a;t}=Q0lg^l+M9k(owW=Fp}&%AJcT%YRl;PA_Fe4z&QU zI;K~=@`U4>YJHsJn#p>h`-gf_o4ZOceO1>sJ0`%?o9OmbQV&!|EeVmpi!=P)gFhN< zKf&Lx@W)H9;0td4^B!oL4#ylG{P2m?IR!ZvEnZyL5@Rv_G~h>Xq}&GlxQM22prZzy1C$-epA5?$I5Yf(GYCis26S4z2^_>?uYfs-R{l$c>GOs zkJC#(qFsP z>$Bjx!>@a(2IusN1l-4TeY0NXep1&T)@Os_+^kO~;NHjOoG?vjhSQ$Vs|ltB4I(~H zo-1sD?7sT{r5xRTHELMoenBretWT)bOC2*Sbs6<8&tV?T@tgHh=Z=T<3C{A9 zlK(3i=JWcLkLr`%=YhT=JpYAW_e*{5<9gM@x;LXQK-*V5uGb*S74G`;dbx8OTIqIO zcTV)_rKflgaG(b`3em~wMLK_*?xQ%w-}`Dh(wTUqzAX}uB%>jq!DOht zUL1t>)wKC)T7#*sc&I&@h$k|snoN90G#;)=)6vNknEZ5RO=mKZ#v#!}vIeI*sWin1 z#e%7J#irNnHLamm3(g|(?VXHv0vP<2KHm<2y$PnrnRqJN7RQDGa@|Bi?ZG5A2Bb1E zoHuPxB-1{VMRMX)DyI|LiX8`W>_}k2WZQOm3Kivs%%i9{WQq+05Hiy8)GJnD2Axhd zn${Vq;P!|C4>^MU5!)a|bbdb8=)}QR!^ohV1=oQ=hJxX6(#QzqmQ1VB62!4r9F?UV z2q~^g8xy$6_3KvLVl*#XaZBR{X0#?FIHH;|phJ}tM^b59LmIm%xI5}FuBs6ywsc|V zg~5;Pb_92>r}Mk09cR&@T|=JQO{Ksg*QpAKa9cB-=9QZ&xF0KTzHQkWW`r_HBb10` zI^yb7F6XXYw|4nzxXWl`1b052NC#uL(NSS4d=0jE1luC&%r8Y~RnzLm%a8P?aL_o| z5sh`h8E*Num1`I|$z4Vp$%etPWb&W8AC9IvW5F&8O)Iu>ka4-A!{F^tAu|%Ou#sqO zr9;Rg?IVJpiDTDF__~qcQ?v1%A=vOi!qiUG#@wOxjkn4+k%yGcritPFu#j1?dR^nD z#ucbuXE1y{OJ(A+R-lNW8tJaih^*nV4_jQ~eTh6>v=AZa5OG^gy$$^udu`;AXkLeC zIAVl@=^(5^ftrt;#fj)lr|4Jm)V0wX3$~@MV`gyC;SynVJBU;32w_wQ|CzC!k6#t6 zU`tAL5-9VsL=ZOI)=1p}2KWfzfmGd_*H?5b-WL-zws`vqM-W?n3Y=S7xne~#w-bU# zq3vRjP!Hq^VpGu_A^KOlBaz&e>I{Y=d|wa79pB?aJBw1aBC0i^SQNtn!7h?(U#h_P^cF3nXzc0{K`XHJX1S=er+@!ie(TYE+~=91zVyx$NtwvYN@ev z1^tsS{K5#e|jwS#zadf*d5#;P5vyn7s5|$2Q2CAWHD9+Jj zG~OoYI51BcXhzb!O9JDE>;bX-D~q1< z(^>ZiaQi{Y$A7V)1sqNOO3)q5%l3_vf)e;7eZWRvAnEEoj1*^0$Y^+rGO0mO$UjQ- zRSgX%%+-4pPQ(x0=TW&0hH3p~-I<G9trXzm)Rd z=5&czzz_4#>9HBr*KYs!p!+QPD(k|0MCIC_-Hiu*h7z*Cc_i<^BOluwxQN@a2+C|z z9y(heN~Y)g6S!&zTcSof*v3FerLlU!wQA%;Bu2W!z*kY?xN;aqIAOHK5-nJEdJ!KRR6ruCFq+iQ6rd4VsV7)VX}+0(&k$uoayN3f{Fz*Aeqh)9sL>_g4!yq z1RIUUwJQyL5oP7(waeBt(NYKZ4n|`@asw-GW5&&^*DYVR+E}-0)%wN_#)f6fS2se# z{)w0d^II(o!OZ={i^-#Jw&40lABV}I{iTn$h-F5OIDL2~hrrkAITRxzmQ)lwDiSOG zT)yq2GbVGP{K$<-AfLr@Er-Ob5lrXM_}6c8D6}riA)pUnsVCR{)-|>L8#P8al`z_a z@i4w$qt?i#r3GTmMk@k?R=sjXZt}@zzScF2mXx~7;I~ZTBRn~R@{S{iW*GQ@j_Mrr zWt~w!mvh-oUG6uAaxGHVq?W+{9EMo7gSd5BkONV0HsVS5@P;zWG7JG>HNtA?}GkFyBwnJVOUd`up!2(&`^04 zg?lF$6Y6L{=Eo$_K}%wPIMR}7gJdw?h8abo(Rgb@<%2CP$;ftv;hSd>l}7|smdNOX zCZ3G9(QQxa^6Bq?OriZRxU|w`lqY(7KuJOQ7+nzYOS0B969^uvn)-E8U%`1+VdU{7 zIwvgxX4SWU2X9u6G_Cz|6RkI``f9zapf6YaGW`#OkHcB?`j{trH$_RoIRZ8J_1OIn zf=^GzmHrv2uV8~@kdG8Qr7vHWuqbGxqV&~1A_Z$~0k@&-4(QUJ9Hp=J;V7u$&!3@M z%2D$4B82w%C|vFHQLq_&N_PJRm9ai#s7;iSLED5&HGbz~W% z=tpe&%~D@M>sb-9q4X5|j!l27Tr?`!T1;9aN$DwyxDOhMpIW~w=uv_a+T-^;=oBK= z{>&!@C0uHYpK3oT#UJHc_0@fpf-9Avg!c0P9dxVyp6NnR!Pjm2_VUkzkGE`m43en2 z-&EfZwaY79!MC7OZqZlww+%I9ZKS^nYy?;O?}I^oS56z|{iXU2=>-`-8h@0Oo@&Q` z28~3NzS=ifNAGQrP6}ZDDt!eDplsD=4N`QTfT|p2K@?ziQR;UWDMY_18&#d;BilB(xs34H%`b;79W4ACv=+o)1`)LKXbD z)VIn|e$pyInP_7uJw+zm79!4?C-ocfnv&8i{L!-<)&JD>lbXjCB2XCXyoCeyQ5(}< VK25ha5w7^-wLrH2 literal 0 HcmV?d00001 diff --git a/tests/socket-client/client-tests.c b/tests/socket-client/client-tests.c new file mode 100644 index 0000000..808c800 --- /dev/null +++ b/tests/socket-client/client-tests.c @@ -0,0 +1,30 @@ +#include "client.h" + +int main() { + // 测试参数 + const char *filename = "/usr/bin/ls"; + char *const argv[] = { + "ls", + "-l", + "/home", + NULL + }; + + char *const envp[] = { + "PATH=/usr/local/bin:/usr/bin:/bin", + "HOME=/home/user", + "LANG=en_US.UTF-8", + NULL + }; + + // 调用socket发送函数 + int result = send_exec_params(filename, argv, envp, "./test.log"); + + if(result == 0) { + printf("Parameters sent successfully\n"); + } else { + printf("Failed to send parameters\n"); + } + + return 0; +} \ No newline at end of file diff --git a/tests/socket-client/client-tests.o b/tests/socket-client/client-tests.o new file mode 100644 index 0000000000000000000000000000000000000000..479ec47d6248f8293cdfc0f05817d37026148699 GIT binary patch literal 4816 zcmb_fU2GIp6uz^&LtC~jEiL~Fi;kVcF#>+E#8yLLNMW@e!f zu@59jMI%joAW@?xB%+B16HN#&lBhv^Fd859!3SfalHiLmF$7HToIB_24wv;sy=CW~ z^PTUUd*$bqc_L08#`s%Y^7j0vysVY}=!3ya@ zYsCEL;p2XMMB8@}MQdz8O-qDb=%&R;lm1#vE>%N9FF64OmRe#8y!3H&)g((tfQ%G0 zaTFk#N326X1oB7li@k^sDOFXGm;kT|enN{&CW_cNRqgd9@LF+%^mdF8pF1}r)p_mf z&@%T{sJ2KoHa8%Ri<)rQ_}r^AVm=Om)TDus&@rIU9u&#sj%2(Qa?-_c2UvPUytQw& z_Hc4ra=0V5REWd^kzCz~Hhrz6%xl-yw00!pt5&RP*A_OkEfJ!D;=tQB8rsff5F&{Y z)-4^g;%d|)+H9KTd>pb$~nvwt)-*u6E?-EH(3n^Nh?pyJs51>3Q` zk_D>iS;hY8-Yw}ZJ*jjdl^!?!V~$nyT*s~W>56l-l)%lAv!`tw21axii!xI9E0W0_lVq9{aAY;>x9}wDfo3^64q46wK=6!(S z51Xv;q1LujvB8#kv9Ev;;`N?b)CuwXoqD!--J448{CafAQ66LW*y7;{RtLv@dT)!1 z$YmHY#|4}*O2fHY7|D}&_aea2rna>J)WbLa1Fn`!Sdr?Mn5qQ6$mQg=%2~yU+&J7V za_E(m03HvxhJW1&TbF|K67?uJ&(KZ<=b1R5;9MV1EBF@Dp(JJFe0G!mf`UIm`YY69 z4bF!j=l>?*94AluJJcf|b7%fV!kIrqy8K1}S>=C2cEp?E$8mU`Fc*1?5|1kealCm~ z5WbLl#L;&v>5CPdRI!`{+!vTDw+$pj`82TYs!OjCohBfWDLldIRKW z)ysdHE?V}-{PC64{14ZO36OY?#(x%-NK?lzgRS297ij!x z^2PBHQpd;h2V-)cAj;N>L80wY24t1{)4-|c{}f%O=Vg@IgZ;S2^{MB7hy3}x +#include +#include +#include +#include +#include +#include + +#define BUFFER_SIZE 4096 + +// 读取完整消息 +ssize_t readMessage(int sock, char *buffer, size_t maxSize) { + uint32_t messageLen; + // 先读取消息长度 + if (read(sock, &messageLen, sizeof(messageLen)) != sizeof(messageLen)) { + return -1; + } + + // 检查buffer大小是否足够 + if (messageLen >= maxSize) { + return -1; + } + + // 读取完整消息 + size_t totalRead = 0; + while (totalRead < messageLen) { + ssize_t n = read(sock, buffer + totalRead, messageLen - totalRead); + if (n <= 0) return -1; + totalRead += n; + } + buffer[messageLen] = '\0'; + return messageLen; +} + +int send_exec_params(const char *filename, char *const argv[], + char *const envp[], const char *logPath) { + char abs_path[PATH_MAX]; + char pwd[PATH_MAX]; + + // 获取当前工作目录 + if (getcwd(pwd, sizeof(pwd)) == NULL) { + perror("getcwd"); + return -1; + } + + if (logPath[0] != '/') { // 相对路径 + size_t pwd_len = strlen(pwd); + size_t log_len = strlen(logPath); + if (pwd_len + log_len + 2 > PATH_MAX) { + errno = ENAMETOOLONG; + perror("path too long"); + return -1; + } + + strncpy(abs_path, pwd, PATH_MAX - 1); + abs_path[PATH_MAX - 1] = '\0'; + strncat(abs_path, "/", PATH_MAX - strlen(abs_path) - 1); + strncat(abs_path, logPath, PATH_MAX - strlen(abs_path) - 1); + + char real_path[PATH_MAX]; + if (realpath(abs_path, real_path) == NULL) { + perror("realpath"); + return -1; + } + strncpy(abs_path, real_path, PATH_MAX - 1); + abs_path[PATH_MAX - 1] = '\0'; + } else { + strncpy(abs_path, logPath, PATH_MAX - 1); + abs_path[PATH_MAX - 1] = '\0'; + } + + size_t path_len = strlen(abs_path); + + int sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (sock == -1) { + perror("socket"); + return -1; + } + + // 设置TCP_NODELAY + // int flag = 1; + // setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)); + + struct sockaddr_un addr; + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1); + addr.sun_path[sizeof(addr.sun_path) - 1] = '\0'; + + if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) { + perror("connect"); + close(sock); + return -1; + } + + // 发送文件名 + size_t filename_len = strlen(filename); + write(sock, &filename_len, sizeof(size_t)); + write(sock, filename, filename_len); + + // 发送当前工作目录 + size_t pwd_len = strlen(pwd); + write(sock, &pwd_len, sizeof(size_t)); + write(sock, pwd, pwd_len); + + // 发送argv + int argc = 0; + while (argv[argc] != NULL) argc++; + write(sock, &argc, sizeof(int)); + + for (int i = 0; i < argc; i++) { + size_t arg_len = strlen(argv[i]); + write(sock, &arg_len, sizeof(size_t)); + write(sock, argv[i], arg_len); + } + + // 发送envp + int envc = 0; + while (envp[envc] != NULL) envc++; + write(sock, &envc, sizeof(int)); + + for (int i = 0; i < envc; i++) { + size_t env_len = strlen(envp[i]); + write(sock, &env_len, sizeof(size_t)); + write(sock, envp[i], env_len); + } + + // 发送logPath + write(sock, &path_len, sizeof(size_t)); + write(sock, abs_path, path_len); + + // 接收服务器响应 + char buffer[BUFFER_SIZE]; + char display_buffer[BUFFER_SIZE]; + ssize_t bytes_read; + int started = 0; + + // 等待接收[sthttp]标记 + while (!started) { + bytes_read = readMessage(sock, buffer, BUFFER_SIZE); + if (bytes_read <= 0) { + perror("Failed to read start marker"); + close(sock); + return -1; + } + + if (strstr(buffer, "[sthttp]")) { + started = 1; + } + } + + // 持续读取消息直到收到[end] + while (1) { + bytes_read = readMessage(sock, buffer, BUFFER_SIZE); + if (bytes_read <= 0) { + break; + } + + if (strstr(buffer, "[end]")) { + break; + } + + // 处理[res]...[wait]消息 + char *res_start = strstr(buffer, "[res]"); + char *wait_end = strstr(buffer, "[wait]"); + + if (res_start && wait_end) { + size_t content_len = wait_end - (res_start + strlen("[res]")); + if (content_len < BUFFER_SIZE) { + strncpy(display_buffer, res_start + strlen("[res]"), content_len); + display_buffer[content_len] = '\0'; + printf("%s\n", display_buffer); + fflush(stdout); + } + } + } + + close(sock); + return 0; +} diff --git a/tests/socket-client/client.h b/tests/socket-client/client.h new file mode 100644 index 0000000..54b06f0 --- /dev/null +++ b/tests/socket-client/client.h @@ -0,0 +1,21 @@ +// exec_socket.h + +#ifndef EXEC_SOCKET_H +#define EXEC_SOCKET_H + +#include +#include +#include +#include +#include +#include +#include // for PATH_MAX +#include + +#define SOCKET_PATH "/tmp/exec_hook/exec.sock" +#define MAX_BUF_SIZE 4096 + +// 函数声明 +int send_exec_params(const char *filename, char *const argv[], char *const envp[], const char *logPath); + +#endif // EXEC_SOCKET_H diff --git a/tests/socket-client/client.o b/tests/socket-client/client.o new file mode 100644 index 0000000000000000000000000000000000000000..da99897d55f416b033ee504cbc8c378a4fee23d7 GIT binary patch literal 16040 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 Ym40G*_JG55p!_{-|EG2`#P$6D3+Ug#fdBvi literal 0 HcmV?d00001 diff --git a/tests/socket-client/test.log b/tests/socket-client/test.log new file mode 100644 index 0000000..803d89e --- /dev/null +++ b/tests/socket-client/test.log @@ -0,0 +1 @@ +我是一段标准错误输出 \ No newline at end of file