在Bash脚本中将Linux命令输出插入MySQL

时间:2014-07-24 17:09:20

标签: mysql linux bash

我有一个脚本扫描开放FTP端口的IP地址,然后将该IP地址输入MySQL数据库。但是,在运行脚本时,我收到以下消息:

"第1行的错误1064(42000):您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在' 192.168.1.104附近使用正确的语法 INSERT INTO用户(ip)VALUES(192.168.1.104)'在第1行"

我已经设置了数据库,并将其命名为“nmapscans'用一个名为' users'的表格和字段名称' 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

3 个答案:

答案 0 :(得分:3)

您在IP语句之间回复了mysql insertMysql不知道如何处理。只需删除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

答案 1 :(得分:2)

你只错过正确的引用:

    echo "INSERT INTO users (ip) VALUES ('"$ip"');"
    #                                    ^     ^

因此,IP地址被引用为字符串,产生该(现在有效的)SQL语句:

INSERT INTO users (ip) VALUES ('192.168.1.104');

答案 2 :(得分:1)

至少有两种方法可以向用户显示消息,同时仍然可以将其他人重定向到预期的输出。此处也不需要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');"