在命令行中輸入命令并不是一個好主意,會造成安全問題。但是如果你決定去寫一個應用,而這個應用需要在命令行中使用密碼或者其他敏感信息。那么,你能通過以下方法禁止系統的其他用戶輕易的看到這些敏感數據 呢?,類似MySQL在ps命令下隱藏密碼。
假設我這里系統里兩個用戶,一個是root ,一個是dabu 。測試系統為centos 6.5在按照下面的步驟做:
| [root@dabu.info ~]#su dabu #切換到dabu這個賬號[dabu@dabu.info ~]$cd ~ #切換到dabu的home目錄[dabu@dabu.info ~]$ touch pwhide.c #創建 pwhide.c文件[dabu@dabu.info ~]$ls |
顯示:
將下面的代碼保存到 pwhide.c :
| #include <stdio.h>#include <unistd.h> /* unix類系統定義符號常量的頭文件*/#include <string.h> /* 字符數組的函數定義的頭文件*/#include <sys/types.h> /* Unix/Linux系統的基本系統數據類型的頭文件*/int main(int argc, char *argv[]) /*形參argc指命令行中參數的個數(包括執行文件本身)。形參argv是一個紙箱字符串的指針數組*/{int i = 0;pid_t mypid = getpid(); /*獲得該程序運行時候的pid*/if (argc == 1) /*如果argc參數個數等于1,按要求,應該argc要為2才行*/return 1; /*異常退出*/printf("argc = %d and arguments are:/n", argc); /*打印argc參數個數*/for (i ; i < argc ; i++) /*打印i序號,以及對應的argv數組指針元素*/printf("%d = %s/n" ,i, argv[i]); /*打印i序號,以及對應的argv數組指針元素*/printf("Replacing first argument with x:es... Now open another terminal and run: ps p %d/n", (int)mypid); /*打印該字符串和該程序是的pid*/fflush(stdout); //*清空緩沖區,并打印其內容*/memset(argv[1], 'x', strlen(argv[1])); /*注意,這里是本文的重點和關鍵點。(原文http://www.dabu.info/?p=5150)就是利用memset(void *s, int c, size_t n)函數用x來覆蓋密碼的每個字符*。你也可以將x替換為 a ,然后重新編譯運行,再ps看看有什么不同/getc(stdin); /* 等待并獲取鍵盤輸入,其實這里主要的作用是保持該c程序在 運行狀態,這樣才能通過ps 查看pid來觀察密碼是否被隱藏 。所以在這個函數運行后,不能再有任何的鍵盤操作 */return 0; /* 正常退出 */ #include <stdio.h>#include <unistd.h> /* unix類系統定義符號常量的頭文件*/#include <string.h> /* 字符數組的函數定義的頭文件*/#include <sys/types.h> /* Unix/Linux系統的基本系統數據類型的頭文件*/ int main(int argc, char *argv[]) /*形參argc指命令行中參數的個數(包括執行文件本身)。形參argv是一個紙箱字符串的指針數組*/{int i = 0;pid_t mypid = getpid(); /*獲得該程序運行時候的pid*/if (argc == 1) /*如果argc參數個數等于1,按要求,應該argc要為2才行*/return 1; /*異常退出*/printf("argc = %d and arguments are:/n", argc); /*打印argc參數個數*/for (i ; i < argc ; i++) /*打印i序號,以及對應的argv數組指針元素*/printf("%d = %s/n" ,i, argv[i]); /*打印i序號,以及對應的argv數組指針元素*/printf("Replacing first argument with x:es... Now open another terminal and run: ps p %d/n", (int)mypid); /*打印該字符串和該程序是的pid*/ fflush(stdout); //*清空緩沖區,并打印其內容*/memset(argv[1], 'x', strlen(argv[1])); /*注意,這里是本文的重點和關鍵點。(原文http://www.dabu.info/?p=5150)就是利用memset(void *s, int c, size_t n)函數用x來覆蓋密碼的每個字符*。你也可以將x替換為 a ,然后重新編譯運行,再ps看看有什么不同/getc(stdin); /* 等待并獲取鍵盤輸入,其實這里主要的作用是保持該c程序在 運行狀態,這樣才能通過ps 查看pid來觀察密碼是否被隱藏 。所以在這個函數運行后,不能再有任何的鍵盤操作 */return 0; /* 正常退出 */} |