在bash中调用该函数不会产生正确的结果

问题描述

我从这篇不错的文章中摘录了代码:https://catonmat.net/tcp-port-scanner-in-bash

它使用功能scan。当我复制代码时,它对我不起作用。

我以前在bash函数上遇到过类似的问题,也找不到解决方法。

我尝试直接在脚本中以这种方式调用该函数:

#!/bin/bash

scan() {
  if [[ -z $1 || -z $2 ]]; then
    echo "Usage: $0 <host> <port,ports,or port-range>"
    return
  fi

  local host=$1
  local ports=()
  case $2 in
    *-*)
      IFS=- read start end <<< "$2"
      for ((port=start; port <= end; port++)); do
        ports+=($port)
      done
      ;;
    *,*)
      IFS=,read -ra ports <<< "$2"
      ;;
    *)
      ports+=($2)
      ;;
  esac

  for port in "${ports[@]}"; do
    alarm 1 "echo >/dev/tcp/$host/$port" &&
      echo "port $port is open" ||
      echo "port $port is closed"
  done
}

scan

我也尝试过$(scan)-效果不佳。

结果-它不想扫描任何东西(我认为应该运行一些东西才能调用该函数-代码看起来不错):

$ ./scan.sh google.com 22-99
Usage: ./scan.sh <host> <port,or port-range>
$ ./scan.sh scan google.com 22-99
Usage: ./scan.sh <host> <port,or port-range>

我想念什么?这不是我第一次遇到类似的问题。


P.S。正如已经建议的那样,scan "$1" "$2"做得很好。但是,现在从其他函数调用此函数时遇到了类似的问题:

function dosmth {
while test $# -gt 0; do
           case "$1" in
                -t)
                    shift
                    scan "$1" "$2"
                    shift
                    ;;
                *)

exit 1
                   ;;
          esac
  done
}

dosmth $1

我也尝试过dosmth "$1" "$2"-问题仍然存在。

现在,dosmth函数可以正常运行,但是scan的结果与之前类似,不扫描任何内容。

$ ./dosmt.sh -t google.com 80
Usage: -t ./dosmt.sh <host> <port,or port-range>


我的解决方案可能会对某人有所帮助-我更改为: dosmth "$1" "$2" "$3"

解决方法

如果函数是通过脚本运行的,则需要将args从脚本传递给函数

...
scan "$1" "$2"

当功能从另一个功能运行时同样如此,您必须将args从“父”功能传递给“子”功能。

fun1() {
    echo "fun1 $1 $2"
}

fun2() {
    fun1 "$1" "$2"
}

fun2 "$1" "$2"

从这个args($ 1,$ 2,$ 3 ...)创建具有适当名称的vars也是一个好习惯,

#!/bin/bash
script=$0
host=$1
port_range=$2
ports=()

scan() {
  if [[ -z $host || -z $port_range ]]; then
    echo "Usage: $script <host> <port,ports,or port-range>"
    return
  fi

  case $port_range in
    *-*)
      IFS=- read start end <<< "$port_range"
      for ((port=start; port <= end; port++)); do
        ports+=($port)
      done
      ;;
    *,*)
      IFS=,read -ra ports <<< "$port_range"
      ;;
    *)
      ports+=($port_range)
      ;;
  esac

  for port in "${ports[@]}"; do
    alarm 1 "echo >/dev/tcp/$host/$port" &&
      echo "port $port is open" ||
      echo "port $port is closed"
  done
}

scan

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...