Cara grep keluaran netcat

13

Saya mencoba mengambil aliran teks langsung netcat, tetapi tidak berhasil untuk saya:

netcat localhost 9090 | grep sender

tidak mengembalikan apa-apa, tapi saya yakin itu harus.

Jika saya mengarahkan netcatoutput ke file dan menambahkan beberapa penundaan (mensimulasikan lingkungan nyata) - maka itu berfungsi:

$ (sleep 5; cat netcat_output; sleep 5) | grep sender

{"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data": "shuttingdown":false},"sender":"xbmc"}}

Saya juga mencoba menambahkan --line-bufferedtetapi tanpa keberhasilan.

Apa yang saya lakukan salah?

Edit:

Saya perhatikan masalah yang sama dengan sed, outputnya kosong.

Tetapi, misalnya, hexdumpmengubah teks menjadi hex live:

$ netcat localhost 9090 | hexdump -C
00000000  7b 22 6a 73 6f 6e 72 70  63 22 3a 22 32 2e 30 22  |{"jsonrpc":"2.0"|
00000010  2c 22 6d 65 74 68 6f 64  22 3a 22 50 6c 61 79 65  |,"method":"Playe|
00000020  72 2e 4f 6e 50 6c 61 79  22 2c 22 70 61 72 61 6d  |r.OnPlay","param|
00000030  73 22 3a 7b 22 64 61 74  61 22 3a 7b 22 69 74 65  |s":{"data":{"ite|
00000040  6d 22 3a 7b 22 69 64 22  3a 36 2c 22 74 79 70 65  |m":{"id":6,"type|
00000050  22 3a 22 6d 6f 76 69 65  22 7d 2c 22 70 6c 61 79  |":"movie"},"play|
00000060  65 72 22 3a 7b 22 70 6c  61 79 65 72 69 64 22 3a  |er":{"playerid":|
00000070  31 2c 22 73 70 65 65 64  22 3a 31 7d 7d 2c 22 73  |1,"speed":1}},"s|
tomekceszke
sumber
2
Mungkin ada buffer di pipa? Anda dapat mencoba menggunakan stdbuf -o0 netcat localhost 9090 | grep sender(diambil dari sini )
user43791
Apakah ini berfungsi seperti ini? netcat -z localhost 9090 | grep sender
Gilles Quenot
@ user43791 hasilnya masih kosong, tapi saya yakin netcat mengembalikan string yang cocok
tomekceszke
@sputnick yang ini segera kembali ke shell dan tidak menunggu acara
tomekceszke
1
Tidak ada baris baru di hexdump, jadi grepmungkin menunggu tanpa akhir untuk baris baru. catberfungsi karena grepakan mendapatkan EOF jika bukan baris baru, setidaknya. Mungkin coba awkdengan {RS?
muru

Jawaban:

4

Anda bisa menggunakan readperintah ( bashbuiltin) untuk memaksa karakter dibaca satu per satu:

netcat localhost 9090 | (
    cnt=0
    line=
    while read -N 1 c; do
        line="$line$c"
        if [ "$c" = "{" ]; then
            cnt=$((cnt+1))
        elif [ "$c" = "}" ]; then
            cnt=$((cnt-1))
            if [ $cnt -eq 0 ]; then
                printf "%s\n" "$line"
                line=
            fi
        fi
    done
) | grep sender

Script ini harus mencetak setiap output penuh dengan balancing {dan }, tetapi Anda dapat mengubah script untuk melakukan apa pun yang Anda inginkan. Skrip ini TIDAK akan bekerja dengan baik pada patokan dibandingkan dengan apa pun, tetapi cukup sederhana dan tampaknya bekerja untuk saya ...

Perhatikan bahwa sampel uji Anda tidak memiliki kecocokan {dan }, jadi jika ini adalah kasus dari input nyata, Anda mungkin ingin mengubah kriteria untuk mencetak baris.

pengguna43791
sumber
Sepertinya kawat gigi tidak cocok hanya karena dia hanya memposting awal output.
Barmar
8

Jawabannya ada di sini: grep tidak cocok dengan output nc

netcat menampilkan log verbose ke standard error, jadi kita perlu menangkap kesalahan sebelum kita melakukan pipe ke grep.

$ netcat -zv localhost 1-9000 2>&1 | grep succeeded
tkdave
sumber
Jawaban ini hanya membuat saya solusi. Itu sangat aneh ketika saya menjalankan perintah itu tanpa 2>&1, sepertinya grep tidak bekerja sama sekali.
Marecky
2

Saya pikir masalahnya adalah tidak adanya baris baru dalam netcatoutput. Saya dapat melihat dua solusi:

  1. Masukkan baris baru setiap xdetik (dengan konsekuensi yang tidak menguntungkan jika baris baru dimasukkan di tengah source):

    ( while sleep 1; do echo; done & netcat ... ) | grep source
    
  2. Gunakan awkdengan RS selain baris baru:

    netcat ... | awk -v RS='}' -v ORS='}' '/source/'
    
muru
sumber
Output masih kosong. Untuk memastikan bahwa perintah sudah benar saya jalankan pada dumped stream - cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/'Outputnya ok:,"sender":"xbmc"}
tomekceszke
Saya baru saja memeriksa solusi pertama dan berhasil ! Tetapi seperti yang Anda sebutkan itu dapat membagi output sehingga tidak bisa menjadi solusi akhir. Pokoknya banyak terima kasih!
tomekceszke
1

Tambahkan --line-buffereduntuk menggunakan garis buffering pada output:

netcat localhost 9090 | grep --line-buffered sender 
Cyrus
sumber
Saya sudah mencoba ini, tidak berhasil.
tomekceszke
1

gunakan watchperintah:

watch 'netcat localhost 9090 | grep sender'
αғsнιη
sumber
Itu tidak bekerja juga. Sama dengan sed ... Tapi, misalnya, ini: netcat localhost 9090 | hexdump berfungsi dan mengganti teks menjadi hex live, mengapa?
tomekceszke
0

Di Bash Anda dapat menggunakan file perangkat semu untuk membuka koneksi TCP dan menerima seperti biasa. Sebagai contoh:

$ grep "sender" < /dev/tcp/example.com/1234

Untuk mengujinya, jalankan server yang dapat mengirim beberapa file, seperti:

$ nc -vl 1234 < /etc/hosts

Kemudian di terminal lain jalankan tes ke grepoutput:

$ grep "127" < /dev/tcp/localhost/1234
127.0.0.1   localhost
kenorb
sumber