使用子进程注销而不使用sudo

时间:2012-10-26 10:01:42

标签: python linux subprocess

我希望我的脚本在脚本完成后自动将当前用户注销。它可以在基于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中添加一些额外的代码找到了我的问题的解决方案(请参阅我的回答),但为什么我在上面尝试的内容还没有得到解答。

5 个答案:

答案 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脚本完成时运行。

相关问题