我希望我的脚本在脚本完成后自动记录当前用户。它可以在基于Linux的服务器(Ubuntu)上运行。我已经尝试了这条代码,但是它行不通。
subprocess.call(['logout'])
给出以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
我也尝试了:
subprocess.Popen(['sudo', 'logout'])
,但是用户必须输入他的密码才能登录。我得到的没有Sudo:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
我不想将脚本本身作为root运行。
我希望能够直接记录用户,而无需输入密码。当您在常规终端中使用注销时,通常不必输入密码,所以我真的不知道为什么这是一个问题。
所有帮助都非常感谢。
编辑:我通过在〜/.bash_login中添加一些额外的代码找到了解决问题的方法(请参阅我的答案),但是为什么我在上面尝试的原因尚未得到回答。
这可能会有所帮助,不确定它是否确实需要您需要,但它会注销当前用户(不像您喜欢的那样干净)
import os
os.system("pkill -KILL -u " + os.getlogin())
我只是快速测试了,但似乎可以解决问题。
在您尝试做的事情中,最好的方法是将您的python命令包装在运行python命令的bash脚本中,然后以登录结尾。
注销是一个bash内置函数。它不存在作为可以通过Python使用的可可命令。
效果:
#!/bin/bash
cd /path/to/script
./scriptname.py
logout
我可以理解想要在Python中实施所有功能。但是,如果您与任何简单地通过PID杀死会话的过程一起工作,您将遇到问题。
您可以尝试杀死父母的pid,这很可能是启动您的外壳 - 但是如果您是由脚本开始的,那将无济于事:
os.kill(os.getppid(),signal.SIGTERM)
但是,如果要替换外壳,以充当登录程序,则可以更改以运行程序的登录设置,或从父壳中使用exec
来替换它。因此,除了自己以外,您无需杀死任何东西。
可以为您服务吗?
cmd = 'logout'
p = subprocess.Popen(cmd, shell=True)
(我没有尝试过,只是猜!!)
我找到了解决问题的解决方案。我添加了
sys.exit(1)
到我的脚本。
然后,我将以下代码添加到〜/.bash_login
if [ "$?" == "0" ]; then
logout
fi
因此,在python-script完成时,注销命令运行。