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

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 в начале вашего скрипта.

  • Попытка установить spotify с помощью libssl1.0.0
  • Как сгенерировать только ключ с помощью openssl
  • Как запустить зашифрованный захват веб-камеры при входе в систему?
  • Влияние Openssl.Cnf на службы sshd amazon linux
  • Как добавить SubjectAltNames в сертификат конечного объекта в частной PKI?
  • Как проверить, что служба прослушивает как ipv4, так и ipv6?
  • Как подключить вывод ffmpeg?
  • Репозитории в стиле Debian и RedHat скомпрометированы ошибкой Heartbleed OpenSSL?
  • Создание отпечатков HPKP для всей цепочки сертификатов
  • OpenSSL s_client не обнаруживает STARTTLS
  • Проблема SSL. Где я должен вставить сертификат.crt?
  • Как я могу расшифровать двоичную строку shaX, закодированную в base64?
  • Linux и Unix - лучшая ОС в мире.