Múltiplos comandos com citações após o SSHing

2

Eu tenho um servidor que eu tenho que usar com muitos comandos que apresentam o uso de atribuição de variáveis e, consequentemente, um monte de aspas. Se considerarmos o script:

ssh user@host  "kinit -k -t /path/to/dir/'whoami'.'hostname -s'.keytab 'whoami'/'hostname -f'@host ;

set -x

touch health_check.log ;

echo \"Starting HDFS health check\" > health_check.log ;
echo \"/path/to\" >> health_check.log ;

hdfs dfs -du -h /path/to &>> health_check.log ;

echo \"**************************************************************************
/path/to/dir\" >> health_check.log ;

hdfs dfs -du -h /path/to/dir &>> health_check.log ;

subject=\"HDFS Health Check\" ;
from=\"[email protected]\" ;
recipients=\"[email protected]\" ;
mail=\"subject:$subject\nfrom:$from\nContent-Type: text/html\nMIME-Version: 1.0\n\n$(cat health_check.log)\" ;



echo -e $mail | sendmail \"$recipients\" ;

set +x
rm health_check.log
"

Quando executo o script, recebo esta saída de depuração:

++ subject='HDFS Health Check'
++ [email protected]
++ [email protected]
++ mail='subject:\nfrom:\nContent-Type: text/html\nMIME-Version: 1.0\n\nStarting HDFS health check /data/gftocon'
++ echo -e
++ sendmail ''

Observe as strings vazias onde minhas variáveis devem estar. Por que escapar das aspas não funcionou?

    
por Nanor 14.11.2016 / 17:21

2 respostas

2

Isso porque o script é citado duas vezes: seu shell está substituindo as variáveis antes de iniciar o comando ssh. Você pode adicionar algumas barras invertidas extras ou usar um citado heredoc assim:

ssh user@host  <<'END_COMMANDS'
# ...............^............^ these quotes make the whole document single-quoted
kinit -k -t /path/to/dir/'whoami'.'hostname -s'.keytab 'whoami'/'hostname -f'@host
set -x
echo "Starting HDFS health check" > health_check.log 
echo "/path/to" >> health_check.log 
hdfs dfs -du -h /path/to &>> health_check.log 
echo "**************************************************************************
/path/to/dir" >> health_check.log 
hdfs dfs -du -h /path/to/dir &>> health_check.log 

subject="HDFS Health Check" 
from="[email protected]" 
recipients="[email protected]" 

headers="subject:$subject
from:$from
Content-Type: text/html
MIME-Version: 1.0"

{ echo "$headers"; echo; cat health_check.log; } | sendmail "$recipients" 

set +x
rm health_check.log
END_COMMANDS

Acho mais fácil de manter.

    
por 14.11.2016 / 17:45
0

Acho que você deve escapar dos caracteres $ de seu bloco " " .

Seu comando de e-mail seria:

mail=\"subject:\$subject\nfrom:\$from\nContent-Type: text/html\nMIME-Version: 1.0\n\n\$(cat health_check.log)\" 

Nota: parece que o $(cat) funciona. Não tenho certeza do porquê.

    
por 14.11.2016 / 17:44