3

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

4

5 回答 5

1

对于您正在尝试做的事情,最好的方法可能是将您的 python 命令包装在一个运行 python 命令的 Bash 脚本中,然后以注销结束。

logout 是一个 Bash 内置函数。它不作为可通过 Python 使用的可调用命令存在。

大意是:

#!/bin/bash

cd /path/to/script
./scriptname.py
logout

我可以理解想要在 Python 中实现这一切。但是,如果您使用任何通过 PID kill 简单地终止会话的过程,您将遇到问题。

于 2012-10-26T13:00:38.207 回答
0

我找到了解决我的问题的方法。我添加了

sys.exit(1)

到我的剧本。

然后我将以下代码添加到 ~/.bash_login

if [ "$?" == "0" ]; then
    logout
fi

因此,注销命令在 Python 脚本完成时运行。

于 2012-10-26T13:21:36.463 回答
0

这可能会有所帮助,不确定它是否完全符合您的需要,但它会注销当前用户(不像您喜欢的那样干净)

import os
os.system("pkill -KILL -u " + os.getlogin())

我只是快速测试了这个,但似乎成功了。

于 2012-10-26T10:25:18.593 回答
0

这对你有用吗?

cmd = 'logout'
p = subprocess.Popen(cmd, shell=True)

(我没试过,只是猜测!!)

于 2012-10-26T13:08:03.713 回答
0

您可以尝试杀死您的父 PID,这可能是启动您的 shell - 但如果您随后由脚本启动,这将无济于事:

os.kill(os.getppid(),signal.SIGTERM)

但是,如果您要替换 shell,作为登录程序,您可以更改登录设置以运行您的程序,或者exec从父 shell 替换它。因此,除了你自己,你不需要杀死任何东西。

于 2012-10-26T12:18:27.323 回答