Làm thế nào bạn sẽ đơn giản hóa lệnh này?


10

Tôi còn khá mới với strace / netstat / v.v. Tôi đang sử dụng lệnh này để theo dõi quá trình apache xử lý yêu cầu của tôi (telnet), có cách nào để đơn giản hóa nó một chút không?

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \ 
    grep $(lsof -p `pidof telnet` | grep TCP | \
    perl -n -e'/localhost:(\d+)/ && print $1') | grep apache2 | \ 
    perl -n -e'/ESTABLISHED (\d+)/ && print $1')

Cảm ơn!


Bạn đang chạy cái này trước hay sau khi bạn bắt đầu quá trình telnet?
deltaray

Sau khi nó bắt đầu, bạn phải đợi vài giây để nó kết nối với apache, sau đó bạn có thể chạy strace
Andrei Serdeliuc

1
Nếu lệnh của bạn hoạt động, đừng bận tâm đơn giản hóa nó.
Tom O'Connor

Câu trả lời:


1

Tôi có thể cải thiện một chút về Mark Henderson, với $ () thay vì `` và loại bỏ grep bằng một chiếc sed tốt hơn:

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -antlp | \
   sed -e "/telnet/s/^.*ESTABLISHED\ \|\/.*$//g")

Cá nhân tôi nghĩ rằng backticks làm cho nó khó đọc; hơn nữa, chúng không lồng nhau, không giống như cú pháp $ ()


+1, Script Fu vượt trội và ví dụ học tập tốt cho một số tính năng hệ vỏ.
Jeff Ferland

Kịch bản này straceđược đưa vào telnet, không phải trong quy trình Apache phục vụ nó.
BMDan

2

strace -p $(ss -npt|sed -n "/:$(ss -npt|sed -n '/telnet/s/^.*\?:\([0-9]\+\).*/\1/p') \+u/s/.*,\(.*\),.*/\1/p")

Miễn là bạn chỉ có một hoạt telnetđộng, stracemáy chủ này sẽ tương ứng nếu có.

Nếu không có cái nào ( ví dụ bạn telneted đến máy chủ bên ngoài lần cuối), stracesẽ thất bại vớistrace: option requires an argument -- 'p'


1
strace -p $(netstat -tnp|awk -F'[ /]+' "/:$(netstat -tnp|awk -F'[ :]+' 
"/\/telnet/{print \$5}") /&&/apache2/{print \$7}")

Hoặc, được định dạng để đọc dễ dàng hơn và với các cờ strace của OP còn nguyên vẹn:

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \
awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \
{print \$5}") / && /apache2/ {print \$7}")

Sự cố, trong cùng đầu tiên:

netstat -tnp | awk -F'[ :]+' "/\/telnet/ {print \$5}"

Chỉ cho tôi, không cần phân giải địa chỉ IP thành tên DNS, tất cả các kết nối TCP đang hoạt động. Đường ống để awk, in trường thứ năm trên bất kỳ dòng nào kết thúc /telnet, trong đó các trường được phân tách bằng một hoặc nhiều dấu cách và dấu hai chấm. Trường này sẽ là cổng nguồn.

Để cải thiện : Có thể trở nên mạnh mẽ hơn nhiều bằng cách thêm | head -n 1phần cuối hoặc phần ;exitbên trong của phần hành động, nhưng phiên bản gốc của bạn thiếu phần tương đương, vì vậy tôi không muốn làm phần này dài hơn.

netstat -tnp | awk -F'[ /]+' "/:**** / && /apache2/ {print \$7}")

Đây ****là phần tôi đã giải thích ở trên. Ở đây, tôi đang tìm kiếm bất kỳ dòng netstat -tnpnào có cùng cổng với cổng nguồn mà tôi đã khám phá ở trên và được sở hữu bởi Apache; khi tôi tìm thấy nó, tôi in trường thứ bảy (được giới hạn bởi một hoặc nhiều dấu cách hoặc dấu gạch chéo). Đây là PID của đứa trẻ Apache.

Để cải thiện : Bên cạnh việc chỉ trả lại một PID (thông qua các phương thức tương tự như trên), điều lớn nhất tôi có thể tưởng tượng là phân biệt đối xử hơn khi thực sự khớp với dport trái ngược với một thứ khác chỉ phù hợp với mô hình. Điều này có thể dễ dàng thực hiện bằng cách thêm dấu hai chấm vào FS ( -F), nhưng sự cố xảy ra trong các tình huống hỗn hợp giữa IPv4 và IPv6, trong đó có thể có dấu hai chấm trong chính địa chỉ và do đó có thể trở nên khó chịu khá nhanh. Điều này có vẻ khá mạnh mẽ, đặc biệt là với không gian dấu.

sudo strace -o /tmp/strace -f -s4096 -r -p

Đây là một bản sao trực tiếp từ câu hỏi ban đầu của bạn; Tôi đã không sửa đổi nó trong ít nhất.

Nếu bạn cho phép tôi thêm một vài ký tự, phiên bản tôi sẽ chạy có thể là:

sudo strace -o /tmp/strace -f -s4096 -r -p $(netstat -tnp | \
awk -F'[ /]+' "/:$(netstat -tnp | awk -F'[ :]+' "/\/telnet/ \
{print \$5;exit}") / && /apache2/ {print \$7;exit}")

0

Hãy thử điều này, hy vọng nó sẽ giúp:

sudo strace -o /tmp/strace -f -s4096 -r -p `netstat -antlp | \
  grep telnet | sed -e "s/^.*ESTABLISHED\ \|\/.*$//g"`

Câu trả lời sẽ đẹp hơn nếu bạn không phải cuộn sang bên phải để xem tất cả.
djangofan

Đây stracelà vào telnet, không phải Apache.
Pierre Carrier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.