za pomocą sed w skrypcie BASH: zamień tekst na informacje ze zmiennych systemowych (nazwa hosta i data)

0

Chcę użyć skryptu bash do uruchomienia kopii zapasowej, a następnie wysłać mi wiadomość e-mail za pomocą ssmtp. Próbuję stworzyć ogólny skrypt, którego można by użyć ponownie na różnych komputerach z systemem Linux. Poniżej znajduje się fragment skryptu, w którym używam sed do zamiany tekstu zastępczego na zmienne $HOSTNAMEi $DATE. Z jakiegoś powodu po uruchomieniu otrzymuję wiadomość e-mail, ale zamiast wstawić nazwę hosta i datę, czyści symbole zastępcze. Czy ktoś może wskazać, co robię źle?

Oto sekcja mojego skryptu:

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

ssmtp me@domain.org < backup_notification

Oto plik tekstowy powiadomienia ( HNAMEi DATETIMEsą to symbole zastępcze, które chcę, aby sed zastąpił informacjami o zmiennych systemowych):

To: me@domain.org
From: administrator@webserver.domain.org
Subject: Backup completed

This confirms that backup is completed for HNAME on DATETIME.

A oto, co zawiera tekst e-maila (zwróć uwagę, że symbole zastępcze HNAME i DATETIME zostały usunięte lub zastąpione przez zero):

-----Original Message-----
From: root [mailto:root@domain.org] 
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 za wszelką pomoc :)!

Chris
źródło

Odpowiedzi:

1

$ HOSTNAME i $ DATE domyślnie nie są zdefiniowane jako zmienne. Zamiast tego użyj $ (polecenie), aby wstawić wyjście (stdout) z commandciągu.

Na przykład w twoim przypadku zamień $ HOSTNAME na, którego chcesz użyć $(hostname)i $(date):

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

Również -iflaga na sed będzie edytować szablon backup_notification, jak wskazał @ user568271. Jeśli tego nie chcesz, możesz przeczytać i edytować za pomocą potoku:

cat backup_notification | sed -e "s/HNAME/$(hostname)/g" | sed -e "s/DATETIME/$(date)/g" | ssmtp me@domain.org
ecube
źródło
0

Czy przełącznik -i nie „edytuje w miejscu” pliku szablonu wiadomości?

Czy nie potrzebujesz niezmienionej wersji szablonu w powiadomieniu o kopii zapasowej na początku procesu tworzenia kopii zapasowej?

Jako alternatywną metodę, czy zastanawiałeś się nad użyciem echa z ciągiem znaków, który wykorzystuje zmienne będące przedmiotem zainteresowania przekazane do polecenia ssmtp?

echo this confirms that backup has been completed and renewed for $HOSTNAME on $DATE | ssmtp me@domain.org
naprawiony
źródło
Dzięki, to dobra uwaga. Wypróbowałem twoją sugestię i działa ona z $ HOSTNAME, ale z jakiegoś powodu $ DATE nic nie robi. Tak więc wiadomość e-mail mówi „To potwierdza, że ​​tworzenie kopii zapasowej zostało zakończone na server.domain.org w dniu”.
Chris
@ecube prawdopodobnie miał rację, mówiąc o konieczności użycia $ (nazwa hosta) i $ (data). Myślałem, że twój .bashrc został skonfigurowany do ustawiania zmiennych. Powinieneś głosować na niego za szybką odpowiedź
naprawiono
Powinieneś nawet oznaczyć go jako poprawną odpowiedź, ponieważ użył sed tak, jak zadałeś twoje pytanie, a także był szybki
opatrzony datą
Dziękuję wam obojgu! Odpowiedź z @ecube została oznaczona jako poprawna, ponieważ zadziałała i była najlepszym rozwiązaniem.
Chris