我一直在尝试学习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
调用。任何帮助表示赞赏。
答案 0 :(得分:0)
您知道问题是使用装饰器语法还是使用execlpe / sudo部分?尝试一次解决其中一个挑战。你的装饰师看起来不错,除非我在那里遗漏了一些东西 - 我没有尝试运行代码。
祝你好运!乌利
答案 1 :(得分:0)
以下代码正常。感谢那些以有用的方式回复的人。
导入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()