انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: hosseinyounesi در 25 تیر 1387، 08:59 بظ
-
سلام تو پایتون چه جوری میشه عملیات log off & in کاربرها رو فهمید ؟ من یه برنامه دارم که با کاربر root در حال اجراست، من هر موقع کسی رو سیستم log in ^ off بکنه من باید بفهمم. ممنون از پاسختون
-
یه چیزی می گم نخندید:
می تونی به صورت مرتب چک کنی که چه کاربرایی لاگین هستند و با مقایسه ی گذشته نزدیک این رو بفهمی
-
log in و log off متنی منظورتون هست (یعنی مثلا توی bash) یا اینکه گرافیکی (توی گنوم یا kde) ؟
اون برنامتون کارش فقط همینه (که مثلا موقع login یا logoff یه کاربر مثلا یه چیزی چاپ کنه) یا اینکه کار دیگهای هم میخواد انجام بده؟
-
سلام، خیلی ممنون که جواب دادین ;). راه اول به نظر خودمم رسید ولی اصلا راه خوبی نیست. نه log in/off گرافیکی (مثلا KDE). مگه فرقی هم داره ؟ در ضمن برنامه بر اساس log in/off باید یه سری کارا بکنه.
-
خبری نیست ؟
-
سلام یعنی راهی نداره ؟!!! :o
این موضوع ربطی به زبان نداره. کلا چه جوری میشه فهمید ؟ API Service Porti ؟
-
دستور who رو امتحان کنید
-
دستور ps -lA | grep gnome هم ممکنه به دردتون بخوره. UID کاربرانی که در حال استفاده از گنوم هستن رو نشون میده. منتها دائم باید چک کنید که چه کاربرانی هستن. اینطور نیست که هر کاربری که وارد گنوم شد، بتونید بفهمید.
اگه میخواید که هر کاربری که وارد گنوم یا kde شد، مثلا یه تابع خاص اجرا بشه (بدون اینکه توی یک حلقه کاربران حاضر رو چک کنید) کار خیلی سخت میشه. باید به سرویسهای startup اون محیط گرافیکی(یا x window) یه اسکریپت رو اضافه کنید که بتونه با این برنامهٔ پایتون در حال اجرا ارتباط برقرار کنه، مثلا از طریق یک پروسهٔ واسط، یا مثلا از طریق یک بافر یا فایل مجازی یا فایل واقعی... نمیدونم خلاصه خیلی خفن میشه. شاید ماژول thread پایتون هم به دردتون بخوره.
ولی راحتترین اینه که یه تابع بنویسید که لیست کاربران (که توی گنوم یا kde هستن) رو برگردونه(return کنه) بعد اون تابع رو توی یه حلقه، دائم فراخوانی کنید و کاربران جدید رو تشخیص بدید. بهتره توی اون حلقه یه مدت کمی هم توقف کنه(با time.sleep) که مثلا هر 0.1 ثانیه کاربران رو چک کنه، تا خیلی cpu رو اشغال نکنه.
-
ممنون. ilius میشه در مورد راه سخته بیشتر توضیح بدین \\:D/ خیلی مهمه ](*,)
-
فعلاً این راه آسونترش:
#!/usr/bin/env python
#File: users_monitore.py
import sys, os, time
def usersList(keys=['gnome', 'kde']):
uids=[]
for key in keys:
procLines = os.popen('ps -lA | grep %s'%key).read().split('\n')
for line in procLines:
parts=line.split(' ')
i = 0
n = len(parts)
while i<n:
if parts[i]=='':
parts.pop(i)
n -= 1
else:
i += 1
if len(parts)>2:
if not parts[2] in uids:
uids.append(parts[2])
return uids
def getTime():
return '%s/%s/%s %s:%s:%s'%time.localtime()[:6]
def logedIn(uid):
print 'user %s loged in, at %s'%(uid, getTime())
## do something here
def logedOut(uid):
print 'user %s loged out, at %s'%(uid, getTime())
## do something here
def compareLists(l1, l2):
if l1==l2:
return ([], [])
added=[]
removed=[]
for m in l1:
if not m in l2:
removed.append(m)
for m in l2:
if not m in l1:
added.append(m)
return (added, removed)
def main():
print 'Listening to users loging in/logging out. Press Ctrl+C to stop.'
users = usersList()
while True:
try:
time.sleep(0.1)
pUsers = users
users = usersList()
if pUsers==users:
continue
(a, r) = compareLists(pUsers, users)
for u in a:
logedIn(u)
for u in r:
logedOut(u)
except KeyboardInterrupt:
break
if __name__=='__main__':
main()
توی یه فایل(مثلاً users_monitore.py) ذخیره کنید، بهش مجوز اجرا بدید بعد Alt+Crtl+F1 بزنید و با حساب root وارد بشید و برنامه رو اجرا کنید. بعد Alt+Crtl+F7 بزنید و از محیط گرافیکی(گنوم یا kde) خارج بشید(logout)، حالا اگه Alt+Crtl+F1 بزنید میبینید که یه پیغامی چاپ کرده که این کاربر خارج شد. همینطور login کاربرها. اگه میخواید login و logout به خط فرمان(bash) رو هم نشون بده، کلمهٔ bash رو به آرگومان تابع usersList (که یه لیست هست) اضافه کنید. توابع logedIn و logedOut رو هم به دلخواه خودتون تغییر بدید تا موقع ورود و خروج کاربرها یه کار خاصی انجام بده(با داشتن UID اون کاربر).
در ضمن با این زمان 0.1 ثانیه برای sleep، خیلی کم cpu رو اشغال میکنه(کمتر از یک درصد)، اگه بازم دیدید میتونید زمانش رو بیشتر کنید(توی خط پنجم تابع main) مثلا 0.2 ثانیه.
-
سلام ممنون. ولی راه دوم ؟ ](*,)
-
سلام ممنون. ولی راه دوم ؟ ](*,)
گفتم که دقیق نمیدونم. خودتون میتونید برید دنبالش. ولی مگه همین راه چه اشکالی داره؟! میبینید که پردازش خیلی کمی میگیره.
-
به نظرم استفاده از who (که آقا مهدی گفت) به جای ps | grep سادهتر و اصولیتر هست.
-
راستی شاید دستور lastlog هم به کارت بیاد ;)