[题目] 《利用Putty命令行放开MySQL远程访问的另类方法》
`2013年4月9日 ~
在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 配置文件里加上忽略密码登陆的选项(后面再详细说)。
[注:] 如果端口转发不起作用, 尝试编辑 /etc/ssh/sshd_config 文件, 在里面加入(或修改) AllowTcpForwarding yes 和 GatewayPorts yes ;其中 GatewayPorts 参数的作用,是让 发送到机器 0.0.0.0 (即任意地址) 的报文也可以转发。 如果是 root 用户不能登陆,请打开这句 PermitRootLogin yes
为了让 保持连接的参数更快生效,可修改如下Linux系统默认配置
● 编辑 vi /etc/sysctl.conf
● 然后执行: sysctl -p 马上生效
● 编辑时,输入(或修改)以下内容
net.ipv4.ip_forward = 1
net.ipv4.tcp_keepalive_time = 777
使用 cat /proc/sys/net/ipv4/tcp_keepalive_time 的命令来确认新设置的参数是否生效了...
● 现在我们终于骗过了服务器,伪装成本地访问 登陆到数据库了。
进入了数据库之后,要开放远程访问权限,无非也是那么几种,找mysql数据库里的 mysql.user 表,将里面随便一个 root 用户的前缀访问范围,由localhost 或 127.0.0.1 改成了 % 就行了, 然后要指定密码的话, 请用 PASSWORD("××××××")这个函数字符串给密码那一栏强制赋值就可以了,当然,别忘了 FLUSH PRIVILEGES一下,就可以正式使用了。
-- 如果不想使用密码,可以把 PASSWORD("指定新密码") 这个函数,换成 null 参数 ;
● 如果忘记了密码,可以在SSH登陆后,把配置文件(比如/etc/my.cnf) 的 [mysqld] 一节里面,添加这一选项 skip-grant-tables ,并重新启动数据库进程。
然后就可以直接不用密码进入数据库,然后执行上面的修改新密码(或重授权)等一系列动作了。 当然,修改完后,最好还是在前面加 #号屏蔽忽略密码的那个选项(重启),否则就不够安全了。 ● 原来 my.cnf 里 bind-address=127.0.0.1 也会影响导致无法远程访问数据库连接,改成 bind-address=0.0.0.0 即可。
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 稍早期版本里面使用的话,有些字段会提示没有,只要在语句里删掉该字段的查询即可。
————————————————
[2014年05.29日更新]
更简便的方法介绍 :)
● 安装mysql-server后,默认数据库不开远程访问
要把 my.cnf 里面改bind-address=0.0.0.0
● 同时用 mysql -p 从本地命令行进入数据库
● 执行 update mysql.user set Host='%' where Host='localhost' and User='root';
● 然后 flush privileges; 和 quit ;
● 最后执行一下 service mysql restart 即可
参考了: http://blog.csdn.net/temp77j/article/details/26454615