Portál AbcLinuxu, 13. května 2025 02:53
sys.argv[1];Tedy vypise svuj prvni parametr. Jakym zpusobem musim skript upravit, aby fungoval obemi temito moznostmi:
$ ./skript test test $ echo test | ./skript test
Řešení dotazu:
sys.stdin
.
Příklad, mějme soubor pokus.py:
#!/bin/env python import sys nejakadatazestdin = sys.stdin.readlines() print nejakadatazestdina pro otestovaní:
echo pokus.py | ./pokus.py
for line in sys.stdin: dělej něco...což by ze znalosti, že souborový objekt odpovídající stdin je sys.stdin, mělo jít odvodit...
#!/bin/bash while [ 1 ]; do echo "Tik" sleep 1 doneNyni chci napsat skript test.py takovy, aby to fungovalo takto:
$ ./test.sh | ./test.py Tik Tik Tik Tik ^Ccoz s tim vasim resenim nefunguje.
while True: print sys.stdin.readline()(funkcia readline ale na konci reťazca necháva znak \n)
Skript funguje, ale data visí v bufferu a jelikož jich nepřišlo takové množství, aby se buffer vyprázdnil, tak si myslíš, že to nešlape. Nažeň tam víc dat a uvidíš, že to jde. Nejlépe by jsi udělal kdyby jsi přesně popsal co potřebuješ, aby se případně dalo nadhodit vhodnější řešení.
$ sudo tcpdump -A -s 1400 'dst port 80' -i wlan0 | grep GETMi vypisuje jednotlive GET pozadavky, ktere chodi pres wlan0. Co radek, to pozadavek. Pozavek se do konzole vypise vzdy ihned pote co dorazi na wlan0 interface. Ja potrebuji pouze python script, ktery ty retezce (GET pozadavky) bude dostavat na stdin a ihned je vypisovat (pak skript samozrejme upravim, aby i neco s tema retezcema delal). Tzn, chci dosahnout toho, aby prikazy
$ sudo tcpdump -A -s 1400 'dst port 80' -i wlan0 | grep GETi
$ sudo tcpdump -A -s 1400 'dst port 80' -i wlan0 | grep GET | ./skript.pymely stejny vystup.
Šlo mi spíš o nějaké reálné nasazení, možná by Ti totiž místo tcpdump
vyhovoval více přímo modul do Pythonu Pcapy (je součástí Lennyho, třeba bude přímo i v Tvé distibuci).
import sys while True: print sys.stdin.readline().strip()musí
tcpdump -ldělat totéž co
tcpdump -l | ./test.pyTentokrát i ověřeno.
for line in sys.stdin: ...
, což mělo být nejčitější a nejpythonovější řešení. Konstrukce sice používá lazy evaluation, jenže souborové objekty kvůli efektivitě provádějí jakěsi vnitřní bufferování, takže člověk ty řádky stejně nedostane po jednom. Nezjistil jsem, jak/zda se dá vypnout.
sudo tcpdump -l -A -s 1400 'dst port 80' -i eth0 | grep --line-buffered GET | ./skript.pyDulezity je parametr -l u tcpdumpu a --line-buffered u grepu. Dekuji vsem za pomoc.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.