问题描述
我从这篇不错的文章中摘录了代码: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