Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用子流程在没有sudo的情况下注销_Python_Linux_Subprocess - Fatal编程技术网

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

Python 使用子流程在没有sudo的情况下注销,python,linux,subprocess,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 r

我希望我的脚本在脚本完成后自动注销当前用户。它可以在基于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
但是用户必须输入密码才能注销。如果没有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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/subprocess.py”,第679行,在__
错误读取,错误写入)
文件“/usr/lib/python2.7/subprocess.py”,第1249行,在执行子进程中
引发子对象异常
OSError:[Errno 2]没有这样的文件或目录
我不想以root用户身份运行脚本本身

我希望能够直接将用户注销,而无需输入密码。当你在普通终端中使用注销时,你通常不需要输入密码,所以我真的不明白为什么这是一个问题

非常感谢您的帮助


编辑:我通过在~/.bash_登录中添加一点额外的代码找到了解决问题的方法(请参见我的答案),但为什么我在上面尝试的问题没有得到回答。

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


我只是很快地测试了一下,但似乎成功了。

你可以尝试杀死你的父母PID,这很可能是启动你的外壳-但如果你是由一个脚本启动的,那将不会有帮助:

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

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

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

注销是一个Bash内置函数。它不是一个可以通过Python使用的可调用命令

大意是:

#!/bin/bash

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

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

这对您有用吗

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

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

我找到了解决问题的办法。我补充说

sys.exit(1)
我的剧本

然后我在~/.bash\u登录中添加了以下代码

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

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

也许您可以将脚本本身作为sudoa运行。您真的确定它可以与
sudo
一起工作吗?如果我尝试
sudo注销
,我会被告知
sudo:logout:command未找到
。我认为
logout
是一个shell内置函数…Try call(…,shell=True),因此命令在shell中输入时进行计算。我们需要更多信息。剧本在做什么?它是如何运行的?什么时候运行?用户是如何访问服务器的?添加shell=True会出现错误“/bin/sh:1:logout not found 127”我认为脚本的其余部分与此无关,因为我没有将此调用作为任何内容的一部分,我只是在其他所有内容完成后才使用它。它在我的一台服务器上使用,并且在我登录时运行。当它完成后,我不想再次手动注销。这也会杀死任何按照用户所说的方式运行的东西。因此,如果他们有内存驻留程序,即使在注销后仍保持运行,这段代码将杀死所有程序。@Drahkar啊,谢谢你的解释。我不认为这是一种非常干净的方法,但想不出其他方法让用户注销。
>cmd='logout'>>>subprocess.Popen(cmd,shell=True)>>>/bin/sh:1:logout:not found
我做了类似的事情。谢谢
sys.exit(1)
if [ "$?" == "0" ]; then
    logout
fi