usando sed no script BASH: substitua text por info das variáveis do sistema (hostname e date)

0

Eu quero usar um script bash para executar um backup e, em seguida, enviar-me um email usando ssmtp. Eu estou tentando fazer um script genérico que eu possa reutilizar em diferentes máquinas Linux. Abaixo está um trecho do script em que uso sed para substituir algum texto de espaço reservado por $HOSTNAME e $DATE variables. Por alguma razão, quando ele é executado, recebo o e-mail, mas em vez de inserir o nome do host e a data, ele apaga os marcadores de posição. Alguém pode apontar o que estou fazendo errado?

Aqui está a seção do meu script:

sed -i -e "s/HNAME/$HOSTNAME/g" backup_notification
sed -i -e "s/DATETIME/$date/g" backup_notification

ssmtp [email protected] < backup_notification

Aqui está o arquivo de texto da notificação ( HNAME e DATETIME são os espaços reservados que quero que o sed substitua pelas informações de variável do sistema):

To: [email protected]
From: [email protected]
Subject: Backup completed

This confirms that backup is completed for HNAME on DATETIME.

E aqui está o que o texto do email tem (observe que os espaços reservados HNAME e DATETIME foram apagados ou substituídos por nil.):

-----Original Message-----
From: root [mailto:[email protected]] 
Sent: Thursday, March 10, 2016 1:15 PM
To: Me
Subject: Backup completed

This confirms that the backup is completed for has been renewed on .

TIA para qualquer ajuda:)!

    
por Chris 10.03.2016 / 23:36

2 respostas

1

$ HOSTNAME e $ DATE não são definidos como variáveis por padrão. Em vez disso, use $ (command) para inserir a saída (stdout) de command na string.

Por exemplo, no seu caso, substitua $ HOSTNAME por você que deseja usar $(hostname) e $(date) :

sed -i -e "s/HNAME/$(hostname)/g" backup_notification
sed -i -e "s/DATETIME/$(date)/g" backup_notification

Além disso, o sinalizador -i no sed irá editar seu modelo de backup_notification, conforme indicado por @ user568271. Se você não quiser, leia e edite com um pipe:

cat backup_notification | sed -e "s/HNAME/$(hostname)/g" | sed -e "s/DATETIME/$(date)/g" | ssmtp [email protected]
    
por 10.03.2016 / 23:39
0

O interruptor -i não vai "editar no local" o seu arquivo de modelo de mensagem.

Você não precisará de uma versão inalterada do modelo na notificação de backup no início do processo de backup?

Como um método alternativo, você considerou o uso de um eco com uma string que usa as variáveis de interesse em seu comando ssmtp?

echo this confirms that backup has been completed and renewed for $HOSTNAME on $DATE | ssmtp [email protected]
    
por 10.03.2016 / 23:57