Atualmente, estou trabalhando em uma solução que me notificaria sempre que meu servidor de e-mail não puder transferir arquivos para meu servidor ftp. (No momento, meus logs são girados uma vez por noite e imediatamente enviados para um servidor ftp separado)
A configuração atual é a seguinte:
HOST="..."
USER="..."
PASS="..."
DIR="/var/log/maillogs/"
LATEST="$(ls -t $DIR | head -n 2 | tail-n 1)"
FILE=$(basename $LATEST)
error=$(ftp -n $HOST <<EOF
quote USER $USER
quote PASS $PASS
prompt
lcd /var/log/maillogs/
cd /home/MailLog
put $FILE
quit
EOF
)
if [ $(echo $error | grep "failed")=="failed" ]
then
*Sending Mail via sendmail*
fi
Por algum motivo, a condição if sempre retorna true, então recebo um e-mail, não importa se os arquivos puderam ser transportados ou não.
Alguém sabe como eu teria que alterar a instrução if para realmente receber apenas o e-mail, quando não foi possível transferir o log?
Eu também já tentei o método de
if [ $? -ne 0 ]
, mas não tenho muita certeza de como testar se realmente funciona. Tentei fornecer um IP falso ou logins de usuário com falha, mas, ao fazer isso, recebo apenas erros diferentes.
[
é um comando integrado e segue as mesmas regras de sintaxe de outros comandos – os argumentos devem ser colocados entre aspas e separados por espaços.Especificamente, espera-se que o operador como
==
seja um argumento separado, portanto, você não pode omitir espaços ao redor dele. Se o fizer, não é interpretado como um operador – tudo é interpretado como[ one_arg ]
, o modo de argumento único, no qual[
retorna sucesso quando o argumento não está vazio.(Além disso, o operador é apenas
=
. Embora o bash aceite[ x == y ]
, isso não é padrão.)Além disso, quaisquer expansões de strings
$(...)
precisam ser citadas - caso contrário, elas serão divididas em espaços e podem se tornar vários argumentos (ou pior):Com tudo isso dito, você realmente não precisa
[
disso - o shellif
aceita qualquer comando, então você pode usar diretamente o status de saída quegrep
retorna:Outra maneira de fazer verificações de substring é o
case
bloco:Se o seu script estiver usando Bash especificamente (ou seja, se tiver
#!/bin/bash
ou algo assim), você pode simplificar isso usando a[[
palavra-chave, que possui algumas regras especiais de sintaxe - o parâmetro à esquerda não precisa ser colocado entre aspas, o operador de igualdade é==
, mas de maneira mais útil, o valor à direita pode ser uma comparação curinga:Tudo isso era sobre seu script de shell, mas honestamente? Jogue fora o FTP totalmente e substitua-o por, por exemplo, SFTP (que roda via SSH, e provavelmente você já o possui).
Melhor ainda – configure o syslog remoto, usando, por exemplo, syslog-ng, para que as mensagens possam ser transmitidas ao vivo para o servidor.