0

我有一个使用以下代码在 Python 中编码的 bash 脚本:

import tempfile
import subprocess
import zlib

with open("/root/test.sh") as inputfile:
    teststr = zlib.compress(inputfile.read()).encode('base64')
    print teststr

这给了我编码的字符串,然后我将其作为我的 python 脚本中的变量传递,就像这样(请注意,这是一个安装的示例脚本pip):

piping="eJyNksFuwyAMhs/wFJ4qTdsBrG63HXLdY0yEEoKSAAJnXTvt3QdtNyWTWu2EkX//tj/Y3GHrPLYq95xz5zOpcXyLLj48fnLG2TTsXAKcc8IxaDViThq7kIqi6JneXcuxDbwaIuctZENzFBTCmIECXJpAPFAfvKhqtreGoCeK+QUxHqKT56wMyWJUelDWZMxhTtpgCarjyXARiq3cymdJKkl7BCF8ELo3ehDaJHKd04oMNM1y4K6borHlUpq4KMsJT839lrNiAseP9w6u2a991sUFyt8yzs77nBNluV8Kt4yWEJXf/dScmJ5QQKG94Ag3HmSNOKm9tI76uZU6TJW4qr1xUplMQh08JddiKam+dd5bc152+5+afy2/Gf8G8sjZTA=="
installpip=zlib.decompress(piping.decode('base64'))

with tempfile.NamedTemporaryFile() as scriptfile:
        scriptfile.write(installpip)
        scriptfile.flush()
        subprocess.call(['/bin/bash', scriptfile.name])

然后使用pytinstaller 2.0. 运行安装时,它运行良好,但编码的变量被解码并临时存储在/tmpas 中tmpXXXXX,这显示为在运行时运行ps auxand top

如何避免这种情况?

4

2 回答 2

1

不要使用命名的临时文件,而是将其内容通过管道传递stdin

import tempfile, subprocess
installpip="echo 'hello'\n"

with tempfile.TemporaryFile() as scriptfile:
        scriptfile.write(installpip)
        scriptfile.flush()
        scriptfile.seek(0)
        subprocess.call(['/bin/bash', '-s'], stdin=scriptfile)

当然,这也不是完全防弹的,但我相信你已经知道了。

于 2013-10-29T07:53:42.860 回答
0

不要使用临时文件。相反,直接通过管道与进程通信:

import subprocess

content = "echo 'hello'\n"
p = subprocess.Popen(['/bin/bash', '-s'], stdin=subprocess.PIPE)
p.communicate(content)
于 2013-10-29T09:55:01.240 回答