Публичный IP-адрес Cron для файла журнала

Публичный IP-адрес Cron для файла журнала

Я хочу записать свой публичный IP в файл с помощью cron. Что-то вроде этого:

2021-05-17T01:11:46 99.99.99.99
2021-05-17T01:12:46 99.99.99.99
2021-05-17T01:13:46 99.99.99.99

Вот что у меня получилось:

* * * * * { date +%FT%T | tr "\n" " "; curl https://ipinfo.io/ip -s ; echo "" ; } >> /home/mario/logs/pubip.log

Это работает* в командной строке sh, но как только я ставлю звездочки в начале и вставляю в crontab -e, получаю следующую ошибку:

/bin/sh: 1: Syntax error: end of file unexpected (expecting "}")

ОС: Ubuntu 20.04.2 LTS

*Должен быть более элегантный способ обработки форматирования. То, что я frankensteind, кажется довольно неловким.

решение1

Так что это оказались символы '%'. Надо было больше читать документацию: crontab(5)

The "sixth" field (the rest of the line) specifies the command to
       be run.  The entire command portion of the line, up to a newline
       or a "%" character, will be executed by /bin/sh or by the shell
       specified in the SHELL variable of the cronfile.  A "%" character
       in the command, unless escaped with a backslash (\), will be
       changed into newline characters, and all data after the first %
       will be sent to the command as standard input.

Правильная строка cron, которая в итоге сработала, это

* * * * * { date +\%FT\%T | tr "\n" " "; curl https://ipinfo.io/ip -s ; echo "" ; } >> /home/mario/logs/pubip.log

Тем не менее, я перенесу это в сценарий просто для удобства чтения, как и предложил @scimerman.

решение2

Я не смог воспроизвести ваш. Если команда для cron слишком громоздкая, более элегантный способ — обернуть ее в отдельный скрипт cron и вызывать его из crontab:

$ cat ~/crontab.ip 
#!/bin/bash
{ date +%FT%T | tr "\n" " "; curl https://ipinfo.io/ip -s ; echo "" ; } >> ~/log.ip

и мой кронтаб такой:

$ crontab -l
* * * * * ~/crontab.ip

Он должен работать.

решение3

При размещении команд в системе cron необходимо использовать полный путь к команде.

Т.е.,
датадолжно быть/bin/дата
трдолжно быть/usr/bin/tr
завитокдолжно быть/usr/bin/curl.
эходолжно быть/usr/bin/echo

Связанный контент