当前位置:  操作系统/服务器>linux

实现shell终端代码分享(可用户登录 实现系统命令)

    来源: 互联网  发布时间:2014-10-15

    本文导语:  代码如下:#include"apue.h" int userlogin(struct passwd **); int main(){ int ret,i=0; long ret_cwd; struct passwd *pw; char buf[128],hostname[16],usercwd[128]; char *ptmp1;  do{  ret = userlogin(&pw); }while(ret != 1);  getchar();  while(1){//to gethostname  if(gethostname(buf,128...

代码如下:

#include"apue.h"

int userlogin(struct passwd **);

int main()
{
 int ret,i=0;
 long ret_cwd;
 struct passwd *pw;
 char buf[128],hostname[16],usercwd[128];
 char *ptmp1;

 do{
  ret = userlogin(&pw);
 }while(ret != 1);

 getchar();

 while(1){
//to gethostname
  if(gethostname(buf,128)!=0){
   perror("gethostname()");
   return 0;
  }
//truncate hostname untill '.'
  while(buf[i]!='.'){
   hostname[i++] = buf[i];
  }
  i = 0;
//if the user is 'root' the symbol is '#'
//else '$'
//and the current work path is truncated from the last '/' to the end
  ret_cwd = (long)getcwd(usercwd,128);
  if(strcmp(usercwd,pw->pw_dir)==0){
   ret = sprintf(usercwd,"~",NULL);
  }
  else if(strcmp(usercwd,"/")!=0){
   ptmp1 = strrchr(usercwd,'/');
   sprintf(usercwd,"%s",ptmp1+1);
  }
  if(strcmp(pw->pw_name,"root")==0){
   sprintf(buf,"*[%s@%s %s]# ",
     pw->pw_name,hostname,usercwd);
  }
  else{
   sprintf(buf,"*[%s@%s %s]$ ",
     pw->pw_name,hostname,usercwd);
  }
//command
  ssize_t g_ret,len;
  char *line = NULL,*s_ret,*ptr=NULL;
  int con_cd=0;

  fprintf(stderr,"%s",buf);

  g_ret = getline(&line,&len,stdin);

  line[strlen(line)-1] = '';
  if(strcmp(line,"exit")==0){
   exit(-1);
  }
  ptr = line;
  s_ret = line;

  system(line);
  while(ptr!=NULL){
   s_ret = (char *)strsep(&ptr," ");

   if(strcmp(s_ret,"cd") == 0){
    con_cd=1;
    continue;
   }
   else if(con_cd == 1){
    chdir(s_ret);
   }
  }
 }
 return 0;
}


//login function
int userlogin(struct passwd **pw)
{
 char name[32],*passwd,*pret;
 struct spwd *sp;

 printf("login:");
 fflush(stdout);
 scanf("%s",name);

 passwd = getpass("password:");

 sp = getspnam(name);
 if(sp == NULL){
  fprintf(stdout,"no is user![%s]n",name);
  return 0;
 }

 pret = crypt(passwd,sp->sp_pwdp);

 if(pret == NULL){
  fprintf(stdout,"crypt(%s)n",name);
  return 0;
 }

 if(strcmp(pret,sp->sp_pwdp) == 0){
  printf("login successful!n");
 }
 else{
  fprintf(stdout,"passwd is error!n");
  return 0;
 }

 *pw = getpwnam(name);
 if(*pw == NULL){
  printf("getpwnam(%s) errorn",name);
  return 0;
 }

 return 1;

}


    
 
 

您可能感兴趣的文章:

  • 我在虚拟终端运行VI,如何实现语法加亮呀?????
  • 如何编程实现SCO控制终端打印的字体大小或间距等?
  • linux下的终端tab自动补全命令是怎么实现的
  • 请问高手:Ctrl+Alt+F1~F8可以切换虚拟终端,这个代码是在哪儿实现的?我搞不懂,最好指点源代码大概位置。
  • linux下grep命令实现查找多个关键字(与关系和或关系)
  • java怎样实现 运行dos命令行的命令或者windows的程序
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • Linux 下的cd命令为什么要实现成shell的内建命令
  • 自己实现linux下的ftp客户端,先用port命令后用append命令,报告错误425请问是哪里错了?,应该把模式置为pasv嘛??
  • 如何实现在接收到远程的命令后格式化磁盘?
  • 用FTP命令实现文件拷贝并改名
  • tac命令的实现?
  • 请问一下dd命令的实现机制,哪里能看到
  • ★★在自己编写的shell程序中,如何实现命令补全?
  • 类似于Shell界面下setup命令的文本模式菜单用C语言如何实现
  • 求教各位大大:关于vi或top命令出现的界面,如何编程才能实现?
  • grep命令的实现
  • 怎样实现命令的快捷方式`
  • 请问,在Cramfs文件系统中怎样实现历史命令记录
  • 开发板运行交互式网页,控件包含linux命令,用什么方法实现?
  • 在java中调用系统FTP命令,实现文件传输???
  • 用shell命令来实现改变文件的icon
  • oracle iis7站长之家
  • 如何编程实现(不用shell命令)修改文件的时间
  • 如何 实现视窗界面与命令界面的切换。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • boost unordered_map和std::list相结合的实现LRU算法
  • linux下如实现与window下的驱动器实现文件共享??
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • qt如何实现:操作键盘实现数据的滚动?
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • 我想用APPLET实现读取客户端的图片文件,该如何实现?
  • iphone cocos2d 精灵的动画效果(图片,纹理,帧)CCAnimation实现
  • PING是用TCP,还是用UDP来实现的?或是采用其它协议实现的?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • ejb-ql只能 like '?%' 么?我想实现模糊查寻,想实现 like'%?%' 怎么办??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3