2011-08-01 15 views

Respuesta

33

utilizar la sintaxis heredoc para incrustar el otro script dentro de un script de shell:

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

Los usuarios deben tener en cuenta que el uso de comillas en la línea uno es crítico si el script pegado contiene variables de shell; sin comillas, serán evaluadas por el shell actual antes de la operación cat; pero con comillas, se reflejarán como literales exactamente como se pegaron. –

21

El enfoque heredoc es grande, pero no se puede utilizar ingenuamente:

  • hay problemas con no preserva espacios y pestañas en el contenido pegado, que son difíciles de leer en la pantalla, y pueden desencadenarse por las funciones de limpieza automática de su editor de texto
  • Si el marcador de fin de heredoc que utiliza aparece en el pegado contenido, la operación se final temprano - problema si el contenido tiene su propio heredoc y utiliza un marcador común como 'EOF'.

Esto significa que un enfoque heredoc ingenuo puede tener éxito o no, dependiendo del contenido exacto que se pega. Eso viola el principio de menos asombro y es peligroso desde semi-aleatorio.

Prefiero un enfoque donde el contenido se captura con base64 uuencode primero. Esto elimina la posibilidad de un comportamiento diferente según el contenido, por lo que nunca tendrá que volver a pensar en esto. enfoque

más seguro:

  1. identificar el contenido de capturar, dicen whatever.sh
  2. uuencode -m whatever.sh whatever.sh >tmp
  3. pegar el contenido de tmp en el derivador de scripts
  4. con un marcador heredoc que no pueden ocurrir en base64

El script final se parece a:

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

Existe una pequeña posibilidad de que cualquier línea de datos uuencoded coincida con su marcador heredoc. Probablemente no usará marcadores de 60 caracteres de longitud :), pero la última línea puede ser más corta y existe la posibilidad de que el contenido codificado accidentalmente coincida con su marcador, a menos que el marcador utilice un carácter (como guión bajo) que no puede ocurrir en codificación base64. _EOF es siempre seguro.

También es prudente citar el marcador heredoc como '_EOF' para evitar la expansión de variables de shell en el bloque. No creo que una carga útil codificada en base64 pueda inadvertidamente hacer referencia a una variable de shell ya que $ no se usa en base64, pero las citas eliminan esta posibilidad. También ayuda a establecer el hábito de siempre citar el marcador heredoc a menos que haya una razón por la que desee la expansión del shell. Este es otro comportamiento dependiente del contenido que es complicado ya que aparentemente es aleatorio. SIEMPRE cite su marcador heredoc a menos que sepa que desea la expansión de shell dentro del bloque de contenido.

Lo anterior es un procedimiento manual. Es fácil automatizar las mismas plantillas de uso.

2

Cuando desee imprimir en un archivo que requiera el uso de sudo, ¡la respuesta es totalmente obvia!

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 
Cuestiones relacionadas