ºìÁªLinuxÃÅ»§
Linux°ïÖú

LinuxÏÂTerminalµÄÃÜÂëÊäÈë

·¢²¼Ê±¼ä:2006-06-09 09:49:58À´Ô´:ºìÁª×÷Õß:root
×÷Õß:liangtf

ºÇ£¬ÔÚÎÒµÄblogÉÏд×ÅÍæµÄ£¬ÒòΪÔÚ×ö֮ǰËÑÁËÒ»ÏÂchinaunix(ϰ¹ßÐÔ¶¯×÷)£¬Ã»Ëѵ½£¬ËùÒÔ¾ÍÌùÉÏÀ´ÁË£¬±ð¼ûЦ°¡£¬Óв»¶ÔµÄÇëÖ¸Õý£¬Ð»Ð»£¡:mrgreen:

×î½üÓÉÓÚÒ»¸ö³ÌÐò°²È«µÄÐèÒª£¬ÔÚÔËÐгÌÐòʱÐèÒªÓû§ÊäÈëÓû§ÃûÃÜÂë¡£°¥£¬Ò»Ö±Ã»×ö¹ýÔÚ³ÌÐòÔËÐÐʱµÄȨÏÞÈÏÖ¤£¬ÒÔǰ¶¼ÊÇͨ¹ý¶Ô»úÆ÷ϵͳ¼¶µÄÓû§È¨ÏÞ¿ØÖƴﵽȨÏÞ¹ÜÀíµÄÐèÇó£¨ÊÂʵÕâÒ²ÊÇÎÒ¾õµÃ×îʵÓ㬼òµ¥µÄÒ»ÖÖ£©¡£OK£¬²»×öÊDz»¿ÉÄܵģ¬ÓÐʱºò±»ÆÈ½ÓÊܱðÈ˵Ä˼Ï룬×Ô¼ºµÄ˼ÏëÎÞ·¨ÌåÏÖÒ²ÊǷdz£Í´¿àµÄ°¡£¬ÌâÍâ»°£¬ºÇºÇ¡£ÇÐÈëÕýÌâ¡£

Ë­¹æ¶¨µÄÊäÈëÃÜÂëʱ²»ÄÜÏÔʾ³öÀ´£¿±³×ŵãÈ˲»¾ÍÐÐÁËÂ»¹Òª¸ø¼¼ÊõÕÒÂé·³£¬ÒªÖªµÀ×ö¼¼Êõ¶àÐÁ¿à°¡£¬ÓÖÀÛ£¡ËãÁË£¬Ë³Ó¦´óÖÚϰ¹ß°É¡£±¾À´LinuxÏÂÓÐϵͳÌṩµÄgetpass()º¯Êý£¬¿ÉÓÉÓÚдµÄʱºòÌ«ÔçÁË£¨ÎҲµĺǺǣ¬µ±Ê±¿ÉÄܾÍÕâÐèÇ󣩣¬Ö»Ö§³Ö8λ×Ö·û£¬Í¬Ê±Óа²È«Òþ»¼£¨Òç³ö£¡£©£¬obsolateÁË£¬¿ÉÁ¯µÄº¢×Ó°¡¡£ÄÇ×ܸÃÓиöÌæ»»µÄ°É£¿ÀýÈçÏñgetpass_new()ÕâÖֵĺ¯Êý£¬K¡«ÕÒÁ˰ëÌ죬ûÕÒµ½°¡£¡ÓôÃÆ¡£Ã»°ì·¨£¬Ïë°ì·¨°É¡£²éÁ˵ã×ÊÁÏ£¬×î¶àµÄÊÇÓÃncurses¿âÀïµÄgetch()£¬¿ÉÎÒµÄÊÇTerminal°¡£¬µÁ°æSecureCRT£¬Óò»³É¡£»¹ÓÐÁ½Ö־Ͳ¶àÁË£¬¶¼ÊÇͨ¹ýtermiosÀ´¿ØÖƵͲ㡣һÖÖÊÇͨ¹ý×î×î×îÇ¿´óµÄº¯Êý£ºioctl()£¬ÓÃÊý¾Ýstruct termioÉèÖÃTCGETA¡¢TCSETA¡£×îÌÖÑáÓÃioctlÁË£¡±¾À´Õ⺯Êýͦ¼òµ¥£¬¿ÉÎÒ¾õµÃ¾ÍÊÇ×öOS¿ª·¢µÄÈËÔÚ͵ÀÁ£¡ÄãÒª¿ØÖÆIOµÄÄIJ¿·Ö£¬Ôõô¿ØÖÆ£¬¶¼µÃ×Ô¼ºÈ¥ÕÒ²ÎÊý£¬ÕÒÊý¾Ý½á¹¹£¬ÓôÃÆ¡£ºÙ£¬ÖÕÓÚÂÖµ½Ö÷½Ç³ö³¡ÁË£¬ÎÒ¾õµÃÕâ¸ö²ÅÊÇÕýµÀ°¡£¡²Â¶ÔÁË£¬Õâ¾ÍÊÇtermios.hÀï²Ø×ŵģº

