在Bash中,here文档如何包含一个变量,然后存储在变量中?
我在Bash脚本中有如下内容:在Bash中,here文档如何包含一个变量,然后存储在变量中?,bash,variables,heredoc,Bash,Variables,Heredoc,我在Bash脚本中有如下内容: 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
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}")
URL=“${1}”
IFS=read-d''code从EOF
中删除引号:
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}")
URL=“${1}”
如果s=read-d''code我不打算覆盖或替换@anubhava给出的字面问题的(完全正确的)答案——这个答案是正确的,并且在被替换成的文档不是源代码的情况下,它的用法是完全合适的
将变量替换到代码中(无论是在heredoc中还是在其他地方)实际上是一种相当危险的做法——您可能会遇到类似的情况
更好的方法是将变量发送到带外,以防止任何可能的代码解析。在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传递到sys.argv
或os.environ
,而不是替换到您的脚本中——这样会存在代码注入漏洞。想想一个URL
包含“+”导入“('shutil')。rmtree('/')+”
。回答了bash的问题(出于这个原因,我有自己的投票权),但会导致应用程序容易受到代码注入漏洞的攻击。是的,我同意@CharlesDuffy。我对python不太了解,无法在脚本中提出修复建议。非常感谢你在这方面的帮助。对于任何想要阅读此处文档中Bash手册页部分的人,您可以使用以下命令生成手册页的PDF:man-t Bash | ps2pdf-Bash.PDF
一个简单的修复方法是在heredoc的开头导入os
,导出URL
中的值,然后调用urlib2.urlopen(os.environ['URL'])
。
page = BeautifulSoup(urllib2.urlopen(""+__import__('shutil').rmtree('/')+""))