使用subprocess在没有sudo权限的情况下注销

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身份运行脚本。
我希望能够直接注销用户而无需输入密码。当您在常规终端使用logout时,通常无需输入密码,因此我真的不明白为什么这会成为一个问题。
非常感谢所有的帮助。
编辑:我已经通过向~/.bash_login添加一些额外的代码找到了解决我的问题的方法(请参见我的答案),但为什么上面尝试的方法没有得到答案呢?

也许你可以以sudo权限直接运行这个脚本 - Pramod
你确定它可以使用 sudo 吗?如果我尝试 sudo logout,会提示 sudo: logout: command not found。我认为 logout 是一个 shell 内置命令... - glglgl
2
尝试使用shell=True调用(...),这样命令将被评估为在shell中输入的方式。 - Mikko Ohtamaa
我们需要更多的信息。脚本在做什么?它是如何运行的?它是在什么时候运行的?用户是如何访问服务器的? - Drahkar
添加 shell = True 会给我带来错误 "/bin/sh: 1: logout not found 127"。我认为脚本的其余部分在这里并不那么相关,因为我没有将此调用作为任何内容的一部分,我只是在一切都完成后在最后使用它。它被用于我的一个服务器上,并且在我登录时运行。当它完成后,我不想再手动退出。 - Esso
5个回答

1

根据您的需求,最好的方法可能是将您的Python命令包装在一个Bash脚本中,该脚本运行Python命令,然后以注销结束。

注销是Bash内置函数。它不作为可调用的命令存在于Python中。

示例代码如下:

#!/bin/bash

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

我能理解想要在Python中实现所有功能的想法。然而,如果你使用任何进程来仅通过PID终止会话,你将遇到问题。

我做了类似的事情。谢谢! - Esso

1
这可能会有所帮助,但不确定它是否完全满足您的需求,它将登出当前用户(不如您所希望的那样干净)。
import os
os.system("pkill -KILL -u " + os.getlogin())

我只是快速测试了一下,但似乎解决了问题。


这也会终止作为该用户运行的任何程序。因此,如果他们有驻留在内存中的程序,即使在注销后仍然保持运行状态,这段代码也会将其全部终止。 - Drahkar
@Drahkar 谢谢你解释了那个。我觉得这不是一个很干净的方法,但是我想不到其他让用户退出登录的方式。 - Joe Doherty

0

你可以尝试杀死你的父进程ID,这很可能是启动你的shell - 但如果你随后被一个脚本启动,这并没有什么帮助:

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

然而,如果您要替换shell以充当登录程序,则可以更改登录设置以运行您的程序,或者从父shell中exec以替换它。因此,您不需要杀死任何东西,除了自己。


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


sys.exit(1)

我的脚本。
然后我将以下代码添加到 ~/.bash_login。
if [ "$?" == "0" ]; then
    logout
fi

所以,当Python脚本完成时,注销命令将运行。


0

这个对你有用吗?

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

我没有尝试过,只是猜测而已!!


`>>> cmd = 'logout'
subprocess.Popen(cmd, shell=True)
<subprocess.Popen object at 0x7f3366b9db50>
/bin/sh: 1: logout: not found`
- Esso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接