开发板上面实现NFS挂载操作+shell前的用户程序实现登陆账户和密码

一.配置NFS

首先在Ubuntu下面,搭建nfs服务器。实现命令如下所示:

	 sudo apt-get install portmap
 		sudo apt-get install nfs-kernel-server

然后搭建nfs客户端,命令所示:

sudo apt-get install nfs-common

搭建完成后,修改服务器端的配置文件/etc/exports,指明共享文件夹路径,*:允许所有的网段访问,也可以使用具体的IP。
rw:挂接此目录的客户端对该共享目录具有读写权限sync:资料同步写入内存和硬盘no_root_squash:root用户具有对根目录的完全管理访问权限。修改完上述配置文件保存退出。
开发板上面实现NFS挂载操作+shell前的用户程序实现登陆账户和密码
修改完成后,在Ubuntu上面测试nfs服务器功能是否实现。首先重启nfs服务器,前面要加上sudo,赋予权限,否则后面会出现,permission denied的问题。然后使用mount,挂载/tftpboot 到/mnt/tftpboot文件夹下面。

mount 192.168.0.222:/tftpboot /mnt/tftpboot
 ls /mnt/tftpboot

接下来要在虚拟机上面挂载nfs,在此之前,一定要先配置文件系统支持nfs:
开发板上面实现NFS挂载操作+shell前的用户程序实现登陆账户和密码开发板上面实现NFS挂载操作+shell前的用户程序实现登陆账户和密码

配置好后,一定要再次编译(make dep ,make),否则配置没有生效,nfs无法启动。然后使用tftp下载内核到开发板,启动开发板后,执行命令 portmap &;之后再挂载nfs服务器指定的文件目录,到开发板上面。
开发板上面实现NFS挂载操作+shell前的用户程序实现登陆账户和密码

二.加入命令到/etc/rc

由于/etc/rc是由vendors/Marvell/Firefox/rc创建的,故修改该文件,在末尾添加三行命令:

开发板上面实现NFS挂载操作+shell前的用户程序实现登陆账户和密码

添加完成后,一定要再次编译,然后下载到开发板上面,这样可以对比两次启动时的打印情况。
开发板上面实现NFS挂载操作+shell前的用户程序实现登陆账户和密码
可以发现,添加后在/etc/rc之后出现了,刚刚添加进去的命令执行的返回情况。

三.编写程序

编写程序,使之实现登陆用户的作用。首先在虚拟机上面新建一个C文件,然后打开并编辑,(参考文件user/sash.c,main();user/login/login.c;passwd.c三个文件,然后查看etc/passwd文件,发现里面保存的是加密后的账户和密码。因为不知道原始账户和密码,所以先复制passwd到passwd1,然后编写测试程序,自定义账户和密码(123456),然后经过加密函数crypt和加密符“ab”,得到新的加密后的账户和密码,保存到passwd1里面,接着编写login_passwd.c程序),写好程序后先在虚拟机上面测试(测试程序见附录),编译的时候,报错,检查程序没有问题,然后查看系统函数crypt:man crypt发现编译的时候未加链接库。(编译的时候加上-lcrypt)。加上后编译通过,然后在虚拟机上面测试:
开发板上面实现NFS挂载操作+shell前的用户程序实现登陆账户和密码

测试通过后,打开user/sash/sash.c函数,参考其main()函数中的最后一句代码是开发板启动进入shell时的打印输出。因此,将刚刚测试通过的代码复制进入printf(“\nSash command shell (version %s)\n”,version);之前。开发板上面实现NFS挂载操作+shell前的用户程序实现登陆账户和密码

添加完成后,删除刚刚在scu目录下的测试程序,然后退出到UCLinux-dist目录,执行make命令,然后启动开发板,打开secureCRT软件,下载zRomfs,zImage。Shell之前的打印输出:

开发板上面实现NFS挂载操作+shell前的用户程序实现登陆账户和密码
输入设定好的账户和密码,成功进入shell,否则提示输入错误,重新输入。

附录:测试程序login_passwd.c

#if 1
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <getopt.h>
#include <errno.h>
#include <string.h>
#include <sys/utsname.h>
#include <pwd.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <crypt.h>
int main()
{
	char usernamebuf[128];
	char crtyppassword1[128], crtyppassword2[128];
	char *p,*passwd,*cryptmode,fpbuf[128],fpbuf1[13],fpbuf2[13];
	FILE *fp;
	int i,j=0,z=0;
    int x,y;
	for(;;)
	{
		fflush(stdout);
		fflush(stdin);
		printf("User: ");
		fgets(usernamebuf,sizeof(usernamebuf),stdin); //保存用户到usernamebuf
		p = strchr(usernamebuf, '\n');
		if( p != 0 )
			*p=0;
			
		passwd = getpass("Enter the passwd :"); //(不回显)保存密码到passwd
		printf("\n");
		cryptmode = "ab";
		strcpy(crtyppassword1, crypt(usernamebuf,cryptmode)); //加密用户名到1
		strcpy(crtyppassword2, crypt(passwd,cryptmode)); 	 //加密密码到2
		//printf("crypt_user is %s\n",crtyppassword1);
		//printf("crypt_passwd is %s\n",crtyppassword2);
		fflush(stdout);
		fflush(stdin);
		if((fp = fopen("/s1/uClinux-dist/romfs/etc/passwd1","r"))== NULL)//这里的路径要和自己虚拟机上的路劲一致,下载进入开发板时,改为/etc/passwd1
		{
			printf("open failed \n");
			return 1;
		}
		if(fgets(fpbuf,sizeof(fpbuf),fp)== NULL)
		{
			printf("get data failed \n");
			return 2;	
		}
		//printf(" the pervious data is :%s\n",fpbuf);
		/*for(i = 0; i<128 ; i++)
		{
			if((fpbuf[i] == '=')&&(i<10))
			{
				j = 0;
				fpbuf1[j] = fpbuf[i+1];
			}
			else if(fpbuf[i] == '=')
			{
				j = 0;
				fpbuf2[j] = fpbuf1[i+1];
			}
			else ;
		}*/
		for(i = 5 ; i<18; i++)
		{
				fpbuf1[z] = fpbuf[i];
				z++;
		}
		for( i=26; i<39; i++)
		{
				fpbuf2[j] = fpbuf[i];
				j++;
		}
		//printf("read user is %s\n",fpbuf1);
		//printf("read passwd is %s\n",fpbuf2);
		x = strncmp(crtyppassword1,fpbuf1,13);
		y = strncmp(crtyppassword2,fpbuf2,13);
		if(x!=0)
		{
			printf("user  mistake \n");
			printf("\n");
		}
		else if(y!=0) 
		{	
			printf("passwd  mistake \n");	
			printf("\n");
		}
		else	
			break;	
	}
	printf("user and passwd correct!!! \n");
	printf("\n");
	fclose(fp);
	return 0 ;	
}
#endif