通过subprocess.call向localhost发出命令

时间:2016-11-11 09:43:06

标签: python linux bash

我是python和Linux的新手。我试图从python执行一个bash命令,它给localhost一个命令。

最初我尝试使用os.system

os.system('echo "(primitive-load \"/opt/doc/test.txt\")" |nc localhost xxxxx')

我使用os.system成功调用了几个命令。但是这个带有文件路径的特定命令不会执行。所以我尝试使用subprocess.call

subprocess.call( 'echo "(primitive-load \"/opt/doc/test.txt\")" |nc localhost xxxxx')

但是抛出了以下错误。

 File "/usr/lib/python2.7/subprocess.py", line 523, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

我也尝试了以下

command = 'echo "(primitive-load \"/opt/doc/test.scm\")"|nc localhost xxxxx;'
process = os.popen(command)

实现这一目标的其他任何方式?

3 个答案:

答案 0 :(得分:0)

在挖掘到subprocess.call后,如果args传递给subprocess.call是str类型,如echo xxxx',它将尝试查找可执行文件文件系统中的二进制echo xxxx,它会导致IOError。

subprocess.call还会收到args列表。

所以,你可以这样做:

import subprocess
import shlex
subprocess.call(shlex.split('echo "(primitive-load \"/opt/doc/test.txt\")" |nc localhost xxxxx'))

您也可以将shell=True传递给原始电话,例如:

subprocess.call('echo "(primitive-load \"/opt/doc/test.txt\")" |nc localhost 1111', shell=True)

可能导致安全性issues

根据评论,它应该是这样的:

echo = subprocess.Popen('echo "(primitive-load \"/opt/doc/test.txt\")"', shell=True)
nc = subprocess.call('nc localhost 1111', shell=True, stdin=echo.stdout)
nc.wait()

答案 1 :(得分:0)

尝试以下操作可能对您的情况有所帮助:

    if ($_GET['action_ent'] != "#!@#!@#!@")
    {
    $myInputs = $_GET['action_ent'];
     foreach ($myInputs as $eachInput) 
     {

            $valores = $eachInput;
            print_r($valores);
            $dummy = explode('#!@', $valores);

            $acao = $dummy[0];
            $resp_acao = $dummy[1];
            $inic_plan_acao = $dummy[2];
            $fim_plan_acao = $dummy[3];


            $inicio_acc = explode("/", $inic_plan_acao);
            $fim_acc = explode("/", $fim_plan_acao);

            $inicio_action = $inicio_acc[2]."-".$inicio_acc[1]."-".$inicio_acc[0];
            $fim_action = $fim_acc[2]."-".$fim_acc[1]."-".$fim_acc[0];




                $result2 = mysql_query("INSERT INTO `demv3`.`entraves_action` (`action_id`, `ent_id`, `resp_ent`, `data_fim`,`action_desc`,`action_resp`,`action_comeco`,`action_fim`) VALUES ('0', '$ent_id', '$resp_ent', '$data_fim', '$acao', '$resp_acao', '$inicio_action', '$fim_action')");

     }

    }
    else
    {
        echo "NOTHING";
    }

希望这有助于不要忘记upvote

答案 2 :(得分:0)

这解决了我的问题。

loadData='echo "(primitive-load \\"/opt/doc/body.txt\\")" |nc localhost xxxxxx'
subprocess.call(loadData,shell=True)