通过a";“shell脚本”;作为Python subprocess.Popen的字符串
我想执行一个字符串,就像它是Mininet的通过a";“shell脚本”;作为Python subprocess.Popen的字符串,python,bash,shell,subprocess,mininet,Python,Bash,Shell,Subprocess,Mininet,我想执行一个字符串,就像它是Mininet的host.popen()模块中的shell脚本一样,它本质上是Python的subprocess.popen()的包装器。脚本如下: #!/bin/bash T="$(date +%s%N)" nc 10.0.0.7 1234 < somefile.txt T="$(($(date +%s%N)-T))" echo $T 问题是每次我运行这个脚本时,发送的文件,somefile.txt,都是不同的,它每秒运行几次,持续几分钟。我不希望为每
host.popen()
模块中的shell脚本一样,它本质上是Python的subprocess.popen()的包装器。脚本如下:
#!/bin/bash
T="$(date +%s%N)"
nc 10.0.0.7 1234 < somefile.txt
T="$(($(date +%s%N)-T))"
echo $T
问题是每次我运行这个脚本时,发送的文件,somefile.txt
,都是不同的,它每秒运行几次,持续几分钟。我不希望为每个文件都编写一个新的.sh脚本。当我试图将脚本作为字符串传递到popen()
dst_cmd = 'nc -l 1234 > /dev/null'
dst.popen( dst_cmd, shell=True )
src_cmd = '''\
#!/bin/bash
T=\"$(date +%s%N)\"
nc 10.0.0.7 1234 < somefile.txt
T=\"$(($(date +%s%N)-T))\"
echo $T'''
p = src.popen( dedent(src_cmd), shell=True,
stdout=subprocess.PIPE )
为什么呢?我是否遗漏了导致不同(意外)输出的格式化内容?假设mininet popen接口与Subprocess.popen相同,那么您编写的内容是错误的。您必须传递一个命令,该命令可以是:
- 可执行文件及其参数
- 或者一个shell命令,只要您使用
shell=True
——您可以在shell提示符下键入该命令
但它不能是shell脚本的内容
当然,如果脚本可以看作是一个多行命令,并且shell支持多行命令,那么将执行单个命令。因此,如果您的默认shell已经是bash,那么它可以工作,但是如果默认shell是/bin/ash
,那么所有命令都将由该默认shell执行,因为行#/bin/sh
将被视为一个简单的注释,并被忽略
例如:
foo.py:
#! /usr/local/bin/python
a = 5
for i in range(10): print i
文件的执行是正确的
$ sh -c ./foo.py
0
1
2
3
4
但是文件内容的执行会导致错误,因为shebang(#!
)被视为一个mete注释:
$ sh -c '#! /usr/local/bin/python
a = 10
for i in range(10): print i
'
a: not found
Syntax error: "(" unexpected
假设mininet popen接口与Subprocess.popen相同,那么您编写的是错误的。您必须传递一个命令,该命令可以是:
- 可执行文件及其参数
- 或者一个shell命令,只要您使用
shell=True
——您可以在shell提示符下键入该命令
但它不能是shell脚本的内容
当然,如果脚本可以看作是一个多行命令,并且shell支持多行命令,那么将执行单个命令。因此,如果您的默认shell已经是bash,那么它可以工作,但是如果默认shell是/bin/ash
,那么所有命令都将由该默认shell执行,因为行#/bin/sh
将被视为一个简单的注释,并被忽略
例如:
foo.py:
#! /usr/local/bin/python
a = 5
for i in range(10): print i
文件的执行是正确的
$ sh -c ./foo.py
0
1
2
3
4
但是文件内容的执行会导致错误,因为shebang(#!
)被视为一个mete注释:
$ sh -c '#! /usr/local/bin/python
a = 10
for i in range(10): print i
'
a: not found
Syntax error: "(" unexpected
假设mininet popen接口与Subprocess.popen相同,那么您编写的是错误的。您必须传递一个命令,该命令可以是:
- 可执行文件及其参数
- 或者一个shell命令,只要您使用
shell=True
——您可以在shell提示符下键入该命令
但它不能是shell脚本的内容
当然,如果脚本可以看作是一个多行命令,并且shell支持多行命令,那么将执行单个命令。因此,如果您的默认shell已经是bash,那么它可以工作,但是如果默认shell是/bin/ash
,那么所有命令都将由该默认shell执行,因为行#/bin/sh
将被视为一个简单的注释,并被忽略
例如:
foo.py:
#! /usr/local/bin/python
a = 5
for i in range(10): print i
文件的执行是正确的
$ sh -c ./foo.py
0
1
2
3
4
但是文件内容的执行会导致错误,因为shebang(#!
)被视为一个mete注释:
$ sh -c '#! /usr/local/bin/python
a = 10
for i in range(10): print i
'
a: not found
Syntax error: "(" unexpected
假设mininet popen接口与Subprocess.popen相同,那么您编写的是错误的。您必须传递一个命令,该命令可以是:
- 可执行文件及其参数
- 或者一个shell命令,只要您使用
shell=True
——您可以在shell提示符下键入该命令
但它不能是shell脚本的内容
当然,如果脚本可以看作是一个多行命令,并且shell支持多行命令,那么将执行单个命令。因此,如果您的默认shell已经是bash,那么它可以工作,但是如果默认shell是/bin/ash
,那么所有命令都将由该默认shell执行,因为行#/bin/sh
将被视为一个简单的注释,并被忽略
例如:
foo.py:
#! /usr/local/bin/python
a = 5
for i in range(10): print i
文件的执行是正确的
$ sh -c ./foo.py
0
1
2
3
4
但是文件内容的执行会导致错误,因为shebang(#!
)被视为一个mete注释:
$ sh -c '#! /usr/local/bin/python
a = 10
for i in range(10): print i
'
a: not found
Syntax error: "(" unexpected
我认为您想要的是将文件名传递给脚本,对吗
p = src.popen( ['sh', './timer.sh', 'filename.txt'], stdout=subprocess.PIPE )
在剧本里呢
FILENAME="$1"
....
nc 10.0.0.7 1234 < "$FILENAME"
sh-c
告诉shell以文本形式执行下一个命令。请注意,您不需要shell=True
,因为您不需要对代码进行任何解析
编辑2:
这就是你回答得太快的原因。您确实可以通过这种方式将完整的shell脚本传递给shell。只是不要做任何逃跑的事(并且可能要摆脱shebang):
我认为您想要的是将文件名传递给脚本,对吗
p = src.popen( ['sh', './timer.sh', 'filename.txt'], stdout=subprocess.PIPE )
在剧本里呢
FILENAME="$1"
....
nc 10.0.0.7 1234 < "$FILENAME"
sh-c
告诉shell以文本形式执行下一个命令。请注意,您不需要shell=True
,因为您不需要对代码进行任何解析
编辑2:
这就是你回答得太快的原因。您确实可以通过这种方式将完整的shell脚本传递给shell。只是不要做任何逃跑的事(并且可能要摆脱shebang):
我认为您想要的是将文件名传递给脚本,对吗
p = src.popen( ['sh', './timer.sh', 'filename.txt'], stdout=subprocess.PIPE )
在剧本里呢
FILENAME="$1"
....
nc 10.0.0.7 1234 < "$FILENAME"
sh-c
告诉shell按指示执行下一个命令