MySQL在Linux系統(tǒng)中隱藏命令行中的密碼的方法
在命令行中輸入命令并不是一個好主意,會造成安全問題。但是如果你決定去寫一個應(yīng)用,而這個應(yīng)用需要在命令行中使用密碼或者其他敏感信息。那么,你能通過以下方法禁止系統(tǒng)的其他用戶輕易的看到這些敏感數(shù)據(jù) 呢?,類似MySQL在ps命令下隱藏密碼。
假設(shè)我這里系統(tǒng)里兩個用戶,一個是root ,一個是dabu 。測試系統(tǒng)為centos 6.5在按照下面的步驟做:
[root@dabu.info ~]#su dabu #切換到dabu這個賬號 [dabu@dabu.info ~]$cd ~ #切換到dabu的home目錄 [dabu@dabu.info ~]$ touch pwhide.c #創(chuàng)建 pwhide.c文件 [dabu@dabu.info ~]$ls
顯示:
將下面的代碼保存到 pwhide.c :
#include <stdio.h> #include <unistd.h> /* unix類系統(tǒng)定義符號常量的頭文件*/ #include <string.h> /* 字符數(shù)組的函數(shù)定義的頭文件*/ #include <sys/types.h> /* Unix/Linux系統(tǒng)的基本系統(tǒng)數(shù)據(jù)類型的頭文件*/ int main(int argc, char *argv[]) /*形參argc指命令行中參數(shù)的個數(shù)(包括執(zhí)行文件本身)。形參argv是一個紙箱字符串的指針數(shù)組*/ { int i = 0; pid_t mypid = getpid(); /*獲得該程序運行時候的pid*/ if (argc == 1) /*如果argc參數(shù)個數(shù)等于1,按要求,應(yīng)該argc要為2才行*/ return 1; /*異常退出*/ printf("argc = %d and arguments are:\n", argc); /*打印argc參數(shù)個數(shù)*/ for (i ; i < argc ; i++) /*打印i序號,以及對應(yīng)的argv數(shù)組指針元素*/ printf("%d = %s\n" ,i, argv[i]); /*打印i序號,以及對應(yīng)的argv數(shù)組指針元素*/ printf("Replacing first argument with x:es... Now open another terminal and run: ps p %d\n", (int)mypid); /*打印該字符串和該程序是的pid*/ fflush(stdout); //*清空緩沖區(qū),并打印其內(nèi)容*/ memset(argv[1], 'x', strlen(argv[1])); /*注意,這里是本文的重點和關(guān)鍵點。(原文http://www.dabu.info/?p=5150)就是利用memset(void *s, int c, size_t n)函數(shù)用x來覆蓋密碼的每個字符*。你也可以將x替換為 a ,然后重新編譯運行,再ps看看有什么不同/ getc(stdin); /* 等待并獲取鍵盤輸入,其實這里主要的作用是保持該c程序在 運行狀態(tài),這樣才能通過ps 查看pid來觀察密碼是否被隱藏 。所以在這個函數(shù)運行后,不能再有任何的鍵盤操作 */ return 0; /* 正常退出 */ #include <stdio.h> #include <unistd.h> /* unix類系統(tǒng)定義符號常量的頭文件*/ #include <string.h> /* 字符數(shù)組的函數(shù)定義的頭文件*/ #include <sys/types.h> /* Unix/Linux系統(tǒng)的基本系統(tǒng)數(shù)據(jù)類型的頭文件*/ int main(int argc, char *argv[]) /*形參argc指命令行中參數(shù)的個數(shù)(包括執(zhí)行文件本身)。形參argv是一個紙箱字符串的指針數(shù)組*/ { int i = 0; pid_t mypid = getpid(); /*獲得該程序運行時候的pid*/ if (argc == 1) /*如果argc參數(shù)個數(shù)等于1,按要求,應(yīng)該argc要為2才行*/ return 1; /*異常退出*/ printf("argc = %d and arguments are:\n", argc); /*打印argc參數(shù)個數(shù)*/ for (i ; i < argc ; i++) /*打印i序號,以及對應(yīng)的argv數(shù)組指針元素*/ printf("%d = %s\n" ,i, argv[i]); /*打印i序號,以及對應(yīng)的argv數(shù)組指針元素*/ printf("Replacing first argument with x:es... Now open another terminal and run: ps p %d\n", (int)mypid); /*打印該字符串和該程序是的pid*/ fflush(stdout); //*清空緩沖區(qū),并打印其內(nèi)容*/ memset(argv[1], 'x', strlen(argv[1])); /*注意,這里是本文的重點和關(guān)鍵點。(原文http://www.dabu.info/?p=5150)就是利用memset(void *s, int c, size_t n)函數(shù)用x來覆蓋密碼的每個字符*。你也可以將x替換為 a ,然后重新編譯運行,再ps看看有什么不同/ getc(stdin); /* 等待并獲取鍵盤輸入,其實這里主要的作用是保持該c程序在 運行狀態(tài),這樣才能通過ps 查看pid來觀察密碼是否被隱藏 。所以在這個函數(shù)運行后,不能再有任何的鍵盤操作 */ return 0; /* 正常退出 */ }
然后編譯 pwhide.c ,命令如下:
[dabu@dabu.info ~]$ gcc -o hide pwhide.c #編譯后的文件叫 hide [dabu@dabu.info ~]$ ls
顯示:
用編譯后的程序進行測試:
[dabu@dabu.info ~]$ ./hide dabu.info //dabu.info作為參數(shù)(其實就是密碼) 進行測試 顯示: argc = 2 and arguments are: 0 = ./hide 1 = dabu.info Replacing first argument with x:es... Now open another terminal and run: ps p 15585
注意:ps p 15585 。你可能和我的不一樣,因為pid每次運行,都會變的。你顯示什么數(shù)字,后面就用什么數(shù)字。
顯示出上面結(jié)果后,不再進行任何操作,也不關(guān)閉這個終端窗口(命令窗口)。然后在用root賬號登錄,就是相當(dāng)于同時開兩個終端窗口。輸入下面的命令:
[root@dabu.info ~]#ps p 15585 #就是運行 ./hide dabu.info后,得到的該程序的pid 顯示: PID TTY STAT TIME COMMAND 15585 pts/0 S+ 0:00 ./hide xxxxxxxxx //dabu.info 共有9個字符,所以這里就顯示9個x
由此測試的結(jié)果,我們知道了這個方法能夠使MySQL如何在ps命令下隱藏命令行中的密碼。以此類推,在寫其他程序后,就知道如何使用這個方法來 讓程序 在ps命令下隱藏命令行參數(shù)。
為了簡明起見,上面的代碼可能不怎么好移植到其他平臺,但是它可以工作在linux上,并且如愿的表達了關(guān)鍵點。在其它環(huán)境,如FreeBSD,你可以使用系統(tǒng)調(diào)用setproctitle() 來為你做這種苦力活。關(guān)鍵的一點是重寫argv
相關(guān)文章
mysql啟動的error 2003和1067錯誤問題解決方法
mysql安裝好經(jīng)常發(fā)現(xiàn)無法正常啟動碰到最多的是error 2003的錯誤,經(jīng)研究在此附上解決方法,希望可以幫助有類似問題的朋友2013-09-09CentOS 6.6 源碼編譯安裝MySQL 5.7.18教程詳解
這篇文章主要介紹了CentOS 6.6 源碼編譯安裝MySQL 5.7.18教程詳解,需要的朋友可以參考下2017-07-07