नेटस्टैट मुद्दे का उपयोग करते हुए पोर्ट के रूप में एक ही लाइन पर प्रक्रिया दिखाने के लिए पॉवर्सशेल वन-लाइनर


3

पहले मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि उपयोगकर्ता एरिक बिटेमो को उस मूल कोड का श्रेय देता है जिसका मैं यहां उपयोग कर रहा हूं। आउटपुट वह है जिसे मैं एक अपवाद के साथ देख रहा हूं: बंदरगाहों में से एक गायब हो जाता है और "सिस्टम सिस्टम 5" अपनी जगह दिखाता है और मैं यह पता नहीं लगा सकता कि ऐसा क्यों हो रहा है।

लक्ष्य: सभी टीसीपी (श्रवण) और यूडीपी पोर्ट और एक ही लाइन पर प्रत्येक के साथ जुड़ी प्रक्रिया दिखाएं।

एक लाइनर का इस्तेमाल किया जा रहा है:

$nets = netstat -bano|select-string 'LISTENING|UDP'; foreach ($n in $nets)    {    $p = $n -replace ' +',' ';    $nar = $p.Split(' ');    $pname = $(Get-Process -id $nar[-1]).ProcessName;    $n -replace "$($nar[-1])","$($ppath) $($pname)";     }

उदाहरण आउटपुट:

TCP 0.0.0.0:135 0.0.0.0 लिस्टेनिंग svchost को बढ़ाता है
TCP 0.0.0.0: System System5 0.0.0.0 लिस्टेनिंग सिस्टम का उपयोग करता है
TCP 0.0.0.0:623 0.0.0.0 LISTENING LMS को बढ़ाता है

जिस पोर्ट में परिवर्तन होता है वह 445 है, लेकिन मुझे नहीं पता कि यह केवल उसी को क्यों बदल रहा है, जब बाकी पोर्ट उद्देश्य के अनुसार काम कर रहे हैं। स्क्रिप्ट 445 को "सिस्टम सिस्टम 5" में क्यों बदल रहा है?

अन्य उपकरणों का उपयोग करना दुर्भाग्य से संभव नहीं है, इसलिए मैं अंतर्निहित विंडोज टूल का उपयोग करने के लिए सीमित हूं।


कृप्या संपादित करें प्रश्न और से कच्चे उत्पादन प्रदान करते हैं netstat -bano|select-string 'LISTENING|UDP'
DavidPostill

जवाबों:


3

$p कुछ ऐसा हो सकता है TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 तथा $nar[-1] स्ट्रिंग है 4 इसलिए -replace ऑपरेटर लेता है सब 4 रों:

TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
            ↑↑                      ↑

केवल अंतिम घटना की जगह बल $nar[-1] का उपयोग करते हुए पंक्ति का अंत लंगर (फरार) $ ):

$p -replace "$($nar[-1])`$","$ppath $pname"

साथ ही पढ़ें मैट का जवाब स्ट्रिंग में प्रतिस्थापन की अंतिम घटना की जगह स्टैकओवरफ्लो पर।

Btw:

  • $ppath परिभाषित नहीं है…
  • …तथा netstat -ano पर्याप्त होना चाहिए (ध्यान दें कि -b विकल्प समय लेने वाला हो सकता है और तब तक विफल रहेगा जब तक आपके पास पर्याप्त अनुमति न हो)।

आपने कुछ के लिए समस्या पाई। यदि आप उत्सुक हैं तो मैंने इस मुद्दे के लिए सुझाव भी दिए हैं।
Matt

3

जोसेफज का जवाब अपने मुद्दे को पूरी तरह से समझाता है। आप regex का उपयोग कर रहे हैं और यह वही कर रहा है जो आप इसे करने के लिए कह रहे हैं कि शायद आप अपनी अपेक्षा से अधिक की जगह लें।

एक साइड नोट यह है कि आप पूछ रहे हैं netstat सेवा मेरे

प्रत्येक कनेक्शन या श्रवण पोर्ट बनाने में शामिल निष्पादन योग्य प्रदर्शित करता है

बी स्विच के साथ। हालाँकि आप इसे छोड़ रहे हैं select-string चूँकि वह प्रक्रिया दूसरे डेटा के बाद अपनी लाइन पर दिखाई देती है। यह दुनिया का अंत नहीं है, लेकिन क्योंकि आप चीजों का उपयोग कर सकते हैं -Context का Select-String उसे पाने के लिए लेकिन उस समय को और करीब से देखना होगा।

मैं अन्य सुझाव देना चाहूंगा कि इस स्थिति में आप क्या कर सकते हैं।

अन्य उपकरणों का उपयोग करना दुर्भाग्य से संभव नहीं है इसलिए मैं अंतर्निहित विंडोज टूल का उपयोग करने के लिए सीमित हूं।

