2011-08-01 16 views

Odpowiedz

33

Użyj składni heredoc osadzić inny skrypt w skrypcie powłoki:

cat > file.tmp <<'endmsg' 
script goes here... 
endmsg 
+6

Użytkownicy powinni pamiętać, że użycie cudzysłowów na linii pierwszej ma kluczowe znaczenie, jeśli wklejony skrypt zawiera zmienne powłoki - bez cudzysłowów będą one oceniane przez bieżącą powłokę przed operacją cat; ale z cytatami będą one powtarzane jako literały dokładnie jak wklejone. –

21

Podejście heredoc jest super, ale nie można go używać naiwnie:

  • Istnieją problemy z nie zachowuje spacji i zakładek w wklejonej zawartości, które są trudne do odczytania na ekranie i mogą być wywoływane przez funkcje automatycznego czyszczenia edytora tekstu
  • Jeśli użyty znacznik końca heredoca występuje w wklejonym treść, operacja będzie koniec wcześnie - problem, jeśli zawartość ma własny heredoc i używa wspólnego znacznika, takiego jak "EOF".

Oznacza to, że naiwne podejście heredok może odnieść sukces lub zakończyć się niepowodzeniem w zależności od dokładnej zawartości, która została wklejona. Narusza to zasadę najmniejszego zdumienia i jest niebezpieczne, ponieważ jest pół-losowe.

Preferuję podejście, w którym treść jest przechwytywana najpierw uuencode base64. Eliminuje to możliwość różnych zachowań w zależności od zawartości, dzięki czemu nigdy więcej nie będziesz musiał o tym myśleć.

Bezpieczniejsze podejście:

  1. Określenie zawartości do przechwytywania, powiedzmy whatever.sh
  2. uuencode -m whatever.sh whatever.sh >tmp
  3. Wklej zawartość tmp do owijki skryptu
  4. użyć znacznika heredoc że nie może występuje w base64

Ostateczny skrypt wygląda następująco:

cat > file.tmp <<'_EOF' 
begin-base64 644 whatever.sh 
bHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMg 
LWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxS 
CmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxz 
IC1sUgpscyAtbFIK 
==== 
_EOF 
uudecode file.tmp 

Istnieje niewielka możliwość, że dowolna linia uuencoded danych może pasować do twojego znacznika heredoc. Prawdopodobnie nie użyjesz znaczników o długości 60 znaków :), ale ostatnia linia może być krótsza i istnieje możliwość, że uuencoded zawartość przypadkowo pasuje do twojego znacznika, chyba że znacznik używa znaku (takiego jak podkreślenie), który nie może wystąpić w kodowaniu base64. _EOF jest zawsze bezpieczny.

Rozważne jest również cytowanie znacznika heredoc, takiego jak '_EOF', aby zapobiec rozszerzaniu powłoki w bloku. Nie sądzę, aby ładunek kodowany base64 mógł kiedykolwiek nieumyślnie odwoływać się do zmiennej powłoki, ponieważ $ nie jest używany w base64, ale wycena eliminuje tę możliwość. Pomaga również ustalić nawyk zawsze cytowania znacznika heredoc, chyba że istnieje powód, dla którego chcesz rozszerzyć powłokę. Jest to kolejne zachowanie zależne od treści, które jest trudne, ponieważ wydaje się przypadkowe. ZAWSZE cytuj swój znacznik heredoc, chyba że wiesz, że chcesz rozszerzyć powłokę w bloku treści!

Powyższa procedura jest ręczna. Łatwo zautomatyzować to samo za pomocą szablonów.

2

Jeśli chcesz wyprowadzić plik, który wymaga użycia numeru sudo, odpowiedź jest całkowicie nieoczywista!

sudo tee /etc/php/conf.d/xdebug.ini > /dev/null <<'TXT' 
zend_extension=xdebug.so 
xdebug.remote_enable=on 
xdebug.remote_autostart=on 
xdebug.remote_host=127.0.0.1 
xdebug.remote_port=9000 
xdebug.remote_handler=dbgp 
TXT 
Powiązane problemy