banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix Pipe 'cat' to 'grep' hay 'grep' thẳng luôn  XML
  [Discussion]   Nhờ tư vấn về bảo mật (DDos - X-Flash) 16/11/2010 09:12:27 (+0700) | #1 | 224972
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]

conmale wrote:

...
Đôi khi em thấy log của apache / mod_security cảnh bảo "Failed to execute" nhưng thật sự cái script này vẫn đã thực thi. Để xác minh có đúng điều này xảy ra hay không, em thử chèn thêm 1 dòng trong "blocker.sh":

/bin/echo +$REMOTE_ADDR >> /tmp/badip.txt

Sau đó tail dòng cuối cùng của /tmp/badip.txt để tìm IP cuối được blocker.sh thực thi rồi thử:
cat /proc/net/ipt_recent/BLACKLIST | grep <ip>
 

Chỉ cần 'grep' luôn thôi anh: grep <ip> /proc/net/ipt_recent/BLACKLIST
Let's build on a great foundation!
[Up] [Print Copy]
  [Discussion]   Nhờ tư vấn về bảo mật (DDos - X-Flash) 16/11/2010 09:38:39 (+0700) | #2 | 224973
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

quanta wrote:

conmale wrote:

...
Đôi khi em thấy log của apache / mod_security cảnh bảo "Failed to execute" nhưng thật sự cái script này vẫn đã thực thi. Để xác minh có đúng điều này xảy ra hay không, em thử chèn thêm 1 dòng trong "blocker.sh":

/bin/echo +$REMOTE_ADDR >> /tmp/badip.txt

Sau đó tail dòng cuối cùng của /tmp/badip.txt để tìm IP cuối được blocker.sh thực thi rồi thử:
cat /proc/net/ipt_recent/BLACKLIST | grep <ip>
 

Chỉ cần 'grep' luôn thôi anh: grep <ip> /proc/net/ipt_recent/BLACKLIST
 


Hì hì, thấy vậy mà khác đó em smilie.

grep đọc từng dòng trong file để match pattern.

cat đọc trọn bộ nội dung file.

Nếu cat trước rồi mới grep thì grep sẽ tìm các matching pattern của thông tin đã được cat (lưu trên memory).

Đối với file có nội dung không thay đổi nhanh chóng thì grep thẳng luôn hoặc cat rồi grep cũng gần như nhau. Tuy nhiên, đối với file có nội dung thay đổi liên tục thì cat trước, grep sau sẽ bảo đảm ở một thời điểm nào đó thông tin được grep có thể hiện diện vì thông tin đó đã được tạm thời lưu trên memory chớ không thay đổi liên tục nữa.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Discussion]   Nhờ tư vấn về bảo mật (DDos - X-Flash) 16/11/2010 09:52:09 (+0700) | #3 | 224976
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Hì, vậy dùng tac đi anh: tac /proc/net/ipt_recent/BLACKLIST | grep <ip>
Let's build on a great foundation!
[Up] [Print Copy]
  [Discussion]   Nhờ tư vấn về bảo mật (DDos - X-Flash) 16/11/2010 10:36:02 (+0700) | #4 | 224983
myquartz
Member

[Minus]    0    [Plus]
Joined: 04/01/2005 04:58:30
Messages: 563
Offline
[Profile] [PM]

conmale wrote:

Hì hì, thấy vậy mà khác đó em smilie.

grep đọc từng dòng trong file để match pattern.

cat đọc trọn bộ nội dung file.

Nếu cat trước rồi mới grep thì grep sẽ tìm các matching pattern của thông tin đã được cat (lưu trên memory).

Đối với file có nội dung không thay đổi nhanh chóng thì grep thẳng luôn hoặc cat rồi grep cũng gần như nhau. Tuy nhiên, đối với file có nội dung thay đổi liên tục thì cat trước, grep sau sẽ bảo đảm ở một thời điểm nào đó thông tin được grep có thể hiện diện vì thông tin đó đã được tạm thời lưu trên memory chớ không thay đổi liên tục nữa.
 


