python呼叫Linux C系統使用者認證介面

2021-09-02 05:25:53 字數 2302 閱讀 2909

【p.s.】使用python版本為2.7~py3有點小驚喜哦(我不寫c,原因暫不深究了)

1.乙個基本使用者驗證介面無非包括兩點:使用者名稱、密碼

2.在密碼部分還需要考慮輸入不顯示提高安全性

大體只要實現這兩點功能,乞丐版功能便做完了。

對於第一點:

linux系統的使用者及認證資訊,儲存在passwd和shadow檔案中,可以輕易通過遍歷檔案內容行對使用者名稱進行辨別,當然,也可以使用python內建模組pwd對使用者名稱進行辨別。不幸的是,linux中的密碼欄位的資訊是加密的,在檔案中體現的形式要麼是乙個x字元,要麼是乙個雜湊值。獲取正確密碼對輸入密碼做匹配成了重中之重。首先可以明確,獲取正確的明文密碼是肯定不可能的。一開始自然以為可以通過查詢官方文件找到對應的摘要演算法對輸入的密碼進行摘要對比就可以了,但實際上也是不可能的。linux生成的密碼摘要並不是單純的密碼字元的摘要,是密碼字串加乙個隨機的salt字串一起進行hash,so,放棄吧。

通過查詢linux相關資料,看到《unix高階程式設計》這麼個寶貝,雖然不會寫c,但是乍一看發現linux是有庫支援將輸入字串hash的,只要再跟正確密碼hash值一對比就可以了。於是思路清晰,python跟c混編,通過呼叫c動態鏈結庫呼叫系統介面。

對於第二點

輸入密碼不顯示以提高安全性,可以通過python內建的getpass模組實現。

上**:(●ˇ∀ˇ●)

[c介面檔案:auth.c]

// author: baojunxian

// date: 2018/11/29

#include // call format: auth(, )

// return 0 if success.

int auth(char *user, char *passwd)

注意:

執行命令gcc -o auth.so --shared -fpic auth.c -lcrypt生成使用者驗證使用的動態鏈結庫檔案auth.so

[python程式檔案:login.py]

# coding=utf-8

# author : baojunxian

# date : 11/29/18

import ctypes, pwd, getpass

capi = ctypes.cdll.loadlibrary

lib = capi('./auth.so')

def login():

user = raw_input('user:').strip()

try:

pwd.getpwnam(user)[0]

except keyerror:

print('user not existed.')

return false

for i in range(3):

passwd = getpass.getpass('password:')

if not lib.auth(user,passwd):

break

print('password not correct.')

else:

print('log in failed.')

return false

print('login successfully.')

return true

if __name__ == '__main__':

login()

如此便大功告成,來驗證一下:

[root@kilo-k5-controller test]# python login.py

user:re

user not existed.

[root@kilo-k5-controller test]# python login.py

user:root

password:

password not correct.

password:

password not correct.

password:

password not correct.

log in failed.

[root@kilo-k5-controller test]# python login.py

user:root

password:

login successfully.

功能完好,perfect!

Linux C中呼叫shell命令

很多時候我們需要在我們所編寫的c程式當中,呼叫一行命令,在命令列執行的命令,比如ifconfig,ls,或者是其他需要的命令如mpirun machinefile host np mpi並行程式 等等,這就要求我們能夠在linux下呼叫shell命令。linux的c就為我們提供了乙個可以呼叫shel...

Linux C語言內聯彙編 函式呼叫

int func int a,int b,int c,int d,int e,int x,int y,int z int main g s檢視彙編 subq 16,rsp pushq 8 pushq 7 movl 6,r9d movl 5,r8d movl 4,ecx movl 3,edx movl...

syscall 系統呼叫陷入 trusty系統呼叫

trusty中,可以通過系統呼叫陷入kernel,獲取kernel服務。這裡記錄一下trusty的系統呼叫框架結構,基於google trusty原始碼 1 應用程式介面 在檔案lib include trusty syscalls.h中,申明了上層呼叫的syscall介面。如 1 send msg...