我在家用路由器上运行嵌入式Linux固件。当我以root身份从终端逐个运行以下命令时,它可以正常工作并且没有任何错误。我知道这不是一个安全的政策。这只是为了测试一些东西。
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -X
iptables -A INPUT -p tcp -i eth1 --dport 4444 -j ACCEPT
但是,如果以root身份在bash脚本中运行,则
#!/bin/bash
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -X
iptables -A INPUT -p tcp -i eth1 --dport 4444 -j ACCEPT
它出现以下错误:
iptables: Bad policy name. Run `dmesg' for more information.
iptables: Bad policy name. Run `dmesg' for more information.
iptables: Bad policy name. Run `dmesg' for more information.
iptables: No chain/target/match by that name.
iptables: No chain/target/match by that name.
我已经确认bash脚本的最后一行执行没有错误,并且可以在iptables中看到该条目。但是,所有其他行都会产生错误。我究竟做错了什么?令人惊讶的是,相同的批处理脚本在我的Ubuntu机器上运行良好。
答案 0 :(得分:2)
您是否在Windows中创建了脚本,或者以其他方式创建了Windows行结尾(CRLF),其中路由器期望Unix行结尾(LF)?
这将导致解释器在每个命令的末尾读取一个额外的不可打印的字符,这将显示错误。
您可以通过运行cat -v myScript.sh
进行检查。不正确的Windows行结尾将显示为:
iptables -P INPUT ACCEPT^M
iptables -P FORWARD ACCEPT^M
iptables -P OUTPUT ACCEPT^M
iptables -F^M
iptables -X^M
iptables -A INPUT -p tcp -i eth1 --dport 4444 -j ACCEPT