Em nghĩ cat không đọc trọn bộ. Vì em đã từng cat 1 vài file to đùng hàng GB mà mem vài trăm Meg có làm sao đâu.
cat có thể đọc theo từ block để ghi buffer thôi, và nó nhớ vị trí nào là kết thúc file nó đọc tới rồi stop, chứ không phải là nó read từng line kệ cho file có tăng thêm. Có lẽ nó read từng line khi đầu vào dạng character device thay vì block device thì phải. Muốn biết cụ thể chắc phải xem source của nó.
[Up] [Print Copy]
  [Discussion]   Nhờ tư vấn về bảo mật (DDos - X-Flash) 16/11/2010 11:01:10 (+0700) | #5 | 224984
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

myquartz wrote:

conmale wrote:

Hì hì, thấy vậy mà khác đó em smilie.

grep đọc từng dòng trong file để match pattern.

cat đọc trọn bộ nội dung file.

Nếu cat trước rồi mới grep thì grep sẽ tìm các matching pattern của thông tin đã được cat (lưu trên memory).

Đối với file có nội dung không thay đổi nhanh chóng thì grep thẳng luôn hoặc cat rồi grep cũng gần như nhau. Tuy nhiên, đối với file có nội dung thay đổi liên tục thì cat trước, grep sau sẽ bảo đảm ở một thời điểm nào đó thông tin được grep có thể hiện diện vì thông tin đó đã được tạm thời lưu trên memory chớ không thay đổi liên tục nữa.
 


Em nghĩ cat không đọc trọn bộ. Vì em đã từng cat 1 vài file to đùng hàng GB mà mem vài trăm Meg có làm sao đâu.
cat có thể đọc theo từ block để ghi buffer thôi, và nó nhớ vị trí nào là kết thúc file nó đọc tới rồi stop, chứ không phải là nó read từng line kệ cho file có tăng thêm. Có lẽ nó read từng line khi đầu vào dạng character device thay vì block device thì phải. Muốn biết cụ thể chắc phải xem source của nó. 


Cứ: $ man cat thì ra ngay thôi mà.

