使用子进程在没有sudo的情况下注销



我希望我的脚本在脚本完成后自动记录当前用户。它可以在基于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完成时,注销命令运行。

最新更新