Назад | Перейти на главную страницу

crontab для запуска сценария bash (в нем команда ssh) не работает

CentOS 5.4

(в моем файле скрипта - script.sh)

#!/bin/bash
ssh 192.168.0.1 'iptables -L' > /tmp;

(в / etc / crontab)

30 21 30 9 * root /bin/bash /script.sh

Если я запускаю скрипт в терминале, все работает нормально. Но используйте crontab для его запуска, tmp будет сгенерирован, но в файле tmp ничего нет (0k). Я уже запустил агент ssh, поэтому ssh не запрашивает пароль. В чем может быть проблема? Спасибо.

Я предлагаю вам всегда явно указывать все необходимые переменные в начале скриптов.

PATH=/bin:/usr/bin:/sbin
MYVAR=whatever

Тем не менее, я бы

  1. создать пару закрытых / открытых ключей
  2. установить пустой пароль на закрытый ключ
  3. установить разрешение 400 на файл закрытого ключа
  4. поместите открытый ключ в файл authorized_keys пользователя root на 192.168.0.1

Теперь попробуйте соединение с

#!/bin/bash
PATH=/usr/bin

ssh -i /myprivatekey -l root 192.168.0.1 '/sbin/iptables -L' > /tmp/output.$$

Изменить: я догадывался, что команда «iptables» должна выполняться пользователем root на удаленном сервере. Если это не так, конечно, параметр «-l» должен быть соответственно изменен.

То, что не запускается из cron, но запускается из терминала, почти всегда является проблемой из-за разницы в среде. Вы должны использовать полный путь к своим исполняемым файлам и явно устанавливать любые переменные среды и PATH что им нужно.

#!/bin/bash
/usr/bin/ssh 192.168.0.1 '/sbin/iptables -L' > /tmp/output.$$

Кстати, у вас действительно нет вашего скрипта в корневом каталоге, не так ли?

Также, /tmp это каталог, который уже должен существовать. Вы должны создать свой вывод как файл внутри него, как я показал.

Я не думаю, что ssh-agent поможет в этом случае, потому что cronjob не является подпроцессом того, в среде которого есть параметры связи ssh-agent. Чтобы это работало, вам необходимо настроить вход без пароля.

Один из способов получить больше информации - изменить ваш ssh-вызов на

ssh -vvv 192.168.0.1 'iptables -L' 2>&1 > /tmp/output.$$

так что 1) ssh будет производить подробный вывод отладки на stderr и 2) stderr будет перенаправлен вместе с stdout. В этом выходном файле. $$ должно быть больше информации о том, что происходит ... Я ставлю, как я уже сказал, на отсутствие химической завивки для открытия вашего ключа.