उस बारे में मजेदार बात, क्या आपके पास कम से कम विंडोज 8 है? यदि आप करते हैं तो आप बस का उपयोग कर सकते हैं Get-NetTCPConnection cmdlet जो अनिवार्य रूप से है netstat वस्तु रूप में।

तो आप ऐसा कर सकते हैं जो आपको परेशानी के बिना एक ही जानकारी मिलनी चाहिए

get-nettcpconnection | select local*,remote*,state,@{Name="Process";Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}

विंडोज 8+ नहीं है? ठीक है तो हम आपकी पार्सिंग स्क्रिप्ट पर सुधार कर सकते हैं। ऑब्जेक्ट बनाने के लिए इसे एक कदम आगे ले जाने से रेगेक्स मिलान के साथ समस्या को रोका जा सकेगा।

netstat -ano | Where-Object{$_ -match 'LISTENING|UDP'} | ForEach-Object{
    $split = $_.Trim() -split "\s+"
    [pscustomobject][ordered]@{
        "Proto" = $split[0]
        "Local Address" = $split[1]
        "Foreign Address" = $split[2]
        # Some might not have a state. Check to see if the last element is a number. If it is ignore it
        "State" = if($split[3] -notmatch "\d+"){$split[3]}else{""}
        # The last element in every case will be a PID
        "Process Name" = $(Get-Process -Id $split[-1]).ProcessName
    }
}

यदि आप PowerShell v2 तक सीमित थे, तो आपको psobject को बदलने और कलाकारों का आदेश देने की आवश्यकता होगी

netstat -ano | Where-Object{$_ -match 'LISTENING|UDP'} | ForEach-Object{
    $split = $_.Trim() -split "\s+"
    New-Object -Type pscustomobject -Property @{
        "Proto" = $split[0]
        "Local Address" = $split[1]
        "Foreign Address" = $split[2]
        # Some might not have a state. Check to see if the last element is a number. If it is ignore it
        "State" = if($split[3] -notmatch "\d+"){$split[3]}else{""}
        # The last element in every case will be a PID
        "Process Name" = $(Get-Process -Id $split[-1]).ProcessName
    }
} | Select "Proto", "Local Address", "Foreign Address", "State", "Process Name" 

अंतिम select कथन संपत्ति के आदेश की गारंटी देता है, जिसे अन्यथा फेरबदल किया जाएगा, और यह कार्यात्मक समकक्ष है [ordered]

ताकि आप इस तरह से आउटपुट करेंगे ...

Proto Local Address Foreign Address State     Process Name  
----- ------------- --------------- -----     ------------  
TCP   0.0.0.0:135   0.0.0.0:0       LISTENING svchost       
TCP   0.0.0.0:445   0.0.0.0:0       LISTENING System        
TCP   0.0.0.0:1279  0.0.0.0:0       LISTENING PlexDlnaServer
TCP   0.0.0.0:2869  0.0.0.0:0       LISTENING System  

तब आप ऐसा व्यवहार कर सकते हैं जैसे आप किसी भी PowerShell ऑब्जेक्ट और फ़िल्टर करते हैं जैसा कि आप CSV या आपको जो कुछ भी करने की आवश्यकता है, वह फिट या आउटपुट दिखाई देता है। यह अब संरचित है।

अपने PowerShell संस्करण के आधार पर आप उपयोग भी कर सकते हैं Convert-FromString जो सिंगल लाइन स्ट्रिंग्स लेता है और उन्हें ऑब्जेक्ट्स में भी परिवर्तित करता है। ऊपर देखने के लिए कुछ और।


यह बहुत मददगार था। तुम्हारे सहयोग के लिए तुम्हे धन्यवाद।
Ric

आपका समाधान आदर्श होगा लेकिन ऐसा लगता है कि इसके लिए कम से कम पॉवरशेल 3 या 4 की आवश्यकता है। जब विंडोज 7 मशीन पर चलाया जाता है तो यह तुरंत समाप्त हो जाता है। क्या इससे बचने के लिए कोई बदलाव करना संभव है? त्रुटि है "टाइप करने में असमर्थ [आदेशित]: सुनिश्चित करें कि इस प्रकार युक्त विधानसभा भरी हुई है।"
Ric

1
उन जातियों के लिए हाँ एक मुद्दा होगा। हालांकि पता करने के लिए आसान है। मैं आपके लिए एक त्वरित अपडेट जोड़ूंगा।
Matt

प्रक्रिया की जानकारी विंडोज 2012 (गैर-आर 2) में उपलब्ध नहीं है। सबसे अधिक संभावना है कि यह विंडोज 8.0 में भी उपलब्ध नहीं है।
Thorarin

0

अधिक सरल...

filter timestamp {"$(Get-Date -Format G): $_"};netstat -abno 1 | Select-String -Context 0,1 -Pattern LISTENING|timestamp
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.