首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Bash脚本中将Linux命令输出插入MySQL

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

Stack Overflow用户
提问于 2014-07-24 17:09:19
回答 3查看 3.7K关注 0票数 2

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

第1行的错误1064 (42000):您的SQL语法出现错误;请检查与您的MySQL服务器版本对应的手册,以获得在第1行的用户(ip)值(192.168.1.104)附近使用的正确语法。

我已经设置了数据库,并将其命名为“nmapscans”,表名为“用户”,字段名为“ip”,数据类型为int(20)。

以下是我不完整的剧本:

代码语言:javascript
运行
复制
#!/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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-24 17:47:52

IP语句之间回显mysql insertMysql不知道该怎么处理它。只需删除echo "$ip"行即可。

更改:

代码语言:javascript
运行
复制
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 
}

至:

代码语言:javascript
运行
复制
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 
}

也是关于你关于返回声明的问题。更改:

代码语言:javascript
运行
复制
input_data && echo $?

if [[ input_data == 0 ]]
    then 
        echo "it worked" && rm ftp1 ftp2 ftp3
    else    
        echo "it failed"
fi
exit

至:

代码语言:javascript
运行
复制
input_data 

if [[ $? == 0 ]]
    then 
        echo "it worked" && rm ftp1 ftp2 ftp3
    else    
        echo "it failed"
fi
exit
票数 3
EN

Stack Overflow用户

发布于 2014-07-24 17:14:43

你只会错过适当的引用:

代码语言:javascript
运行
复制
    echo "INSERT INTO users (ip) VALUES ('"$ip"');"
    #                                    ^     ^

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

代码语言:javascript
运行
复制
INSERT INTO users (ip) VALUES ('192.168.1.104');
票数 2
EN

Stack Overflow用户

发布于 2014-07-25 04:15:16

至少有两种方法可以向用户显示消息,同时仍然能够将其他人重定向到预期的输出。cat在这里也是不必要的。最好别惹麻烦。

将消息发送给stderr (默认的&2):

代码语言:javascript
运行
复制
while read ip; do
    echo "$ip" >&2
    echo "INSERT INTO users (ip) VALUES ($ip);"
done < "$inputfile" | mysql -uroot -pQwerty17 nmapscans;

使用具有进程替换的其他文件描述符:

代码语言:javascript
运行
复制
while read ip; do
    echo "$ip"
    echo "INSERT INTO users (ip) VALUES ($ip);" >&4
done < "$inputfile" 4> >(exec mysql -uroot -pQwerty17 nmapscans)

这也是一个好主意,不要把你的变量放在公开,以防止分裂词。它可能现在不适用,但它仍然是一个良好的做法。注意我是如何修复它的:

代码语言:javascript
运行
复制
echo "INSERT INTO users (ip) VALUES ($ip);"

根据您的选择,您还可以添加引号:

代码语言:javascript
运行
复制
echo "INSERT INTO users (ip) VALUES ('$ip');"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24939924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档