如何写一个shell,记下哪个用户(包括IP)用rsh运行了这个shell

newerz 2003-10-09 11:39:34
如何写一个shell,记下哪个用户(包括IP)用rsh运行了这个shell。thanks.
在solaris下可以实现吗?
...全文
52 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
smokefire 2003-10-23
  • 打赏
  • 举报
回复
不好意思 贴错版本了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<unistd.h>
#include<termios.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/wait.h>
char nowdir[1024];
char nowuser[30];
char nowip[20];
int nowid;
//去除后置空格函数
void strclearb(char *str)
{
while(isspace(str[strlen(str)-1]))
{
str[strlen(str)-1]=0;
}

}

//字符串倒装函数
void strbtof(char *str)
{
char tmpc ;
int j=strlen(str);
for(int i=0;i<j/2;i++)
{
tmpc=str[i];
str[i]=str[j-i-1];
str[j-i-1]=tmpc;
}
}

//去除前面空格函数
void strclearf(char *str)
{
strbtof(str);
strclearb(str);
strbtof(str);
}



//得到时间的字符串函数
void GetSysTime(char *strCurTime)
{
time_t tCurrent;
struct tm tm_Cur;
char strCur[26];
time(&tCurrent);
localtime_r(&tCurrent,&tm_Cur);
ctime_r(&tCurrent,strCur);
sprintf(strCurTime,"%04d",tm_Cur.tm_year+1900);
strCurTime[4] = '-';
sprintf(strCurTime+5,"%02d",tm_Cur.tm_mon+1);
strCurTime[7] = '-';
sprintf(strCurTime+8,"%02d",tm_Cur.tm_mday);
strCurTime[10] = ' ';
memcpy(strCurTime+11,strCur+11,8);
strCurTime[19] = '\0';
}


//cd命令转换器
int cdstr(char *str2)
{
char str1[1024]="";
char str3[1024]="";
int i=0,j=0;
strclearb(str2);
strclearf(str2);
strcpy(str1,nowdir);
if(str2[0]=='/')
{
strcpy(str1,str2);
}
else
{
for(;i<=strlen(str2);i++)
{
if(str2[i]=='/'||i==strlen(str2))
{
strncpy(str3,str2+j,i-j);
if(j==0) sprintf(str3,"%s%s","/",str3);
if(strcmp(str3,"/.")==0) ;
if(strcmp(str3,"/")==0) ;
else if(strncmp(str3,"/..",3)==0)
{
int k=strlen(str1);
for(;k>=0;k--)
{
if(str1[k]=='/')
{
if(k!=0) str1[k]=0;
break;
}
}
}
else sprintf(str1,"%s%s",str1,str3);
memset(str3,0,1024);
j=i;
}
}
}

if(chdir(str1)>=0)
{
strcpy(nowdir,str1);
return 0;

}
else
{
return 1;
}

}

//命令分析函数
int checkorder(char *order)
{
char strdir[1024]="";
if(iscntrl(order[0])!=0)
{
printf("this system is not permit to out.\n");
return 0;
}
if(strcmp(order,"exit\n")==0)
{
printf("this system is not permit to out.");
return 0;
}
if(strcmp(order,"cd")==0)
{
strcpy(nowdir,"/zxt10");
return 0;
}
if(strncmp(order,"cd ",3)==0)
{
strncpy(strdir,order+3,strlen(order)-4);
if(cdstr(strdir)==1) printf("%s: not found\n",strdir);
return 2;
}

return 1;
}
//设置终端
int setterm(void)
{
struct termios term;
long vdisable;
if((vdisable=fpathconf(STDIN_FILENO,_PC_VDISABLE))<0) return 2;
if(tcgetattr(STDIN_FILENO,&term)<0) return 3;
term.c_cc[VINTR]=vdisable;
if(tcsetattr(STDIN_FILENO,TCSAFLUSH,&term)<0) return 4;
return 0;
}

void initialize()
{
//记录当前用户名

//记录ip生成IP+用户名的文件
system("who -m |awk '{print $6}'>/tmp/ip.txt");
get=fopen("/tmp/ip.txt","r");
fscanf(get,"%s",nowip);
printf("myip is %s\n",nowip);
sprintf(filestr,"%s%s%s","/zxt10/userfile/",nowip,"zxt10.txt");
printf("filestr is %s\n",filestr);

strcpy(nowdir,"/zxt10"); //初始化起始目录
setterm(); //设置终端I/O模式,设置信号
}

int main(int argc, char *argv[])
{
FILE *fp,*get;
char myip[100]="";
char filestr[1024]="";
char nowtime[1024]="";
char *buf="";
while(1)
{
printf("$");

fgets(buf,1024,stdin); //获取标准输入
fp=fopen(filestr,"a+");

fwrite(buf,strlen(buf),1,fp); //记录输入

fwrite(" ",strlen(" "),1,fp);
int j=checkorder(buf); //检查输入
if(j==1)
{
sprintf(buf,"%s%s%s%s","cd ",nowdir,"\n",buf);
system(buf);
}
GetSysTime(nowtime);
fwrite(nowtime,strlen(nowtime),1,fp); //记录运行时间
fclose(fp);
}
}
smokefire 2003-10-23
  • 打赏
  • 举报
