Разница между вызовом 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 и консолью? Спасибо.

  • Внедрение TLS 1.2, когда я SSH в коробку в качестве меры против POODLE
  • Каковы недостатки использования policy_any в openssl.cnf?
  • Обновления наборов шифров OpenSSL
  • Как создать файл p12 с закрытым ключом RSA и самозаверяющим сертификатом
  • Как запустить зашифрованный захват веб-камеры при входе в систему?
  • Почему я получаю 400 Bad Request?
  • Как я могу расшифровать двоичную строку shaX, закодированную в base64?
  • SSL сертификат отсутствует
  • 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 в начале вашего скрипта.

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