Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 解析外部命令输出并另存为变量_Bash_Parsing_Scripting_Grep_Nmap - Fatal编程技术网

Bash 解析外部命令输出并另存为变量

Bash 解析外部命令输出并另存为变量,bash,parsing,scripting,grep,nmap,Bash,Parsing,Scripting,Grep,Nmap,我正在尝试制作一个脚本,该脚本可以针对ip运行nmap,并告诉我主机是否像操作系统一样正常。我希望主机和操作系统的细节是唯一的输出 ip=$1 nmap -O $ip |while read -r line; do if [[ `echo $line|grep "1 host up"`] !=0] then echo "1 Host is up" else echo "No Host" fi done 我在这方面做得很差,所以您能给我的任何帮助都将不胜感激:) 编辑:根据请求进

我正在尝试制作一个脚本,该脚本可以针对ip运行nmap,并告诉我主机是否像操作系统一样正常。我希望主机和操作系统的细节是唯一的输出

ip=$1
nmap -O $ip |while read -r line; do
if [[ `echo $line|grep "1 host up"`] !=0]
then
    echo "1 Host is up"
else
    echo "No Host"
fi
done
我在这方面做得很差,所以您能给我的任何帮助都将不胜感激:)

编辑:根据请求进行NMap输出示例

Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-16 13:18 EDT
Nmap scan report for hostname.domain.com (192.168.1.5)
Host is up (0.00028s latency).
Not shown: 997 closed ports
PORT    STATE SERVICE
135/tcp open  msrpc
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds
MAC Address: 78:2B:CB:7E:C7:74 (Unknown)
Device type: general purpose
Running: Microsoft Windows XP
OS details: Microsoft Windows XP SP2 or SP3, or Windows Server 2003
Network Distance: 1 hop

OS detection performed. Please report any incorrect results at http://nmap.org/submit/ 
Nmap done: 1 IP address (1 host up) scanned in 2.44 seconds

你把事情复杂化了一点。您的命令可以这样重新编写:

if grep "1 host up" <(nmap -O "$i")
then 
    echo "UP"
else 
    echo "DOWN"
fi
grep "1 host up" <(nmap -O "$i") && echo "UP" || echo "DOWN"

如果grep“1主机启动”您可以尝试以下内容:

#! /bin/bash

host=whatever

while read -r line ; do
    if [[ $line =~ ([0-9])+\ hosts?\ up ]] ; then
        host_up="${BASH_REMATCH[1]}"
    elif [[ $line =~ OS\ details:\ (.*) ]] ; then
        host_os="${BASH_REMATCH[1]}"
    fi
done < <(nmap -O $host)

echo "Up: $host_up OS: $host_os"
#/bin/bash
主机=随便什么
而read-r行;做
如果[[$line=~([0-9])+\hosts?\up]];然后
host_up=“${BASH_重新匹配[1]}”
elif[$line=~OS\details:\(.*)];然后
host_os=“${BASH_重新匹配[1]}”
fi

太感谢你了!这在上半场帮助了我。有没有可能让它在一个变量中给我主机的详细信息,或者至少把它们回显出来?@user163161到底是哪一个详细信息?你是说
OS-details:
?@user163161类似于
OS=$(nmap-O“$i”| sed-n”/OS-details:/s/OS-details://p);echo“$os”
应该为您做到这一点。在这里,流程替代与简单的管道(
nmap-O“$i”| grep“1主机启动”
)相比没有任何好处。