Shell指令碼對ps命令隱藏引數

壹頁書發表於2015-04-15
緣起
我有一個備份的Shell指令碼,傳入使用者名稱,密碼,然後指令碼開始備份資料庫.

模擬備份的指令碼
[lihuilin@lihuilin ~]$ cat backup.sh
#!/bin/bash
echo pwd:$1
sleep 1m

執行指令碼
[lihuilin@lihuilin ~]$ ./backup.sh password
pwd:password

但是其他使用者使用ps命令,可以直接看到我的密碼

[lihuilin@lihuilin ~]$ ps -ef | grep backup
lihuilin  3163  2997  0 21:44 pts/1    00:00:00 /bin/bash ./backup.sh password
lihuilin  3183  3168  0 21:44 pts/2    00:00:00 grep backup
[lihuilin@lihuilin ~]$

這太崩潰了.有兩種方式可以避免這種情況
1.按照如下內容修改指令碼
[lihuilin@lihuilin ~]$ cat backup.sh
#!/bin/bash
read pwd
echo pwd:${pwd}
sleep 1m

然後使用如下呼叫方式
[lihuilin@lihuilin ~]$ ./backup.sh < password
EOF

這時,在ps命令中就已經看不到敏感資訊了
[lihuilin@lihuilin ~]$ ps -ef | grep backup
lihuilin  3212  2946  0 21:50 pts/0    00:00:00 /bin/bash ./backup.sh
lihuilin  3215  2997  0 21:50 pts/1    00:00:00 grep backup

但是在/proc/pid/fd/下,仍然記錄了該引數的值
[lihuilin@lihuilin ~]$ ps -ef | grep backup
lihuilin  3212  2946  0 21:50 pts/0    00:00:00 /bin/bash ./backup.sh
lihuilin  3218  2997  0 21:51 pts/1    00:00:00 grep backup
[lihuilin@lihuilin ~]$ cd /proc/3212/fd
[lihuilin@lihuilin fd]$ cat 0
password
[lihuilin@lihuilin fd]$

2.使用另外一種呼叫方式
指令碼如下,內容同第一種修改方式
[lihuilin@lihuilin ~]$ cat backup.sh
#!/bin/bash
read pwd
echo pwd:${pwd}
sleep 1m

呼叫方式
[lihuilin@lihuilin ~]$ echo 'password' | ./backup.sh
pwd:password

在另外一個使用者,無論是ps命令,還是檢視/proc資訊,都不能看到敏感資訊了


顯然,第二種方式比第一種方式更加安全.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1578997/,如需轉載,請註明出處,否則將追究法律責任。

相關文章