The cat utility reads files sequentially, writing them to the standard output. The file operands are processed in command-line order. If file is a sin-
gle dash (`-') or absent, cat reads from the standard input. If file is a UNIX domain socket, cat connects to it and then reads it until EOF. This com-
plements the UNIX domain binding capability available in inetd(8).

.......

The command:

cat file1 - file2 - file3

will print the contents of file1, print data it receives from the standard input until it receives an EOF (`^D') character, print the contents of file2,
read and output contents of the standard input again, then finally output the contents of file3. Note that if the standard input referred to a file, the
second dash on the command-line would have no effect, since the entire contents of the file would have already been read and printed by cat when it
encountered the first `-' operand.
 
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Discussion]   Pipe 'cat' to 'grep' hay 'grep' thẳng luôn 17/11/2010 06:34:26 (+0700) | #6 | 225021
[Avatar]
WinDak
Researcher

Joined: 27/01/2002 11:15:00
Messages: 223
Offline
[Profile] [PM]
Để grep xxx ở cuối cũng dễ chịu hơn (tiện tay hơn), vì muốn tìm thông tin gì khác( thay đổi expression của grep ) thì có thể thay đổi ngay điểm end của con trỏ, thay vì phải move nó tới vị trí ở giữa
-- w~ --
[Up] [Print Copy]
  [Discussion]   Pipe 'cat' to 'grep' hay 'grep' thẳng luôn 17/11/2010 10:04:54 (+0700) | #7 | 225032
[Avatar]
tranvanminh
HVA Friend

Joined: 04/06/2003 06:36:35
Messages: 516
Location: West coast
Offline
[Profile] [PM]
Đối với file có nội dung không thay đổi nhanh chóng thì grep thẳng luôn hoặc cat rồi grep cũng gần như nhau. Tuy nhiên, đối với file có nội dung thay đổi liên tục thì cat trước, grep sau sẽ bảo đảm ở một thời điểm nào đó thông tin được grep có thể hiện diện vì thông tin đó đã được tạm thời lưu trên memory chớ không thay đổi liên tục nữa.  


Đúng là cơ bản, mà đọc lại thì thấy hay quá anh ơi smilie
[Up] [Print Copy]
  [Discussion]   Nhờ tư vấn về bảo mật (DDos - X-Flash) 16/06/2011 06:16:07 (+0700) | #8 | 240993
Crunch
Member

[Minus]    0    [Plus]
Joined: 02/07/2008 03:41:11
Messages: 50
Offline
[Profile] [PM]

conmale wrote:

quanta wrote:

conmale wrote:

...
Đôi khi em thấy log của apache / mod_security cảnh bảo "Failed to execute" nhưng thật sự cái script này vẫn đã thực thi. Để xác minh có đúng điều này xảy ra hay không, em thử chèn thêm 1 dòng trong "blocker.sh":

/bin/echo +$REMOTE_ADDR >> /tmp/badip.txt

Sau đó tail dòng cuối cùng của /tmp/badip.txt để tìm IP cuối được blocker.sh thực thi rồi thử:
cat /proc/net/ipt_recent/BLACKLIST | grep <ip>
 

Chỉ cần 'grep' luôn thôi anh: grep <ip> /proc/net/ipt_recent/BLACKLIST
 


Hì hì, thấy vậy mà khác đó em smilie.

grep đọc từng dòng trong file để match pattern.

cat đọc trọn bộ nội dung file.

Nếu cat trước rồi mới grep thì grep sẽ tìm các matching pattern của thông tin đã được cat (lưu trên memory).

Đối với file có nội dung không thay đổi nhanh chóng thì grep thẳng luôn hoặc cat rồi grep cũng gần như nhau. Tuy nhiên, đối với file có nội dung thay đổi liên tục thì cat trước, grep sau sẽ bảo đảm ở một thời điểm nào đó thông tin được grep có thể hiện diện vì thông tin đó đã được tạm thời lưu trên memory chớ không thay đổi liên tục nữa.
 


Bác conmale nói như thế này là không đúng với tinh thần của cơ chế pipeline. Cơ chế này được đề ra là để tận dụng tối đa thời gian làm việc của các khối chức năng của CPU, sao cho thời gian nghỉ của chúng là ít nhất. Vì vậy mà các khi sử dụng cơ chế này thì các giai đoạn thực hiện của các lệnh (IF, ID, EX, MEM, WB) gối lên nhau chứ lệnh sau không chờ lệnh trước thực hiện xong rồi nó mới thực thi.

Như vậy trong trường hợp này thì output của 'cat' được bao nhiêu thì 'grep' sẽ thực hiện ngay trên đó chứ không phải chờ đến khi 'cat' thực hiện xong.

Tuy nhiên có ngoại lệ với 1 số lệnh, ví dụ 'sort' thì phải chờ lệnh trước xong nó mới thực hiện.
[Up] [Print Copy]
  [Discussion]   Nhờ tư vấn về bảo mật (DDos - X-Flash) 16/06/2011 07:12:05 (+0700) | #9 | 241000
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

Crunch wrote:

conmale wrote:

quanta wrote:

conmale wrote:

...
Đôi khi em thấy log của apache / mod_security cảnh bảo "Failed to execute" nhưng thật sự cái script này vẫn đã thực thi. Để xác minh có đúng điều này xảy ra hay không, em thử chèn thêm 1 dòng trong "blocker.sh":

/bin/echo +$REMOTE_ADDR >> /tmp/badip.txt

Sau đó tail dòng cuối cùng của /tmp/badip.txt để tìm IP cuối được blocker.sh thực thi rồi thử:
cat /proc/net/ipt_recent/BLACKLIST | grep <ip>
 

Chỉ cần 'grep' luôn thôi anh: grep <ip> /proc/net/ipt_recent/BLACKLIST
 


Hì hì, thấy vậy mà khác đó em smilie.

grep đọc từng dòng trong file để match pattern.

cat đọc trọn bộ nội dung file.

Nếu cat trước rồi mới grep thì grep sẽ tìm các matching pattern của thông tin đã được cat (lưu trên memory).

Đối với file có nội dung không thay đổi nhanh chóng thì grep thẳng luôn hoặc cat rồi grep cũng gần như nhau. Tuy nhiên, đối với file có nội dung thay đổi liên tục thì cat trước, grep sau sẽ bảo đảm ở một thời điểm nào đó thông tin được grep có thể hiện diện vì thông tin đó đã được tạm thời lưu trên memory chớ không thay đổi liên tục nữa.
 


Bác conmale nói như thế này là không đúng với tinh thần của cơ chế pipeline. Cơ chế này được đề ra là để tận dụng tối đa thời gian làm việc của các khối chức năng của CPU, sao cho thời gian nghỉ của chúng là ít nhất. Vì vậy mà các khi sử dụng cơ chế này thì các giai đoạn thực hiện của các lệnh (IF, ID, EX, MEM, WB) gối lên nhau chứ lệnh sau không chờ lệnh trước thực hiện xong rồi nó mới thực thi.

Như vậy trong trường hợp này thì output của 'cat' được bao nhiêu thì 'grep' sẽ thực hiện ngay trên đó chứ không phải chờ đến khi 'cat' thực hiện xong.

Tuy nhiên có ngoại lệ với 1 số lệnh, ví dụ 'sort' thì phải chờ lệnh trước xong nó mới thực hiện.  


Khía cạnh "pipeline" thì bồ nói đúng nhưng bồ không đề cập tới chuyện nội dung file (được cat hoặc được grep) thay đổi liên tục. Mục đích của vấn đề ở đây là lấy đúng thông tin trong một khoảng thời gian nào đó chớ khônng phải lấy sao cho nhanh.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Discussion]   Nhờ tư vấn về bảo mật (DDos - X-Flash) 17/06/2011 18:40:20 (+0700) | #10 | 241236
Crunch
Member

[Minus]    0    [Plus]
Joined: 02/07/2008 03:41:11
Messages: 50
Offline
[Profile] [PM]

conmale wrote:

Khía cạnh "pipeline" thì bồ nói đúng nhưng bồ không đề cập tới chuyện nội dung file (được cat hoặc được grep) thay đổi liên tục. Mục đích của vấn đề ở đây là lấy đúng thông tin trong một khoảng thời gian nào đó chớ khônng phải lấy sao cho nhanh. 

Anh có thể giải thích rõ hơn tại sao khi nội dung file thay đổi liên tục thì grep trực tiếp không thể cho kết quả đúng?

Theo em hiểu, nội dung file thay đổi liên tục tương đương với việc nhiều thao tác đọc/ghi trong khoảng thời gian ngắn. Giả sử tiến trình A gây ra sự thay đổi 'liên tục' với 1 file. Khi grep (hay cat) trên file này, hệ điều hành sẽ có trách nhiệm không để xảy ra xung đột (thông qua chức năng điều khiển tiến trình, điều khiển bộ nhớ...). Chẳng hạn khi đang grep thì tiến trình A sẽ bị tạm dừng thao tác ghi. Như vậy grep trên 1 file có nội dung thay đổi 'liên tục' cũng tương đương với thao tác trên 1 file nội dung ổn định mà thôi.
[Up] [Print Copy]
  [Discussion]   Nhờ tư vấn về bảo mật (DDos - X-Flash) 18/06/2011 13:20:50 (+0700) | #11 | 241327
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

Crunch wrote:

conmale wrote:

Khía cạnh "pipeline" thì bồ nói đúng nhưng bồ không đề cập tới chuyện nội dung file (được cat hoặc được grep) thay đổi liên tục. Mục đích của vấn đề ở đây là lấy đúng thông tin trong một khoảng thời gian nào đó chớ khônng phải lấy sao cho nhanh. 

Anh có thể giải thích rõ hơn tại sao khi nội dung file thay đổi liên tục thì grep trực tiếp không thể cho kết quả đúng?

Theo em hiểu, nội dung file thay đổi liên tục tương đương với việc nhiều thao tác đọc/ghi trong khoảng thời gian ngắn. Giả sử tiến trình A gây ra sự thay đổi 'liên tục' với 1 file. Khi grep (hay cat) trên file này, hệ điều hành sẽ có trách nhiệm không để xảy ra xung đột (thông qua chức năng điều khiển tiến trình, điều khiển bộ nhớ...). Chẳng hạn khi đang grep thì tiến trình A sẽ bị tạm dừng thao tác ghi. Như vậy grep trên 1 file có nội dung thay đổi 'liên tục' cũng tương đương với thao tác trên 1 file nội dung ổn định mà thôi. 


Ngay cả trong hoàn cảnh bình thường, có nghĩa là nội dung một file không thay đổi dồn dập thì việc "cat" luôn luôn được thực thi nhanh hơn việc "grep" bởi vì "cat" chỉ đơn thuần "đọc" từng dòng rồi đẩy ra stdout hoặc "pipe" đi đâu đó. Còn "grep" thì phải thực thi "match" có nghĩa là không những đọc từng dòng mà nó còn phải tìm chuỗi trùng với mẫu (pattern) đã được đưa ra.

Trong trường hợp nêu ra ở đây, có hai động tác xảy ra: cat rồi grep. Điều này có nghĩa thông tin đã được cat sẽ được (tạm) lưu trong buffer. Nói một cách tổng quát, A | B có nghĩa là B phải đợi thông tin từ "pipe", có nghĩa là nếu A chưa lấy được thông tin thì B chưa xảy ra và khi A đã hoàn tất lấy thông tin (cat) để "pipe" thì B sẽ xử lý phần đó trọn vẹn. Bồ hãy hình dung A và B là 2 công nhân và thay vì công nhân B phải lấy ra một chồng gạch rồi mới lựa ra viên gạch nào đúng mã số thì công nhân A thực hiện việc lấy gạch rồi chuyển cho công nhân B để lựa gạch. Nếu công nhân A chưa lấy hết một chồng gạch thì công nhân B đứng đó chờ. Trong trường hợp máy có nhiều CPU thì A và B có thể cùng làm việc song song như dạng công nhân A thảy viên gạch nào lên thì công nhân B đón lấy và tiếp nhận nếu viên gạch ấy đúng mã số (và nếu chỉ có một mình B vừa lấy gạch, vừa lựa gạch trong khi đống gạch thay đổi liên tục thì kết quả thu được sẽ khác hơn là A lấy gạch + B lựa gạch).
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Discussion]   Nhờ tư vấn về bảo mật (DDos - X-Flash) 22/06/2011 01:53:46 (+0700) | #12 | 241647
wirzfog
Member

[Minus]    0    [Plus]
Joined: 20/09/2009 09:00:56
Messages: 32
Offline
[Profile] [PM]

conmale wrote:

Cứ: $ man cat thì ra ngay thôi mà.

The cat utility reads files sequentially, writing them to the standard output. The file operands are processed in command-line order. If file is a sin-
gle dash (`-') or absent, cat reads from the standard input. If file is a UNIX domain socket, cat connects to it and then reads it until EOF. This com-
plements the UNIX domain binding capability available in inetd(8).

.......

The command:

cat file1 - file2 - file3

will print the contents of file1, print data it receives from the standard input until it receives an EOF (`^D') character, print the contents of file2,
read and output contents of the standard input again, then finally output the contents of file3. Note that if the standard input referred to a file, the
second dash on the command-line would have no effect, since the entire contents of the file would have already been read and printed by cat when it
encountered the first `-' operand.
 

 

Sao em $man cat thì nội dung chỉ có như thế này thôi nhỉ, không có phần anh conmale ghi
Code:
CAT(1)                           User Commands                          CAT(1)



NAME
       cat - concatenate files and print on the standard output

SYNOPSIS
       cat [OPTION]... [FILE]...

DESCRIPTION
       Concatenate FILE(s), or standard input, to standard output.

       -A, --show-all
              equivalent to -vET

      ...


EXAMPLES
       cat f - g
              Output f's contents, then standard input, then g's contents.

       cat    Copy standard input to standard output.

AUTHOR
      ...

REPORTING BUGS
       ...

COPYRIGHT
       ...

SEE ALSO
       tac(1).

       ...



GNU coreutils 8.10               February 2011                          CAT(1)

[Up] [Print Copy]
  [Discussion]   Pipe 'cat' to 'grep' hay 'grep' thẳng luôn 22/06/2011 07:52:21 (+0700) | #13 | 241658
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
@wirzfog: chắc anh ấy đang dùng BSD-based (Mac OS X chăng?).
Let's build on a great foundation!
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|