如何解决在bash中调用该函数不会产生正确的结果
我从这篇不错的文章中摘录了代码:https://catonmat.net/tcp-port-scanner-in-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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。