使用python decorator进行身份验证

时间:2013-01-12 06:25:33

标签: python

我一直在尝试学习python装饰器并编写以下代码。但它不断给出错误。

import os
import sys

def authenticate(fn):
    def wrapper(*args):
        euid = os.geteuid()
        if euid != 0:
            print "This command requires privliged mode. Enter password.."
            args = ['sudo', sys.executable] + sys.argv + [os.environ]
            os.execlpe('sudo', *args)
        fn(*args)
    return wrapper

@authenticate
def show_files(dir):
    files = [f for f in os.listdir(dir)]
    for file in files:
        if os.path.isfile(file):
            print file

dir = raw_input("Please enter a directory name\t")
show_files(dir) 

我得到以下追溯:

Traceback (most recent call last):
    File "auth1.py", line 24, in show_files(dir)
    File "auth1.py", line 11, in wrapper fn(*args)
    File "auth1.py", line 16, in show_files files = [f for f in os.listdir(dir)]
    OSError: [Errno 2] No such file or directory: ''

我们的想法是仅将show_files函数运行给可以自我验证的用户。我的问题似乎是编写身份验证的方式和execlpe调用。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

您知道问题是使用装饰器语法还是使用execlpe / sudo部分?尝试一次解决其中一个挑战。你的装饰师看起来不错,除非我在那里遗漏了一些东西 - 我没有尝试运行代码。

祝你好运!

乌利

答案 1 :(得分:0)

以下代码正常。感谢那些以有用的方式回复的人。

!在/ usr / bin中/ Python的

导入os

导入sys

def authenticate(fn):

def wrapper():

    euid = os.geteuid()

    if euid != 0:

        print "This command requires privliged mode. Enter password.."

        os.execvp("sudo", ["sudo"] + sys.argv)

    fn()

return wrapper

@authenticate

def show_files():

dir = raw_input("Please enter a directory name\t")

files = [f for f in os.listdir(dir)]

for file in files:

    if os.path.isfile(file):

        print file

show_files()