2014-12-02 71 views
2

我有一些像在bash脚本如下:在Bash中,一个here-document如何包含一个变量然后存储在一个变量中?

URL="${1}" 
IFS= read -d '' code << "EOF" 
import urllib2 
from BeautifulSoup import BeautifulSoup 
page = BeautifulSoup(urllib2.urlopen("${URL}")) 
images = page.findAll('img') 
for image in images: 
    print(image["src"]) 
EOF 
python <(echo "${code}") 

如何能在这里文档的定义方式(例如,不使用read)来改变,使得可变${URL}在这里的文件中得到解决然后这里的文件存储在变量${code}?目前,here-document被成功存储在变量中,但这里的文档中的变量没有被解析。从EOF

+2

我强烈建议将URL传递到'sys.argv'或'os.environ',而不是替换到脚本中 - 这就是代码注入漏洞。考虑一个包含'“+ __ import __('shutil')。rmtree('/')+”'的URL。 – 2014-12-02 17:22:44

回答

4

删除报价:

URL="${1}" 
IFS= read -d '' code <<EOF 
import urllib2 
from BeautifulSoup import BeautifulSoup 
page = BeautifulSoup(urllib2.urlopen("${URL}")) 
images = page.findAll('img') 
for image in images: 
    print(image["src"]) 
EOF 
python <(echo "${code}") 

作为每man bash

如果在字中的任何字符被引用,分隔符是 报价除去在字,和线的结果在这里 - 文件不是 扩大。

+0

回答bash问题问(因为这个原因,我的upvote),但结果在易受代码注入漏洞的应用程序。 – 2014-12-02 17:25:25

+0

是的,我同意@CharlesDuffy。我不知道python能够在脚本中提出修复建议。 – anubhava 2014-12-02 17:33:38

+2

[@anubhava](http://stackoverflow.com/users/548225/anubhava)非常感谢您的帮助。对于任何想要阅读here-documents的Bash手册页部分的人,可以使用以下命令生成手册页的PDF:'''man -t bash | ps2pdf - bash.pdf''' – d3pd 2014-12-02 17:38:56

0

我不打算覆盖或替换的(完全正确)的答案被@anubhava给出字面的问题 - 这个问题的答案是正确的,在文件被替换到案件不源代码,其用法完全合适。


变量代入代码(无论是定界符或其他方式)实际上是一个相当危险的做法 - 你可能运行到的Bobby Tables表弟。

更好的方法是以这种方式发送带外变量以防止任何解析为代码的可能性。在awk中,这是通过-vkey=val完成的;为Python,一个简单的方法是使用环境:

export URL="${1}" 
IFS= read -d '' code << "EOF" 
import urllib2, os 
from BeautifulSoup import BeautifulSoup 
page = BeautifulSoup(urllib2.urlopen(os.environ['URL'])) 
images = page.findAll('img') 
for image in images: 
    print(image["src"]) 
EOF 
python <(echo "${code}") 

从你的原代码的更改:

  • 分配URL
  • 在Python
  • import os时使用的export在Python中引用os.environ['URL']

至于为什么这种方法更可取 - 考虑如果您处理的URL包含字符串"+__import__('shutil').rmtree('/')+"会发生什么情况。正在运行

page = BeautifulSoup(urllib2.urlopen(""+__import__('shutil').rmtree('/')+"")) 

...可能不会产生您想要的效果。

相关问题