- 论坛徽章:
- 0
|
如何在终端上不出现login,直接执行应用程序。
[这个贴子最后由fdlj53u在 2002/12/06 04:44pm 编辑]
我给出一个示例文件,希望大家有所帮助.
文件一:tty_mng.c(用来设置终端是直接登录还是出现login,root权限使用)
---------------------------------------
#include "stdio.h"
#include "string.h"
main(argc,argv)
int argc;
char *argv[];
{
int i;
printf("Make tty to 'face' or 'login'...\n";
printf("USAGE:`tty_mng face env tty`\n";
printf(" or `tty_mng login tty`\n\n";
if(argc<3) {
printf("Too few parameters\n";
exit(1);
}
if(strcmp(argv[1],"login"==0) {
for(i=2;i<argc;i++) login(argv);
}
else if(strcmp(argv[1],"face"==0) {
for(i=3;i<argc;i++) face(argv[2],argv);
}
system("/bin/telinit q";
exit(i);
}
login(tty)
char *tty;
{
int ignore;
char tmp[100];
char tmp1[100];
char s[512+1];
int i;
int j;
FILE *f1,*f2;
sprintf(tmp,"/dev/%s",tty);
sprintf(tmp1,"respawn:/etc/getty %s",tty);
if(access(tmp,0)==(-1)) {
printf("Error tty [%s],ignored\n",tmp);
return(-1);
}
f1=fopen("/etc/inittab","r";
if(f1==NULL){
perror("/etc/inittab";
exit(1);
}
f2=fopen("/tmp/inittab","w";
if(f2==NULL){
perror("/tmp/inittab");
fclose(f1);
exit(1);
}
ignore=0;
while(!feof(f1)){
s[0]='\0';
fgets(s,512,f1);
if(s[0]=='\0') break;
if((strstr(s,tmp))==NULL||strstr(s,"/usr/bin/face")==NULL){
fprintf(f2,"%s",s);
if(s[0]!='#'&&strstr(s,tmp1)!=NULL) ignore=1;
}
else printf("#%s",s);
}
j=strlen(tty);
if(!ignore)fprintf(f2,"%s:23:respawn:/etc/getty %s %s\n",&tty[3],tty,j==5?"sc_m":"m");
fclose(f1);
fclose(f2);
if(ignore) printf("login %s ignored\n",tty);
else printf("login %s OK\n",tty);
system("cp /tmp/inittab /etc/inittab");
}
face(env,tty)
char *env,*tty;
{
int ignore=0;
char tmp[100];
char tmp1[100];
char tmp2[100];
char s[512+1];
int i;
FILE *f1,*f2;
sprintf(tmp,"/dev/%s",tty);
if(access(tmp,0)==(-1)) {
printf("Error tty [%s],ignored\n",tmp);
return(-1);
}
sprintf(tmp1,"respawn:/usr/bin/face");
sprintf(tmp2,"/dev/%s",tty);
sprintf(tmp,"/etc/getty %s",tty);
f1=fopen("/etc/inittab","r");
if(f1==NULL){
perror("/etc/inittab");
exit(1);
}
f2=fopen("/tmp/inittab","w");
if(f2==NULL){
perror("/tmp/inittab");
fclose(f1);
exit(1);
}
ignore=0;
while(!feof(f1)){
s[0]='\0';
fgets(s,512,f1);
if(s[0]=='\0') break;
if((strstr(s,tmp))==NULL) {
fprintf(f2,"%s",s);
if(s[0]!='#'&&strstr(s,tmp2)!=NULL&&strstr(s,tmp1)!=NULL) ignore=1;
}
else printf("#%s",s);
}
if(!ignore) fprintf(f2,"%s:23:respawn:/usr/bin/face %s >;/dev/%s 2>;/dev/%s </dev/%s\n",&tty[3],env,tty,tty,tty);
fclose(f1);
fclose(f2);
if(ignore) printf("face %s ignored\n",tty);
else printf("face %s OK\n",tty);
system("cp /tmp/inittab /etc/inittab");
}
---------------------------------------
文件2:face.c (一个屏幕显示的操作界面,修改一下可以用的)
---------------------#include "curses.h"
#include "string.h"
#include "time.h"
#include "ctype.h"
#include "stdio.h"
#include "signal.h"
#define UP 11201
#define LEFT 11202
#define DOWN 11203
#define RIGHT 11204
#define F1 11205
#define F2 11206
#define F3 11207
#define F4 11208
#define LINE 4
#define COL 5
static char env[100][100];
char pwd[100];
char tty[100];
int root=0;
int limit=10;
int ACTIVE=1;
int mod;
char TERM[20];
char TERMTYPE[20];
int CLOCK();
int tick=0;
int lang=0; /* 0-chinese 1- english 2- other **/
char *cmd[LINE*COL]={NULL,
"exec ../bin/aaa.exe",
"exec ../bin/bbb.exe",
"exec ../bin/ccc.exe",
"exec ../bin/ddd.exe",
"exec ../bin/eee.exe",
"exec ../bin/fff.exe",
"exec ../bin/ggg.exe",
"exec ../bin/hhh.exe",
"exec ../bin/iii.exe",
"exec ../bin/jjj.exe",
"exec ../bin/kkk.exe",
"exec ../bin/lll.exe",
"exec ../bin/mmm.exe",
"exec su - history",
"exec su - test",
"exec ../bin/ffda.exe",
"exec ../bin/tt.exe",
"exec ../bin/tttt.exe",
"tput clear;echo Type EXIT to return...;/bin/sh"
};
char *func[LINE*COL+1]={"系统登录",
"⒈AAAAAAAA",
"⒉BBBBBBBB",
"⒊CCCCCCCC",
"⒋DDDDDDDD",
"⒌EEEEEEEE",
"⒍FFFFFFFF",
"⒎GGGGGGGG",
"⒏HHHHHHHH",
"⒐IIIIIIII",
"⒑JJJJJJJJ",
"⒒KKKKKKKK",
"⒓LLLLLLLL",
"⒔MMMMMMMM",
"⒕NNNNNNNN",
"⒖系统练习",
"⒗PPPPPPPP",
"⒘系统维护",
"⒙杂项功能",
"UNIX\nS H E L L",
NULL
};
int a[LINE*COL]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int x[COL]= {6,20,34,48,62};
int y[LINE]={3 , 7,11,15};
main(argc,argv)
int argc;
char *argv[];
{
int max,i,k,org;
char comd[120];
int key;
int j;
FILE *fpt;
char pass[100];
char buff[10],b_p=0;
putenv("TERM=vt100");
putenv("RN=FILE");
set_env(argv[1]);
chdir(getenv("WD"));
getcwd(pwd);
sprintf(TERM,"%.18s",getenv("TERM"));
sprintf(TERMTYPE,"%.18s",getenv("TERMTYPE"));
sprintf(comd,"grep '^%s' /etc/passwd | cut -d':' -f3",getenv("LOGNAME"));
fpt=popen(comd,"r");
fscanf(fpt,"%d",&j);
pclose(fpt);
setuid(j);
umask(0);
for(max=0;func[max]!=(char *)NULL;max++) ;
form_scr();
refresh();
k=0;
a[k]=2;
org=k;
refresh();
for(;;org=k){
draw(k);
refresh();
if(!ACTIVE&&tick>;120) alarm(0);
else alarm(2);
key=wc_getch(stdscr);
alarm(0);
if(key!=(-1)) tick=0;
else {
continue;
}
switch(key){
case LEFT:do k-=LINE;while(a[k]==0&&k>;=0);
if(k<0) k+=LINE;
if(a[k]==0) k=org;
a[org]=1;
a[k]=2;
break;
case RIGHT:
case 9:do k+=LINE; while(a[k]==0&&k<max);
if(k>;=max) k-=LINE;
if(a[k]==0) k=org;
a[org]=1;
a[k]=2;
break;
case UP:do k--;while(a[k]==0&&k>;=0);
if(k<0) k++;
if(a[k]==0) k=org;
a[org]=1;
a[k]=2;
break;
case DOWN:do k++;while(a[k]==0&&k<max);
if(k>;=max) k--;
if(a[k]==0) k=org;
a[org]=1;
a[k]=2;
break;
case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
case '9' :buff[b_p++]=key;
buff[b_p]='\0';
org=k;
k=atoi(buff);
if(k<=0||k>;1 {
buff[0]=key;
b_p=1;
buff[1]='\0';
}
k=atoi(buff);
if(!a[k]) {
if(key=='1') ;else b_p=0;
k=org;
}
else {
a[org]=1;
a[k]=2;
}
break;
case 10 :
case 13 :
if(cmd[k]!=NULL){
endwin();
sprintf(comd,"%s",cmd[k]);
system(comd);
}
break;
case 'x' :
case 24 :
case 27 :
case F4 :endwin();exit(0);
case 11 :endwin();form_scr();break;
default :break;
}
draw(org);
}
endwin();
}
draw(i)
int i;
{
int attr;
switch(a){
case 0:attr=A_DIM;break;
case 1:attr=A_BOLD;break;
case 2:attr=A_BOLD|A_REVERSE; break;
}
attron(attr);
BOX(y[i%LINE],x[i/LINE],func);
attroff(attr);
refresh();
return(a);
}
BOX(by,bx,str)
int by,bx;
char *str;
{
char *tmp,tmp1[100],buff[1024];
int k,lines=0;
tmp=str;
do{
tmp=strchr(tmp+1,'\n');
if(tmp!=NULL) lines++;
}while(tmp!=NULL);
lines=3-lines;
sprintf(tmp1,"%s",str);
do{
tmp=strchr(tmp1,'\n');
if(tmp==NULL) sprintf(buff,"%s",tmp1);
else {
(*tmp)='\0';
sprintf(buff,"%s",tmp1);
sprintf(tmp1,"%s",tmp+1);
}
if(strlen(buff)>;12) k=0;
else k=(12-strlen(buff))/2;
if(k<=0) mvprintw(by+lines,bx,"%-12.12s",buff);
else mvprintw(by+lines,bx,"%*.*s%-*.*s",k,k,"",12-k,12-k,buff);
lines++;
}while(tmp!=NULL);
return(lines);
}
form_scr()
{
int i;
if(strcmp(TERM,"ansi")==0) printf("[0m[=0E[=7F[=1G[0m[J[7m[m");
initscr();cbreak();
mvaddstr(0,0,"┌─────────────────────────────────────┐");
mvaddstr(1,0,"│ │");
mvaddstr(2,0,"├─────────────────────────────────────┤");
mvaddstr(3,0,"│ │");
mvaddstr(4,0,"│ │");
mvaddstr(5,0,"│ │");
mvaddstr(6,0,"│ │");
mvaddstr(7,0,"│ │");
mvaddstr(8,0,"│ │");
mvaddstr(9,0,"│ │");
mvaddstr(10,0,"│ │");
mvaddstr(11,0,"│ │");
mvaddstr(12,0,"│ │");
mvaddstr(13,0,"│ │");
mvaddstr(14,0,"│ │");
mvaddstr(15,0,"│ │");
mvaddstr(16,0,"│ │");
mvaddstr(17,0,"│ │");
mvaddstr(18,0,"│ │");
mvaddstr(19,0,"│ │");
mvaddstr(20,0,"│ │");
mvaddstr(21,0,"├─────────────────────────────────────┤");
mvaddstr(22,0,"│ │");
mvaddstr(23,0,"└─────────────────────────────────────┘");
mvprintw(22,2,"%s",tty);
attron(A_BOLD);
mvprintw(22,20,"%s",getenv("VERSION"));
mvprintw(1,26,"%s",getenv("HOTEL"));
attroff(A_BOLD);
for(i=0;func!=NULL;i++) draw(i);
CLOCK();
signal(SIGPWR,SIG_IGN);
signal(3,SIG_IGN);
signal(2,SIG_IGN);
refresh();
}
int wc_getch(win)
WINDOW *win;
{
int c,next,next1;
noecho();
do{
if(!ACTIVE&&tick>;120) alarm(0);
else alarm(2);
c=wgetch(win);
alarm(0);
if(c!=27) return(c); /* Choice Number */
else break; /* Arrow Key */
} while(1);
next=wgetch(win);
if(next!='['&&next!='O') return(next);
next1=wgetch(win);
switch(next1){
case 'P': return(F1);
case 'Q': return(F2);
case 'R': return(F3);
case 'S': return(F4);
case 'A': return(UP);
case 'B': return(DOWN);
case 'C': return(RIGHT);
case 'D': return(LEFT);
default : return(11200+next1);
};
}
CLOCK()
{
struct tm *ttm;
long tt;
int yy,mm,dd,hh,mi,sec;
tt=time(NULL);
ttm=localtime(&tt);
yy=ttm->;tm_year+1900;
mm=ttm->;tm_mon+1;
dd=ttm->;tm_mday;
hh=ttm->;tm_hour;
mi=ttm->;tm_min;
sec=ttm->;tm_sec;
mvprintw(1,2,"%s",pwd);
attron(A_BOLD);
mvprintw(1,56,"%02d/%02d/%02d %02d:%02d`%02d",mm,dd,yy,hh,mi,sec);
if(ACTIVE) {
mvprintw(22,62,"%-10.10s","LOGIN");
}
else {
mvprintw(22,62,"%-10.10s","");
mvprintw(22,74," ");
}
attroff(A_BOLD);
tick++;
if(ACTIVE&&tick>;600) {endwin();exit(1);}
refresh();
signal(SIGALRM,CLOCK);
}
set_env(str)
char *str;
{
FILE *fpt;
int i=0;
fpt=popen("tty","r");
fscanf(fpt,"%s",tty);
pclose(fpt);
sprintf(env,"TTY=%s",tty);
putenv(env);
fpt=fopen(str,"r");
if(fpt==NULL) {
perror(str);
return(-1);
}
i=1;
while(!feof(fpt)){
env[0]='\0';
fgets(env,80,fpt);
if(env[0]=='\0') break;
env[strlen(env)-1]='\0';
if(env[0]!='#'&&env[0]!='!') putenv(env);
else if(env[0]=='!') system(&env[1]);
i++;
}
fclose(fpt);
if(strcmp(getenv("RN"),"FILE")==0) {
sprintf(env,"RN=/tmp/%s",&tty[5]);
putenv(env);
}
return(1);
}
------------------------
文件3.env(一个环境设置文件,必须要有,否则执行出错)
----------------------
TERM=vt100
LOGNAME=test
HOME=/usr/test
PRN=FILE
HOTEL=AAAAAAAAAAAA
VERSION=2002.8 fdlj53u 版权所有
!stty icanon icrnl onlcr 38400 -istrip ixon ixoff ixany echo echoe opost
------------------------
|
|