AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1140550
Accepted
Moritz
Moritz
Asked: 2023-08-03 14:02:48 +0800 CST2023-08-03 14:02:48 +0800 CST 2023-08-03 14:02:48 +0800 CST

Notificando um administrador quando o servidor de email não conseguiu fazer upload de logs para o servidor ftp - se a condição estiver falhando

  • 772

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.

centos
  • 1 1 respostas
  • 16 Views

1 respostas

  • Voted
  1. Best Answer
    user1686
    2023-08-03T14:21:58+08:002023-08-03T14:21:58+08:00

    [é 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.

    [ $(echo $error | grep "failed") = "failed" ]
                                    ^ ^
    

    (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):

    [ "$(echo "$error" | grep failed)" = failed ]
      ^                              ^
    

    Com tudo isso dito, você realmente não precisa [disso - o shell ifaceita qualquer comando, então você pode usar diretamente o status de saída que grepretorna:

    if echo "$error" | grep -qs failed; then
        echo "It failed :("
    fi
    

    Outra maneira de fazer verificações de substring é o casebloco:

    case $error in
        *failed*)
            echo "Fail :("
            ;;
        *)
            echo "Success!"
            ;;
    esac
    

    Se o seu script estiver usando Bash especificamente (ou seja, se tiver #!/bin/bashou 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:

    if [[ $error == *failed* ]]; then
        echo "Fail :("
    fi
    

    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).

    HOST="..."
    USER="..."
    # no PASS, it uses your id_rsa
    DIR="/var/log/maillogs/"
    LATEST="$(ls -t $DIR | head -n 2 | tail-n 1)"
    FILE=$(basename $LATEST)
    
    scp -p "$LATEST" "$USER@$HOST:/home/MailLog/" || {
        echo "Fail :("
    }
    

    Melhor ainda – configure o syslog remoto, usando, por exemplo, syslog-ng, para que as mensagens possam ser transmitidas ao vivo para o servidor.

    • 1

relate perguntas

  • Como descobrir detalhes sobre hardware na máquina Linux?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve