2010-06-06 10 views
12
#I used to have this, but I don't want to write to the disk 
# 
pcap="somefile.pcap" 
tcpdump -n -r $pcap > all.txt 
while read line; do 
    ARRAY[$c]="$line" 
    c=$((c+1)) 
done < all.txt 

Lo siguiente no funciona.entrada del ciclo while proveniente de la salida del `comando`

# I would prefer something like... 
# 
pcap="somefile.pcap" 
while read line; do 
    ARRAY[$c]="$line" 
    c=$((c+1)) 
done < $(tcpdump -n -r "$pcap") 

Muy pocos resultados en Google (no entiende lo que quiero encontrar :(). Me gusta que sea compatible con Bourne (/ bin/sh), pero no es así han . para ser

Respuesta

1
for line in $(tcpdump -n -r $pcap) 
do 
command 
done 

Esto no está haciendo exactamente lo que necesito. Pero está cerca. Y compatible con Shell. Estoy creando tablas HTML a partir de la salida tcpdump. El ciclo for hace una nueva fila <tr> para cada palabra. Debe hacer una nueva fila para cada línea (\ n final). Paste bin script01.sh.

+2

Tendrá que hacer 'saveIFS = $ IFS; IFS = $ '\ n'; su-por-bucle; IFS = $ saveIFS' ya que 'IFS' hace que las cosas se rompan en espacios, pestañas y saltos de línea por defecto. –

+0

Lo intentaré hoy e informaré. –

1

Si no se preocupan por ser bourne, se puede cambiar a Perl:

my $pcap="somefile.pcap"; 
my $counter = 0; 
open(TCPDUMP,"tcpdump -n -r $pcap|") || die "Can not open pipe: $!\n"; 
while (<TCPDUMP>) { 
    # At this point, $_ points to next line of output 
    chomp; # Eat newline at the end 
    $array[$counter++] = $_; 
} 

O con cáscara, utilice for:

for line in $(tcpdump -n -r $pcap) 
do 
command 
done 
+3

En la versión de cáscara, es necesario configurar IFS a una única una nueva línea de manera que la salida de 'tcpdump' no se rompe en cada espacio. –

13

Esto funciona en bash:

while read line; do 
    ARRAY[$c]="$line" 
    c=$((c+1)) 
done < <(tcpdump -n -r "$pcap") 
+0

Sí. Funciona en Bash. ¿Alguna razón por la cual no se ejecutará en/bin/sh? Me gustaría * hacer que la secuencia de comandos sea portátil. ¿La portabilidad generalmente es importante? Para garantizar que otros también puedan ejecutar el script ... –

+4

La sintaxis de sustitución del proceso '<(...)' no está disponible para sh. –

+1

Las matrices tampoco están disponibles para sh. Pero +1 para la sustitución del proceso. –

14

Esto es compatible con sh:

tcpdump -n -r "$pcap" | while read line; do 
    # something 
done 

Sin embargo, sh no tiene matrices, por lo que no puede tener su código como lo es en sh. Otros están en lo cierto al decir que bash y perl son actualmente bastante comunes, y usted puede contar con que estén disponibles en sistemas no antiguos.

ACTUALIZACIÓN para reflejar @ comentario de Dennis

+0

¡Tenía muchas esperanzas para esta, pero no genera los archivos HTML! No puedo entender por qué. >> http://stackoverflow.pastebin.com/TecWxMwW –

+0

eek, dejé un "eco" en mi interior, que utilicé para probar. Corregido ahora, debería ser equivalente al tuyo. (Por cierto, supongo que querías decir que tu código no genera HTML cuando insertas este fragmento; este fragmento por sí mismo no genera HTML más que tu fragmento) – Amadan

+2

Excepto que el shell Bourne no tiene matrices. Y, en Bash, las dos líneas en el cuerpo de tu loop (OK, el bucle de OP) pueden colapsarse en: 'ARRAY [$ c] + = (" $ line ")' o 'ARRAY [C++] =" $ line "'. Pero +1 para la tubería en 'while'. –

Cuestiones relacionadas