日期:2014-05-16  浏览次数:20791 次

利用Putty命令行放开MySQL远程访问的另类方法

   [题目] 《利用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  ××××××  root@172.18.94.14   -L  127.0.0.1:3306:127.0.0.1:3306 

   上面命令行里 -2 -4 -P 22 这一堆参数就不说了, -pw  ××××××  root@172.18.94.14  这堆参数则是明文指定要登陆那台机,用什么用户以及密码等,有保密需求的可以酌情删减,我这样写仅是图个方便痛快。

   用 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 ×××××× root@172.18.94.14   -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 *