2014年2月23日星期日

解决windows下的mysql匿名登陆无法使用mysql数据库的问题 - 邦邦酱好

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
解决windows下的mysql匿名登陆无法使用mysql数据库的问题 - 邦邦酱好  阅读原文»

我在windows下安装了mysql,但是不用密码就能登进去,而root明明是有密码的,我用select user()命令查看当前登录用户是root。

查看数据库,只能看到自带的两个数据库(information_schema和test),mysql这个数据库都看不到。如果运行use mysql,就会出现 Access denied for user ''@'localhost' to database 'mysql', 这说明这是匿名登录的,几乎什么权限都没有。即使用mysql -u root登录也是提示这个。

网上搜了很多资料,大多数是教的怎么在linux下解决这个问题。

我综合了大多数的方法,自以为找到了解决的办法:

1.首先,网上的资料都提到了需要关闭mysqld这个服务来屏蔽权限检查,我查看了任务管理器,发现的确有一个叫mysqld.exe的程序在运行:

直接关闭这个进程

我查阅了帮助手册,”MySQL服务器也就是mysqld,是在MySQL安装中负责大部分工作的主程序。服务器随附了几个相关脚本,当你安装MySQL时它们可以执行设置操作,或者是帮助你启动和停止服务器的帮助程序。“ 我估计它相当于mysql的守护进程,不停止它就无法设置启动脚本。

2.网上都提到了

mysqld-nt --skip-grant-tables

mysqld_safe --skip-grant-tables

safe_mysqld --skip-grant-tables 等关闭权限检查的方法,但是我在CMD命令提示符下输入都提示:“mysqld_safe”不是内部或外部命令,也不是可运行的程序或批处理文件。

于是我查看mysql安装目录下的bin文件夹里有哪些相关的文件:

(1)mysqld.exe (2)mysqld_multi.pl

我查看了帮助手册,“在Unix和NetWare中推荐使用mysqld_safe来启动mysqld服务器。mysqld_safe增加了一些安全特性,例如当出现错误时重启服务器并向错误日志文件写入运行时间信息。为了保持同旧版本MySQL的向后兼容性,MySQL二进制分发版仍然包括safe_mysqld作为mysqld_safe的符号链接。默认情况下,mysqld_safe尝试启动可执行mysqld-max(如果存在),否则启动mysqld。”

我估计mysqld_safe是mysqld.exe文件里的一个启动选项。所以我尝试了这样输入:

先跳转到mysql的bin目录下,再输入mysqld --skip-grant-tables。这时候有可能一直没有反应的样子,不会生成新的一行输入。

实际上它已经停止了权限检查,我们可以进行其他操作了。

3.重新打开一个cmd命令提示符窗口,进入到mysql里面,然后输入use mysql,就会发现成功了!:

看到没?上面最后一行提示的是Database changed!!

如果你输入show tables就会看到这个数据库下有个表叫user,记录了登陆的账户名和密码。

所以你可以这样修改root账户的密码:

UPDATE user SET Password=PASSWORD('123') WHERE user='root';

这时你使用MySql Command Line Client登陆的话,就会要求输入密码123了!你已经不是匿名登陆,所以可以进行各种操作了!!!


本文链接:http://www.cnblogs.com/bangbangjiang/p/3564321.html,转载请注明。

linux下遍历目录 - 在于思考  阅读原文»

遍历目录的主要思想

  由于目录就是一颗树,所以遍历目录就转换为遍历一棵树。谈到树的遍历就再熟悉不过了,有树的前序、层次和后序遍历,我使用的是前序遍历,后序遍历和前序遍历本质上一样,而层次遍历要比前两个麻烦些,我两个都实现了,现在贴出来分享下。

前序遍历

  前序遍历和树的遍历一样,我先显示当前目录的信息,然后遍历目录中的目录项,如果目录项是一个目录则先递归这个子目录,否则如果是目录项是非目录的话就返回。

1 static void DoTraverDir(MyFunc myFunc)
2 {
3 struct stat statBuf;
4 DIR *pDir;
5 struct dirent *pDirent;
6 int pathLen, direntLen;
7
8 // printf("path: %s\n", fullPath);
9 //获取当前目录信息,用lstat防止嵌套调用
10 if (lstat(fullPath, &statBuf) == 0)
11 myFunc(fullPath, &statBuf, TD_F);
12 else
13 {
14 myFunc(fullPath, &statBuf, TD_NS); //无法获取信息
15 return;
16 }
17 if (!S_ISDIR(statBuf.st_mode)) //当前路径为文件
18 return;
19
20 //处理目录
21 pathLen = strlen(fullPath);
22 if (pathLen >= MAX_PATH - 2) //目录长度限制,不再处理更深层的目录
23 return;
24 if ((pDir = opendir(fullPath)) == NULL)
25 {
26 myFunc(fullPath, &statBuf, TD_DNR); //无法读取目录
27 return;
28 }
29 if (fullPath[pathLen - 1] != '/')
30 fullPath[pathLen++] = '/';
31 //遍历目录中的所有目录项
32 while ((pDirent = readdir(pDir)) != NULL)
33 {
34 //忽略.和..目录项
35 if (strcmp(pDirent->d_name, ".") == 0 ||
36 strcmp(pDirent->d_name, "..") == 0)
37 continue;
38 direntLen = strlen(pDirent->d_name);
39 if (pathLen + direntLen > MAX_PATH) //路径超过了最大长度
40 return;
41 strcpy(fullPath + pathLen, pDirent->d_name);
42 fullPath[pathLen + direntLen] = 0;
43 DoTraverDir(myFunc); //递归处理下一层
44 }
45 fullPath[pathLen - 1] = 0;
46 if (closedir(pDir) == -1)
47 printf("close dir error : %s\n", fullPath);
48 }

  代码中的fullPath是一个全局变量,用来存放当前遍历文件的路径,路径的最大长度为4096,超过了4096函数自己返回,不进行任何的处理,定义如下:

1 #define MAX_PATH 4096
2 static char fullPath[MAX_PATH + 1];

  还有一个地方值得注意,那就是我上面红色标识的代码,遍历完目录后必须将当前目录关闭掉,否则程序占有的打开目录资源会超过系统的限制,当遍历到了一定的数量后,后面的遍历都会失败,我就是开始没有关闭目录,所以后面出现莫名其妙的错误。

层次遍历

  层次遍历要比前序遍历复杂点,因为是要先处理好了当前目录中的所有目录项后再处理下一层的目录。所有在遍历当前目录的目录项时必须保存下层目录的路径信息,以方便处理下层目录。不过和前面代码的实现也差不多,就是多了一个保存路径的容器罢了,代码如下:

1 static void DoTraverDir(MyFunc myFunc)
2 {
3 struct stat statBuf;
4 DIR *pDir;
5 struct dirent *pDirent;
6 int pathLen, direntLen;
7 std::vector<std::string> vpDirent;
8 std::vector<std::string>::iterator vpDirentIterator;
9 std::string str;
10
1

阅读更多内容

没有评论:

发表评论