2016-09-18 63 views
0

这样的设计让我哭,下面的代码,请大家帮忙语法错误而使用子

def runbatch(CMD,HOST): 
    print CMD 
    print HOST 
    for host in HOST: 
     env.host_string=host 
     print CMD 
     print env.host_string 
     print "Execute command : \"%s\" at Host : %s" %(CMD,host) 
     print "-------------------------------------------------" 
     p=subprocess.Popen("run('ls')",shell=True, 
      stderr=subprocess.PIPE, 
      stdin=subprocess.PIPE) 
     output = p.communicate() 
     print output 

错误显示

(无,“/ bin/sh的:-c:0行:靠近意外的标记'ls''\n/bin/sh: -c: line 0:运行语法错误( 'LS')“\ n”)

+0

你试图从你的python脚本运行'ls'命令吗?如果是这样,请尝试'p = subprocess.Popen(“ls”,shell = True)'。这应该列出当前标准输出中的所有文件。 – TuanDT

+0

ls返回正常,但我需要使用fabric运行命令列出远程主机 – Flasking

回答

0

subprocess.Popen()本地机器上运行bash命令。 fabric必须提供的是一种在本地机器上输入命令的方法,其被发送到并在远程机器上运行。为此,您需要一个fabfile.py(现在,您需要命名为fabfile.py),其中存储结构fabric.api.run()命令,该命令实际上是一个Python命令而不是bash命令。 fabric.api.run()的参数是在远程机器上运行的bash命令。例如。的fabfile.py

from fabric.api import run 
from fabric.api import env 
def runcommand(): 
    run(env.my_command) 

使用这个例子中,你可以激活使用命令行fab --set my_command=some_bash_command -H remote_host_ip runcommand这个远程调用。该字符串是您应在脚本中传递给subprocess.Popen()的字符串。例如。让我们把你的脚本stackoverflow.py,在命令行参数使用bash的功能,可以在远程机器

import subprocess 
import sys 

p=subprocess.Popen("fab --set my_command="+sys.argv[1]+" -H localhost runcommand",shell=True, 
        stderr=subprocess.PIPE, 
        stdin=subprocess.PIPE) 
output = p.communicate() 
print output 

采样运行上执行:

Chip [email protected] 12:10:[email protected] ~: python stackoverflow.py ls 
[localhost] Executing task 'runcommand' 
[localhost] run: ls 
[localhost] out: AllArms.py    fines 
[localhost] out: Applications    github 
[localhost] out: Box Sync    grades_assgn1 
[localhost] out: DFExperiment    heuristic.py 
[localhost] out: Desktop     honour-project-in-thompson-sampling 
[localhost] out: Documents    jags_bin 
[localhost] out: Downloads    latemath 
[localhost] out: Dropbox     launchall.sh 
[localhost] out: FIT3080     launcher 
[localhost] out: GaussianExperiments   launchucb.sh 
[localhost] out: GoogleDrive    minuteSep5 
[localhost] out: HierarchicalStan.py   minutes22aug 
[localhost] out: IMG_6169.JPG    model1.pkl 
[localhost] out: Library     mydata 
[localhost] out: Monarch     notes15Aug2016 
[localhost] out: Movies     notesSep12 
[localhost] out: Music     old-honour 
[localhost] out: PTSTuneBeta    oracle.R 
[localhost] out: Pictures    paper 
[localhost] out: Public     parallelExperiments 
[localhost] out: Samsung     people_to_mark_first 
[localhost] out: WindowFrame.class   rezaPhone 
[localhost] out: WindowFrame.java   spike.py 
[localhost] out: a.out     stackoverflow.class 
[localhost] out: aaai.tar.gz    stackoverflow.cpp 
[localhost] out: all_experiments    stackoverflow.java 
[localhost] out: api4.csv    stackoverflow.py 
[localhost] out: atlas     test 
[localhost] out: boostlib    test.py 
[localhost] out: codes_and_data.tar.gz   test.txt 
[localhost] out: eclipse     test1.html 
[localhost] out: emo     test2.html 
[localhost] out: experimentlist    testlib.py 
[localhost] out: fabfile.py    testlib.pyc 
[localhost] out: fabfile.pyc    uselib.py 
[localhost] out: file1     uselib.pyc 
[localhost] out: file2 
[localhost] out: 


Done. 
Disconnecting from localhost... done. 
(None, "[localhost] Login password for 'hiennguyen': \n") 

重要提示:当调用fab这个方式,你可能必须:

  1. 启用ssh访问您的远程机器。在这种情况下,远程机器只是localhost

  2. 有时,远程主机需要您输入密码,你不会被提示输入密码(这是我的机器上的情况下)。如果您等待一段时间并且什么也没看到,您可能需要输入密码,然后按ENTER键。

+0

明白了,谢谢! – Flasking