回复
我写过的一个东西,很弱,刚才改了一下,不知道能否编译通过,大概原理就是这样。编译后把这个放入.profile,试试看了。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<unistd.h>
#include<termios.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/wait.h>

void GetSysTime(char *strCurTime)
{
time_t tCurrent;
struct tm tm_Cur;
char strCur[26];
time(&tCurrent);
localtime_r(&tCurrent,&tm_Cur);
ctime_r(&tCurrent,strCur);
sprintf(strCurTime,"%04d",tm_Cur.tm_year+1900);
strCurTime[4] = '-';
sprintf(strCurTime+5,"%02d",tm_Cur.tm_mon+1);
strCurTime[7] = '-';
sprintf(strCurTime+8,"%02d",tm_Cur.tm_mday);
strCurTime[10] = ' ';
memcpy(strCurTime+11,strCur+11,8);
strCurTime[19] = '\0';
}

int checkorder(char *order)
{
char strdir[1024]="";
if(iscntrl(order[0])!=0)
{
printf("thanks god!\n");
return 0;
}
if(strcmp(order,"exit\n")==0)
{
printf("fuck world\n");
return 0;
}
if(strncmp(order,"cd",2)==0)
{

strncpy(strdir,order+2,strlen(order)-2);
printf("strdir is %s\n",strdir);
chdir(strdir);
return 0;
}
}

int setterm(void)
{
struct termios term;
long vdisable;
if((vdisable=fpathconf(STDIN_FILENO,_PC_VDISABLE))<0) return 2;
if(tcgetattr(STDIN_FILENO,&term)<0) return 3;
term.c_cc[VINTR]=vdisable;
if(tcsetattr(STDIN_FILENO,TCSAFLUSH,&term)<0) return 4;
return 0;
}

int main(int argc, char *argv[])
{
FILE *fp,*get;
char myip[100]="";
char filestr[1024]="";
char nowtime[1024]="";
char *buf="";
system("who -m |awk '{print $6}'>/tmp/ip.txt");
get=fopen("/tmp/ip.txt","r");
fscanf(get,"%s",myip);
printf("myip is %s\n",myip);
sprintf(filestr,"%s%s%s","/zxt10/userfile/",myip,".txt");
printf("filestr is %s\n",filestr);

printf("$");
fgets(buf,1024,stdin);
pid_t pid;
pid = fork();
while(1)
{
setterm();
fp=fopen(filestr,"a+");

GetSysTime(nowtime);
fwrite(nowtime,strlen(nowtime),1,fp);

if (pid>0)
{
printf("daemon on duty!\n");
if(checkorder(buf)==0) break;
system(buf);
exit(0);
}

else if (pid<0)
{
printf("Can't fork!\n");
exit(-1);
}

fwrite(buf,strlen(buf),1,fp);
GetSysTime(nowtime);
fwrite(nowtime,strlen(nowtime),1,fp);
fclose(fp);
}
}
sunshinethinking 2003-10-22
  • 打赏
  • 举报
回复
你到/etc下找到profile文件,linux 好像是.profile
仔细看看,所有用户的登陆 ,包括机器本身的tty和telnet上来的tty ,unix都会运行该profile脚本,你可以在文件profile中加入自己的语句,这样就可以知道什么时候,什么人上来了,或者运行了什么东西
smokefire 2003-10-20
  • 打赏
  • 举报
回复
to newerz(VC新手)
某某先哲说过:爱给不给,不给拉倒

newerz 2003-10-17
  • 打赏
  • 举报
回复
to: smokefire(堕落是向下的飞翔)
对于分数的看法:
某某先哲说过:爱名尚利,小人哉。
newerz 2003-10-15
  • 打赏
  • 举报
回复
up, 保证给分。
smokefire 2003-10-15
  • 打赏
  • 举报
回复
某某先哲说过:不可能跨过同一条河流
嘿嘿
zlq 2003-10-13
  • 打赏
  • 举报
回复
to smokefire(smokefire):
由于同一时间可能有多个用户(或IP)login所以修改.profile的办法可能不行。

to aaaa87(cbh):
我看了solaris的w帮助好像用w找不了ip,可以说具体些吗?

to icesnowworld(哈哈):
那个系统日志有纪录这些信息。

多谢各位高手。
icesnowworld 2003-10-09
  • 打赏
  • 举报
回复
系统日志不是记录这些了吗
aaaa87 2003-10-09
  • 打赏
  • 举报
回复
方法有多种:
1、用ps 找自身PID
2、根据PID,用w 找IP。
smokefire 2003-10-09
  • 打赏
  • 举报
回复
我写过这么一个东西,但只是闹着玩的,就是写一个程序,然后修改.profile在用户登陆时自动运行这个程序,记录IP,然后退出程序,不知道这样可以不

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