我希望我的脚本在脚本完成后自动将当前用户注销。它可以在基于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中添加一些额外的代码找到了我的问题的解决方案(请参阅我的回答),但为什么我在上面尝试的内容还没有得到解答。答案 0 :(得分:1)
根据您的尝试,最好的方法是将python命令包装在运行python命令的Bash脚本中,然后以注销结束。
logout是一个Bash内置函数。它不作为可以通过Python使用的可调用命令存在。
产生效果:
#!/bin/bash
cd /path/to/script
./scriptname.py
logout
我可以理解想要在Python中实现它。但是,如果你使用任何简单通过PID kill杀死会话的过程,你将遇到问题。
答案 1 :(得分:0)
这可能会有所帮助,不确定它是否完全符合您的需要,但会退出当前用户(不像您所希望的那样干净)
import os
os.system("pkill -KILL -u " + os.getlogin())
我只是快速测试了这个,但似乎就是这样做了。
答案 2 :(得分:0)
您可以尝试杀死您的父PID,这可能是启动您的shell - 但如果您通过脚本启动它将无济于事:
os.kill(os.getppid(),signal.SIGTERM)
但是,如果要更换shell,作为登录程序,可以更改登录设置以运行程序,或者从父shell更改exec
以替换它。因此,除了你自己,你不需要杀死任何东西。
答案 3 :(得分:0)
这可能适合你吗?
cmd = 'logout'
p = subprocess.Popen(cmd, shell=True)
(我没试过,只是猜猜!!)
答案 4 :(得分:0)
我找到了解决问题的方法。我添加了
sys.exit(1)
到我的剧本。
然后我将以下代码添加到〜/ .bash_login
if [ "$?" == "0" ]; then
logout
fi
因此logout-command在Python脚本完成时运行。