亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4893 | 回復: 6
打印 上一主題 下一主題

Linux下Terminal的密碼輸入 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2006-06-02 17:52 |只看該作者 |倒序瀏覽
呵,在我的blog上寫著玩的,因為在做之前搜了一下chinaunix(習慣性動作),沒搜到,所以就貼上來了,別見笑啊,有不對的請指正,謝謝!

最近由于一個程序安全的需要,在運行程序時需要用戶輸入用戶名密碼。哎,一直沒做過在程序運行時的權限認證,以前都是通過對機器系統(tǒng)級的用戶權限控制達到權限管理的需求(事實這也是我覺得最實用,簡單的一種)。OK,不做是不可能的,有時候被迫接受別人的思想,自己的思想無法體現也是非常痛苦的啊,題外話,呵呵。切入正題。

誰規(guī)定的輸入密碼時不能顯示出來?背著點人不就行了嘛,還要給技術找麻煩,要知道做技術多辛苦啊,又累!算了,順應大眾習慣吧。本來Linux下有系統(tǒng)提供的getpass()函數,可由于寫的時候太早了(我猜的呵呵,當時可能就這需求),只支持8位字符,同時有安全隱患(溢出。琽bsolate了,可憐的孩子啊。那總該有個替換的吧?例如像getpass_new()這種的函數,K~找了半天,沒找到!郁悶。沒辦法,想辦法吧。查了點資料,最多的是用ncurses庫里的getch(),可我的是Terminal啊,盜版SecureCRT,用不成。還有兩種就差不多了,都是通過termios來控制低層。一種是通過最最最強大的函數:ioctl(),用數據struct termio設置TCGETA、TCSETA。最討厭用ioctl了!本來這函數挺簡單,可我覺得就是做OS開發(fā)的人在偷懶!你要控制IO的哪部分,怎么控制,都得自己去找參數,找數據結構,郁悶。嘿,終于輪到主角出場了,我覺得這個才是正道!猜對了,這就是termios.h里藏著的:

  1. int tcgetattr (int __fd, struct termios *__termios_p);
  2. int tcsetattr (int __fd, int __optional_actions,
  3.               __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了。呵,終于搞定了。源碼奉上:



  1. #include <termios.h>

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

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

  16. string UserIf::getPassword(string prompt, int n)
  17. {
  18. char c;                   // for read()
  19. int i;                      // number of  input
  20. char *w;                // warning on retry
  21. int f;                      // file descripto
  22. char *p = new char(n+2);
  23. string ret;
  24. f = 0;  // Read from stdin
  25. // get password
  26. w = ""; //warning
  27. do
  28. {
  29.    fputs(w, stderr);
  30.    fputs(prompt.c_str(), stderr);
  31.    fflush(stderr);
  32.    i = 0;
  33.    Echoff(f);
  34.    do {                    /* read line, keeping n */
  35.      read(f, &c, 1);
  36.      if (i < n)
  37.      p[i++] = c;
  38.    } while (c != '\n');
  39.    Echon(f);
  40.    putc('\n', stderr);
  41.    fflush(stderr);
  42.    w = "(line too long)\n";
  43. } while (p[i-1] != '\n');
  44. p[i-1] = 0; //!!!notice
  45. ret = string(p);
  46. delete p;
  47. return ret;
  48. } /* end function getPassword */
復制代碼


寫得有點亂,本來想用std的stream來做的,可除了最基本的功能都不太熟悉,還是改用了c 的文件操作模式。

哎,做技術真是苦,一個小功能浪費了半天的時間,不過還是有點成就感的,探索的過程也很美:P

[ 本帖最后由 liangtf 于 2006-6-2 17:56 編輯 ]

論壇徽章:
0
2 [報告]
發(fā)表于 2006-06-02 17:55 |只看該作者
支持員創(chuàng),ps:不死3兄弟真錳啊

論壇徽章:
0
3 [報告]
發(fā)表于 2006-06-02 17:57 |只看該作者
HOHO,討厭另一個讓人睡覺惡魔,最邪惡,所以沒選他:P

論壇徽章:
0
4 [報告]
發(fā)表于 2006-06-03 00:57 |只看該作者
一不小心進了精華,多謝版主!
寫的時候特別隨便,像是流水帳一樣記在blog上了,不好意思

論壇徽章:
0
5 [報告]
發(fā)表于 2006-06-03 04:52 |只看該作者
Undead
I like!

論壇徽章:
0
6 [報告]
發(fā)表于 2006-06-03 09:47 |只看該作者
xd是高手,我討厭不死

論壇徽章:
0
7 [報告]
發(fā)表于 2006-06-05 08:16 |只看該作者
thanks liangtf ~
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯網協(xié)會會員  聯系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP