klávesy psané do socketu se vloží jako příkaz do shellu

Linux, Unix, BSD systémy, distribuce, open source

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Da Gony 25. 2. 2025 14:31

Hlava mi nebere jednu věc,proč když se připojím v bashi na socket,příkazem nc nebo curl a protistrana server požadavek neobslouží hned, takže mám čas psát a entrovat, proč skončení nc/curl se nahromaděný vstup pošle jako vstup do shellu?
Technická poznámka: naproti běžel obyčejná nc -l ale specifikem curl(HTTP obecně), že po odeslání požadavku ze své strany ukončí spojení (stream asi abych byl přesný). >>> Do té doby samozřejmě se vstup posílá na druhou stranu socketu.

Kód: Vybrat vše
~/Desktop $ curl 192.168.0.78:1144
abcd ;+ENTER
efdhb
~/Desktop $ abcd
-bash: abcd: příkaz nenalezen
:~/Desktop $ efd (rozepsáno)


Přišlo by mi logické, kdyby se po ukončení jedné strany streamu se pak psaní nikam nehromadilo (ano , třeba se zobrazovalo v konzoli), ale ne aby se pak vyplivlo jako příkaz do bashe
Da Gony
Junior
Uživatelský avatar

Odeslat příspěvekod Da Gony 10. 3. 2025 08:13

víte jaký je toho shello vý mechanismus toho?
Da Gony
Junior
Uživatelský avatar

Odeslat příspěvekod Emil Pastelka 10. 3. 2025 22:47

Proč tomu tak je, to Vám neřeknu. V zásadě ale dané spojení musí předpokládat i nežádoucí přerušení. Pokud by to vždy mělo vyústit ve zrušení již odeslané fronty příkazů (canonical), bylo by to zřejmě horší řešení, než jejich postupné vykonání.

Stručně řečeno, protože při použití curl (nebo nc) dochází k ukončení spojení ještě před zpracováním celého vstupu, zůstává vstup uživatele v terminálovém bufferu a při návratu k shellu je automaticky vyhodnocen.

Úprava režimu vstupu terminálu: stty -icanon
změní způsob, jakým se vstup zpracovává. To by mohlo zabránit akumulaci textu, který se po ukončení nc nebo curl předá shellu. Ovšem změna ovlivní chování celého terminálu, což nemusí být žádoucí.

Některé verze netcatu podporují volbu "-q", pro zpoždění před ukončením spojení.
Emil Pastelka
Junior
Uživatelský avatar

Odeslat příspěvekod JirkaVejrazka 11. 3. 2025 16:11

Protoze STDIN je fronta (znaku, predevsim). Ty pises na klavesnici, znaky se ukladaji do STDIN fronty a CURL z ni cte. Na cteni ma nejaky svuj postup, ktery zavisi na druhe strane (co akceptuje a hlavne co potvrdi).

V nejakem okamziku curl ze STDIN prestane cist, protoze druha strana prerusila spojeni. A zbyvajici znaky nezpracuje, protoze nema, co by s nimi delal. Tak uvolni STDIN zpet pro shell, ktery se k tomu chova standardne - vypise je na terminal.
JirkaVejrazka
Mírně pokročilý


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků