2014-07-24 88 views
1

我有一個腳本可以掃描打開的FTP端口的IP地址,然後將該IP地址輸入到MySQL數據庫中。但是,在運行腳本時,我收到以下消息:在Bash腳本中插入Linux命令輸出到MySQL

「第1行中出現錯誤1064(42000):您的SQL語法出錯;請查看與您的MySQL服務器版本對應的手冊,以獲取正確的語法在

我已經建立了數據庫,並把它命名爲‘nmapscans’與命名錶‘用戶’和現場1" 號線使用近「192.168.1.104 INSERT INTO用戶(IP)VALUES(192.168.1.104)」名稱 '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 
+1

你呼應IP在你的mysql插入statments之間。 'Mysql'不知道該怎麼做。只要刪除'回聲'$ ip「 '線。 –

+0

@FlorinStingaciu太棒了!那工作。然而,仍然令我困惑的是,當我運行腳本時,input_data函數的狀態碼是0,但腳本末尾的if語句的輸出顯示'失敗' – UmairK

+0

請參閱我的答案。 –

回答

2

你迴盪在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 
} 

另外,關於您對return語句的問題。變化:

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 
+0

令人驚訝的是它的工作。感謝您的支持和及時回覆。 – UmairK

+0

測試成功的適當的,慣用的方法很簡單:如果input_data;然後'...甚至只是'input_data && rm ftp [123] ||回聲「失敗」>&2' – tripleee

2

你只錯過合適的報價:

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

因此,IP地址被引用爲一個字符串,產生(現在是有效的)的SQL語句:

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

不幸的是,即使進行了建議的更改,我仍然收到相同的錯誤消息。我還將MySQL中列的數據類型更改爲char,但仍然沒有運氣。 – UmairK

+0

@UirirK看到我上面的評論。 –

+0

@FlorinStingaciu謝謝Florin指出那些各種問題。順便說一下,'192.168.1.104'如何被MySQL理解爲'int(20)'?很明顯,我仍然在這裏錯過了一件事! –

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');" 
相關問題