我有一个脚本,可以扫描打开的FTP端口的IP地址,然后将该IP地址输入到MySQL数据库中。但是,在运行脚本时,我会收到以下消息:
第1行的错误1064 (42000):您的SQL语法出现错误;请检查与您的MySQL服务器版本对应的手册,以获得在第1行的用户(ip)值(192.168.1.104)附近使用的正确语法。
我已经设置了数据库,并将其命名为“nmapscans”,表名为“用户”,字段名为“ip”,数据类型为int(20)。
以下是我不完整的剧本:
#!/bin/bash
ipadd=`ifconfig wlan0 | awk '/inet / {print $2}' | cut -d: -f2`
nmap -sV $ipadd -p 21 -oG ftp1 ; cat ftp1 | grep closed > ftp2
cut -d: -f2 ftp2 | cut -d"(" -f1 > ftp3
#cat ftp3
function checkDatabase {
RESULT=`mysql -u root -pQwerty17 --skip-column-names -e "SHOW DATABASES LIKE 'nmapscans'"`
if [ "$RESULT" == "nmapscans" ]; then
echo "Database exists"
else
echo "Database does not exist"
fi
}
checkDatabase && echo $?
echo "INSERT INTO users (ip) VALUES ("100");" | mysql -uroot -pQwerty17 nmapscans;
function input_data {
#if [[ checkDatabase ]]
inputfile="ftp3"
cat $inputfile | while read ip; do
echo "$ip"
echo "INSERT INTO users (ip) VALUES ("$ip");"
done | mysql -uroot -pQwerty17 nmapscans;
#fi
}
input_data && echo $?
if [[ input_data == 0 ]]
then
echo "it worked" && rm ftp1 ftp2 ftp3
else
echo "it failed"
fi
exit发布于 2014-07-24 17:47:52
在IP语句之间回显mysql insert。Mysql不知道该怎么处理它。只需删除echo "$ip"行即可。
更改:
function input_data {
#if [[ checkDatabase ]]
inputfile="ftp3"
cat $inputfile | while read ip; do
echo "$ip"
echo "INSERT INTO users (ip) VALUES ("$ip");"
done | mysql -uroot -pQwerty17 nmapscans;
#fi
}至:
function input_data {
#if [[ checkDatabase ]]
inputfile="ftp3"
cat $inputfile | while read ip; do
echo "INSERT INTO users (ip) VALUES ("$ip");"
done | mysql -uroot -pQwerty17 nmapscans;
#fi
}也是关于你关于返回声明的问题。更改:
input_data && echo $?
if [[ input_data == 0 ]]
then
echo "it worked" && rm ftp1 ftp2 ftp3
else
echo "it failed"
fi
exit至:
input_data
if [[ $? == 0 ]]
then
echo "it worked" && rm ftp1 ftp2 ftp3
else
echo "it failed"
fi
exit发布于 2014-07-24 17:14:43
你只会错过适当的引用:
echo "INSERT INTO users (ip) VALUES ('"$ip"');"
# ^ ^因此,IP地址被引用为字符串,从而产生(现在有效) SQL语句:
INSERT INTO users (ip) VALUES ('192.168.1.104');发布于 2014-07-25 04:15:16
至少有两种方法可以向用户显示消息,同时仍然能够将其他人重定向到预期的输出。cat在这里也是不必要的。最好别惹麻烦。
将消息发送给stderr (默认的&2):
while read ip; do
echo "$ip" >&2
echo "INSERT INTO users (ip) VALUES ($ip);"
done < "$inputfile" | mysql -uroot -pQwerty17 nmapscans;使用具有进程替换的其他文件描述符:
while read ip; do
echo "$ip"
echo "INSERT INTO users (ip) VALUES ($ip);" >&4
done < "$inputfile" 4> >(exec mysql -uroot -pQwerty17 nmapscans)这也是一个好主意,不要把你的变量放在公开,以防止分裂词。它可能现在不适用,但它仍然是一个良好的做法。注意我是如何修复它的:
echo "INSERT INTO users (ip) VALUES ($ip);"根据您的选择,您还可以添加引号:
echo "INSERT INTO users (ip) VALUES ('$ip');"https://stackoverflow.com/questions/24939924
复制相似问题