int tcgetattr (int __fd, struct termios *__termios_p);
int tcsetattr (int __fd, int __optional_actions,
__const struct termios *__termios_p);


°¥£¬ÕÒÁ˰ëÌ죬ÖÕÓÚÕÒµ½ÈÃÎÒÒ»¼ûÖÓÇéµÄËýÁË¡«
Õâ¸öÆäʵҲÊǶÔÎļþ(UNIX¸ÅÄîµÄÎļþ)½øÐÐÉèÖã¬Ó¦¸ÃÒ²Êǵ÷ÓÃioctl°É£¿²ÂµÄ£¬Ã»¿´Ô´Â룺£©µ«ÆðÂë¸Ð¾õËüÊÇרÃÅ×öÕâ¸öµÄѽ£¬¿´È˼Ҷàרһ£¡

²éÁËһϣ¬»¹ºÃ£¬tcsetattrµÄoptional actionsÖ»ÓÐÈý¸öÑ¡Ôñ£¬Ò»Ä¿ÁËÈ»ÁË£¬µ±È»ÊÇÓÃFlush action£¨TCSAFLUSH£©ÁË¡£Íòʾ㱸°¡£¡ÓÚÊÇ_fdÓÃ0(stdin),Êä³öµ±È»ÒªÓÃstderrÁË£¬actionÓÃTCSAFLUSH, termios_pÖ»ÐèÒªÉèÖøöc_lflag£¬ºÍ~ECHO×ö¸ö&¾ÍOKÁË¡£ºÇ£¬ÖÕÓڸ㶨ÁË¡£Ô´Âë·îÉÏ£º



#include

void UserIf::Echoff(int f)
{
struct termios sg;
tcgetattr(f, &sg); /* get settings */
sg.c_lflag &= ~ECHO; /* turn echo off */
tcsetattr(f,TCSAFLUSH,&sg); /* set settings */
}

void UserIf::Echon(int f)
{
struct termios sg;
tcgetattr(f, &sg); /* get settings */
sg.c_lflag |= ECHO; /* turn echo on */
tcsetattr(f,TCSAFLUSH,&sg); /* set settings */
}

string UserIf::getPassword(string prompt, int n)
{
char c; // for read()
int i; // number of input
char *w; // warning on retry
int f; // file descripto
char *p = new char(n+2);
string ret;
f = 0; // Read from stdin
// get password
w = ""; //warning
do
{
fputs(w, stderr);
fputs(prompt.c_str(), stderr);
fflush(stderr);
i = 0;
Echoff(f);
do { /* read line, keeping n */
read(f, &c, 1);
if (i < n)
p[i++] = c;
} while (c != '\n');
Echon(f);
putc('\n', stderr);
fflush(stderr);
w = "(line too long)\n";
} while (p[i-1] != '\n');
p[i-1] = 0; //!!!notice
ret = string(p);
delete p;
return ret;
} /* end function getPassword */



дµÃÓеãÂÒ£¬±¾À´ÏëÓÃstdµÄstreamÀ´×öµÄ£¬¿É³ýÁË×î»ù±¾µÄ¹¦Äܶ¼²»Ì«ÊìϤ£¬»¹ÊǸÄÓÃÁËc µÄÎļþ²Ù×÷ģʽ¡£

°¥£¬×ö¼¼ÊõÕæÊǿ࣬һ¸öС¹¦ÄÜÀË·ÑÁ˰ëÌìµÄʱ¼ä£¬²»¹ý»¹ÊÇÓеã³É¾Í¸ÐµÄ£¬Ì½Ë÷µÄ¹ý³ÌÒ²ºÜÃÀ£ºP
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