2014-12-02 60 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('/')+"")) 

...可能不會產生您想要的效果。

相關問題