Разница между вызовом openssl s_client в cron и терминале

Я бы хотел отслеживать баннеры Microsoft Exchange.

Когда в консоли запускаю команду:

timeout 1 openssl s_client -connect 192.168.0.5:995 > /tmp/1.txt 

Вывод:

 tail -n 4 /tmp/1.txt: Timeout : 300 (sec) Verify return code: 0 (ok) --- +OK The Microsoft Exchange POP3 service is ready. 

Когда я добавляю эту команду в cron, я получаю этот вывод

 tail -n 4 /tmp/1.txt Start Time: 1488382801 Timeout : 300 (sec) Verify return code: 0 (ok) --- 

Какая разница между cron и консолью? Спасибо.

  • Репозитории в стиле Debian и RedHat скомпрометированы ошибкой Heartbleed OpenSSL?
  • Попытка установить spotify с помощью libssl1.0.0
  • Добавление пэра в другой
  • Почему openssl s_client проверяет сертификат на несоответствующий файл CA?
  • Linux openssl CN / проверка имени хоста против SSL-сертификата
  • "Openssl dgst -sha1", создающий посторонний "(stdin) =" префикс и завершающий символ новой строки
  • OpenSSL s_client не обнаруживает STARTTLS
  • Объяснение времени сборки версии в отличие от номера версии, например OpenSSL 1.0.1e против h
  • 2 Solutions collect form web for “Разница между вызовом openssl s_client в cron и терминале”

    Скорее всего, при запуске в режиме cron соединение было закрыто до того, как удаленный сервер смог опубликовать свой баннер. Это связано с тем, что openssl s_client управляет двунаправленным соединением между его stdio и сокетом на удаленном сервере:

    • Он копирует stdin в сокет
    • Он копирует данные, полученные в сокете, в стандартный вывод

    При работе в cron первая копия немедленно завершается, потому что stdin подключен к /dev/null . Это заставило openssl уйти.

    Вы могли бы смягчить это, перенаправляя ввод openssl на то, что блокирует навсегда или, еще лучше, что-то вроде sleep 1 которое избавит вас от необходимости timeout .

    Тем не менее, ожидание одной секунды является особенно хрупким способом подключения и ожидания баннера. Мало того, что это довольно короткий тайм-аут, но он даже не приводит к тому, что команда выходит за пределы истечения времени ожидания при получении баннера. Для чего-то вроде этого вы ищите.


    Кстати:

    Другие, вероятно, не согласятся, но я считаю, что использование термина «консоль» в этом вопросе неточно. Фактически, вы получите поведение, которое вы впервые описали в любой терминальной сессии, которая может быть, среди прочего:

    • сеанс терминала ssh,
    • терминальный эмулятор (например, xterm или современные замены) в вашем графическом интерфейсе
    • screen окно,
    • последовательное модемное соединение,
    • или фактической системной консоли.

    Я считаю, что термин «консоль» должен относиться исключительно к последнему, но все это терминальные сеансы.

    Cron использует минимальный набор переменных среды для ваших заданий. И может использовать другие функции, чем вы используете в консоли.

    Вы можете использовать команду which <programname> чтобы увидеть местоположение таймаута и openssl, когда вы используете их в консоли, а также в cron.

    Вы также можете установить переменную PATH в начале вашего скрипта.

    Linux и Unix - лучшая ОС в мире.