在Linux服务器上,FTP 命令 手动执行没有问题,但是用脚本文件执行时 会报 ?Invalid command。
脚本如下:
USER="usrZTTlogixInf"
PASS="usrZTTlogixInf"
serverIp="172.31.129.169"
ftp -i -v -n ${serverIp} <<EOF
user ${USER} ${PASS}
pass
bye
EOF
echo "ftp download successfully"
(172.31.129.169).1.129.169
220 (vsFTPd 2.2.2)
331 Please specify the password.
230 Login successful.
?Invalid command
?Invalid command
221 Goodbye.
ftp download successfully
你在bye前加个ftp:试试呢
user ${USER} ${PASS}
pass
改为
user ${USER}
pass ${PASS}
试一下!
标准且正确的命令会报错?又是一个玄学bug吗
我的同事们一起讨论找到了原因和解决方案:
原因是脚本文件的编码错误。
解决办法是:sed -i 's/\r//' FTP_test.sh
linux运行shell脚本的话,估计是脚本文件中的语法或者哪里有问题,脚本文件的个别编码的错误。
原因:Shell脚本在Windows系统编写时,每行结尾是\r\n,而在Linux系统中行每行结尾是\n,在Linux系统中运行脚本时,会认为\r是一个字符,导致运行错误。
解决办法:在shell脚本所在目录执行语句:
sed -i 's/\r//' test.sh
test.sh:为脚本名称
应该是脚本文件中的语法有问题,你可以用排除法测试下,就是将脚本中的命令行先注释掉一部分,然后运行下,多次测试,看看是哪几行有问题,然后针对性的修改
1.到服务器的IIS的FTP中修改网站默认的端口号,例如:4722
8ee3eb0bccddb5e5303d645d36084473.png
2.到服务器的防火墙中,添加两个例外端口号,例如:4721、4722
a1d1c317149bc59a7940c070ded9cd1d.png
3.开启刚刚添加的这两个端口号,在开始→运行中输入cmd回车,分别输入以下两行代码并执行。
cd c:InetpubAdminScripts
adsutil.vbs set /MSFTPSVC/PassivePortRange "4721-4722"
如果在执行第二条代码时出现this script does not work with wscript等类似错误提示,则需要在前面加cscript.exe,然后重新执行!
this script does not work with wscript
Object required
ErrNumber:424(0x1A8)
to run this script using cscript,type:"CScript.exe adsutil.vbs",
如遇错误不能执行,则请直接使用以下代码替换第二条代码并重新执行。
cscript.exe adsutil.vbs set /MSFTPSVC/PassivePortRange "4721-4722"
设置完成后,重启一下IIS即可。
a38c8f92df7b1c301805ceeb0fdc9a0c.png
4.最后在FTP软件中重新设置刚刚重新分配的端口号,数据连接类型建议使用PASV,部分FTP软件中叫做“被动防火墙”设置。