5_POWERSHELLの覚書 ネットワーク内の疎通を確認する

特定の範囲内のネットワーク機器にpingをうち、疎通のあるものは

「結果あり」ないものは「結果なし」と表示する。
自分の管理外のネットワークに対して行うと偵察・攻撃とみなされる場合があるので注意が必要。

 

#Windowを作成するおまじない。
$rui = $host.UI.RawUI
$rui.WindowSize = New-Object System.Management.Automation.Host.Size(80,30)

while($true){

    for($i = 1;$i -ne 11;$i++){

        $add = "192.168." + $i + ".1"    #192.168.1.1~192.168.1.10に対してpingをうつ
        $ret = Test-Connection $add -Quiet
        if($ret){
            write-host $add
            write-host "□□□ 疎通あり! □□□"
        } else {
            write-host $add
            write-host "■■■ 疎通なし!■■■"
        }
    }

pause
Clear-Host
}

4_POWERSHELLの覚書 リストに一致する行を抽出

test.ps1を実行するとwindowが起動するので、sc.csvドラッグアンドドロップして
エンターキーを押せばsc.csvの条件でmap.csvのStationを抽出してくれる。

map.csv

id Station number
1 清瀬 30
2 東久留米 40
3 ひばりが丘 50
4 保谷 60
5 大泉学園 70
6 石神井公園 80

sc.csv

40
50


test.ps1

#windowを表示するおまじない
$rui = $host.UI.RawUI
$rui.WindowSize = New-Object System.Management.Automation.Host.Size(80,30)

Write-Host "csvをドラグアンドドロップしてください。"

#csvファイル名とパスを読み込む
$ps = Read-Host

$sta = Import-Csv .\map.csv -Encoding UTF8
$ps2 = Get-Content $ps -Encoding UTF8

while($True){
    # それぞれのテーブルを表示する。
    $sta | Format-Table
    $ps2 | Format-Table

    #テーブルの条件でcsvを抽出する。

    $aaa = $sta | Where-Object -FilterScript {$ps2 -contains $_.number}
    write-host $aaa."Station"

    pause
    Clear-Host
}

3_POWERSHELLの覚書 リストに一致する条件をCSVから取得

タイトルどおりです。わかりにくいですがそのうちまとめます。

map.csv

Station number
清瀬 30
東久留米 40
ひばりが丘 50
保谷 60
大泉学園 70
石神井公園 80
練馬 90
桜台 92
東長崎 97
椎名町 98
池袋 99

sc.csv

name add shubetu
1 127.30.0.1 ABC
2 127.70.8.9 XYZ
3 127.80.7.5 XYZ
4 127.50.6.2 ABC
5 127.60.6.2 XYZ
6 127.40.6.2 XYZ
7 127.90.7.6 ABC
8 127.92.6.3 XYZ
9 127.98.6.3 XYZ
10 127.92.6.3 ABC
11 127.99.6.3 XYZ

 

test.ps1

# Windowを作成するおまじない
$rui = $host.UI.RawUI
$rui.WindowSize = New-Object System.Management.Automation.Host.Size(80,30)

# CSVファイルの読み込み
$map = Import-Csv .\map.csv -Encoding utf8
$sc = Import-Csv ./sc.csv -Encoding utf8

# 関数を作成する
function search($types,$F_or_L){
$desk = $sc | Where-Object {$F_or_L -eq $_."shubetu"} | Select-Object add | select -Expandproperty "add"

# %はForEach-Objectの省略形
$new_key = $desk | % { $_.Split(".")[1] } |Sort-Object| Get-Unique

$result = $map | Where-Object -FilterScript {$new_key -contains $_.number}
#これではダメ$aaa = $map | Where-Object -FilterScript {$_.number -contains $new_key}


write-host "--------------------"$types "結果------------------------"
Write-Host ""
for($i=0;$i -lt $result.length;$i++){
Write-Host $result[$i]."Station"
}
write-host ""
write-host "-----------------------------------------------------"
}

search "First" "ABC"
search "Last" "XYZ"

pause

POWERSHELLの覚書2

map.csv

id

station number
1 池袋 30
2 練馬 40
3 石神井公園 50
4 ひばりが丘 60
5 所沢 70
6 飯能

80

 

station名を入力すると127.0.0.*の*をnumberに変更してpingを打つpowershell
(なんのこっちゃ)

 

ping.ps1
#Windowを作成するおまじない。
$rui = $host.UI.RawUI
$rui.WindowSize = New-Object System.Management.Automation.Host.Size(80,30)

#CSVファイルを読み込む
$sta = Import-Csv .\map.csv -Encoding UTF8

while($true){
write-host "駅名を入力してください。"
write-host ""
$Search_STA = Read-Host
write-host ""
$Result = $sta | Where-Object -FilterScript { $Search_STA -contains $_.Station}
write-host "------------------------------------------------------"
if ($Result -ne $null){
write-host $Search_STA "のIDは" $Result."number" "です。"
$IP = "127.0.0." + $Result."number"
write-host $IP
ping $IP -t -l 0

} else{
write-host "お探しの駅は見つかりませんでした"
}
write-host "------------------------------------------------------"
write-host ""
pause
Clear-Host
}

POWERSHELLの覚書1

#windowを作成するおまじない
$rui = $host.UI.RawUI
$rui.WindowSize = New-Object System.Management.Automation.Host.Size(80,30)

 

#CSVファイルの読み込み
$sta = Import-Csv .\map.csv -Encoding UTF8

 

#文字出力

write-host

#文字受け入れ

read-host

#一時停止

pause

#windowに表示されている文字を消去

clear-host

#ループ

while($true){}

#プロセスの5行(一番下)だけ表示 firstは上の5行
get-process | select-object -Last 5

 

#どんなプロパティ(表の表題)があるのかを調べる。
get-process | Get-Member

 

#別ウィンドウでコマンドを実行する

start cmd -ArgumentList "/c ping $IP -t -l 0"

 

#grepみたいに使える

Get-Item .\*.txt | Select-String "test" -Context 1
-Context :前後の行数を指定できる。

 

pythonではまった話

以下のようにCSVファイルの1行目にaaa,bbb,cccという文字を入力するコードを書いて実行しました。
sample.py

f:id:marbles_stone:20201127212740p:plain

下が実行結果です。「csvはwriter属性を持っていません」みたいなことを言われていますが意味不明です。持ってるじゃないですか。 

f:id:marbles_stone:20201127213734p:plain

コードをいくら書き換えても同じエラーしかでないのでgoogleに頼ることにしました。トップに表示されたのはインポートしたモジュールとファイル名が同じではダメというものです。

でも私が作ったファイル名はsample.pyです。全然違うじゃないですか。

 しばらくしてから犯人を見つけました。

f:id:marbles_stone:20201127214322p:plain

そうです同一ファイル内にcsv.pyというファイルが存在していたのです。つまりコード内のimport csvは正規のcsvモジュールではなく、こいつを読み込んでいたのです。

 

こんなアホなことがあるんだと思い記事にしてしまいました。

 

#AttributeError: partially initialized module 'csv' has no attribute 'writer' (most likely due to a circular import)