Bash AWKまたはIFステートメント

Bash AWKまたはIFステートメント

変数の数を調べて、出力を生成するスクリプトを作成しようとしています。つまり、pingを使用し、ttyに基づいてLinuxまたはWindowsを実行していることを確認します。仕事は複雑すぎるかもしれませんが、これは私が得たものです。

#!/bin/bash
var1=$(ping $1 -c 1) | awk '{if("$var1"=="128") print "Host is LIVE Running: Windows OS"}'

出力を生成しません。 awkを使わずにIF文を使ってみましたが、接続できないとわかっているIPを入力すると出力は生成されません。

#!/bin/bash
var1=$(ping $1 -c 1)
if [[ "$var1" == *"128"* ]]; then
echo "Host is LIVE Running: Windows OS"
elif [[ "$var1" == *"64"* ]]; then
echo "Host is LIVE Running: Linux OS"
elif [[ "$var1" == *"Unreachable"* ]]; then
echo "Host appears DOWN!"
fi

建設的な批判を歓迎します!ありがとうございます。

答え1

awk環境で変数を使用するには、変数を設定する必要があります。このように:

var1=$(ping $1 -c 1) ; awk -v var2=$var1 '{if(var2 == 128)....

数値を比較するときは、bash次のものを使用する必要があります。

if [[ "$var1" -eq *"128"* ]]; then...

=文字列の場合とAFAIKのbash両方を使用できます。これは同じ意味です(から)。===if

答え2

スクリプトが機能しないいくつかの理由は次のとおりです。

  1. $var1awk内にシェル変数はありません。
  2. それでも、"$var1"awkではあなたが思うことを意味しません。リテラルテキストなので、$var1引用符がない場合は、変数の値としてフィールド番号を間接的に指定しますvar1(例:var1が2に等しい場合は、field2に$ 2が入力されます)。 awkで初期化されていない変数の値は0なので、$ 0またはフル入力行になります。
  3. $var1pingBashにはttl値だけでなく、コマンドの完全な出力も含まれます。
  4. ICMPエコー応答パケットのTTL値を使用してリモートホストのオペレーティングシステムを確認することは信頼できない方法です。 WindowsはTTL 128を使用する唯一のオペレーティングシステムではありません(すべてのWindowsバージョンが128を使用しているわけではありません)。

答え3

完了しました。応援していただきありがとうございます。このコードは、一見するとどのオペレーティングシステムであるかをよりよく理解するのに役立ちます。

#!/bin/bash
var1=$(ping $1 -c 1 -W 3 | grep "64 bytes" | cut -d " " -f 6)
if [[ "$var1" -eq "ttl=63" ]]; then
echo "Host is LIVE! Most likely running: Linux OS"
elif [[ "$var1" -eq "ttl=64" ]]; then
echo "Host is LIVE! Most likely running: Linux OS"
elif [[ "$var1" -eq "ttl=127" ]]; then
echo "Host is LIVE! Most likely running: Windows OS"
elif [[ "$var1" -eq "ttl=128" ]]; then
echo "Host is LIVE! Most likely running: Windows OS"
elif [[ "$var1" -eq "ttl=31" ]]; then
echo "Host is LIVE! Most likely running: Windows 95 OS"
elif [[ "$var1" -eq "ttl=32" ]]; then
echo "Host is LIVE! Most likely running: Windows 95 OS"
elif [[ "$var1" -eq "ttl=255" ]]; then
echo "Host is LIVE! Most likely running: MAC / OPENBSD / CISCO / SOLARIS OS"
elif [[ "$var1" -eq "ttl=254" ]]; then
echo "Host is LIVE! Most likely running: MAC / OPENBSD / CISCO / SOLARIS OS"
elif [[ "$var1" == "" ]]; then
echo "Host appears to be DOWN!"
fi

関連情報