利用Putty命令行放開MySQL遠程訪問的另類方法
在Linux 下 MySQL 默認安裝後是沒有辦法從遠程訪問的, 只能從本地接入訪問,也就是只能從127.0.0.1 發起數據庫連接; 為了解決這個問題,我們改變一下思路,讓我們的工作機Windows看起來像是本地訪問,這樣我們就可以利用 SQLYog 之類的圖形化界面來操控數據庫,進而開放遠程Access訪問權限了。
首先使用Putty 來從Windows工作機上連接到服務器, Putty 具有端口轉發的功能(隧道),可以把發到本地 3306 端口的報文,轉發到遠端服務器 localhost 網卡的 3306 端口上, 所需要的僅僅是在putty 進行 SSH 遠程登陸的命令行上,加上這句 -L 127.0.0.1:3306:127.0.0.1:3306 , 注意 -L 的 L 是一定要大寫的 ;完整的Putty 命令行如下:
putty -2 -4 -P 22 -pw ×××××× [email protected] -L 127.0.0.1:3306:127.0.0.1:3306
上面命令行裡 -2 -4 -P 22 這一堆參數就不說了, -pw ×××××× [email protected] 這堆參數則是明文指定要登陸那台機,用什麼用戶以及密碼等,有保密需求的可以酌情刪減,我這樣寫僅是圖個方便痛快。
用 Putty 登陸服務器後, 第一件事當然是看看 我們要用的端口有沒有被防火牆阻隔,MySQL 默認是3306 端口, 比方說,我現在登陸的是 CentOS ,用 chkconfig iptables off 就可以關閉防火牆了, 如果不行,更直接點用 service iptables stop 來關閉 iptables 服務就行了。 如果非 RH 系的Linux 服務器,可以用 /etc/init.d/iptables 腳本來關閉(或打開) Linux 防火牆服務。
到此,我們可以將本地3306 與 遠端3306對接起來了, 訪問本地的3306 ,就相當於在遠端服務器上通過127.0.0.1 訪問 3306 端口。 現在我們用 SQLYog 類似的圖形化界面,打開 127.0.0.1 的 3306 端口, 如果是初安裝,則不帶密碼就可以進入了,如果已經被人家加過密碼了, 就在 MySQL 配置文件裡加上忽略密碼登陸的選項(後面再詳細說)。
● 現在我們終於騙過了服務器,偽裝成本地訪問 登陸到數據庫了。
進入了數據庫之後,要開放遠程訪問權限,無非也是那麼幾種,找 mysql數據庫裡的 mysql.user 表,將裡面隨便一個 root 用戶的前綴訪問范圍,由 localhost 或 127.0.0.1 改成了 % 就行了, 然後要指定密碼的話, 請用 PASSWORD("××××××") 這個函數字符串給密碼那一欄強制賦值就可以了,當然,別忘了 FLUSH PRIVILEGES 一下,就可以正式使用了。
-- 如果不想使用密碼,可以把 PASSWORD("指定新密碼") 這個函數,換成 null 參數 ;
● 如果忘記了密碼,可以在SSH登陸後,把配置文件(比如/etc/my.cnf) 的 [mysqld] 一節裡面,添加這一選項 skip-grant-tables ,並重新啟動數據庫進程。
然後就可以直接不用密碼進入數據庫,然後執行上面的修改新密碼(或重授權)等一系列動作了。 當然,修改完後,最好還是在前面加 #號屏蔽忽略密碼的那個選項(重啟),否則就不夠安全了。
● 補充一個Putty 的用法,就是把發送到遠端服務器端口上的報文,通過隧道轉發到本地網卡和端口上來,跟上面的過程剛好是反過來的一個過程,完整命令行如下:
putty -pw ×××××× [email protected] -R 0.0.0.0:1237:0.0.0.0:2234
● 如果一定要用SQL命令完成授權的工作,請參考下面幾個語句:
① 更改密碼:
update user set password=PASSWORD("secret") where user='root';
FLUSH PRIVILEGES;
② 這是授權並設置新密碼:
GRANT ALL PRIVILEGES ON *.* TO '某用戶'@'%' IDENTIFIED BY '新密碼' WITH GRANT OPTION;
FLUSH PRIVILEGES;
③ 也可以只授權(不重設密碼)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
FLUSH PRIVILEGES;
④ 利用已有的 root 用戶創建其他用戶(擁有一樣權限的)
insert into user select "%","其他用戶",PASSWORD("指定新密碼"),Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv,Show_db_priv,Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Repl_slave_priv,Repl_client_priv,Create_view_priv,Show_view_priv,Create_routine_priv,Alter_routine_priv,Create_user_priv,Event_priv,Trigger_priv,ssl_type,ssl_cipher,x509_issuer,x509_subject,max_questions,max_updates,max_connections,max_user_connections from user as u where u.user="root" and host="127.0.0.1";
FLUSH PRIVILEGES;
-- 如果不想使用密碼,可以把 PASSWORD("指定新密碼") 這個函數,換成 null 參數 ;
如果在 MySQL 稍早期版本裡面使用的話,有些字段會提示沒有,只要在語句裡刪掉該字段的查詢即可。