Как настроить мой enviorment таким способом, которым надлежащим (отличающийся от системы одна) используется версия библиотеки

К сертификату сервера печати как текст с помощью openssl:

#!/bin/bash
#
# Show server's certificate in a human-readable form.
#
# Usage: $ show-cert HOST [PORT]
#
exec <&- # close stdin to suppress `read:errno=0` from openssl
exec openssl x509 -noout -text \
     -in <(openssl s_client -connect "$1":"${2:-443}" -showcerts)

Или использование Python, который будет произведен в json формате:

#!/usr/bin/env python3
"""Show server's certificate as json.

Usage:
  $ %(prog)s HOST [PORT]
"""
import json
import socket
import ssl
import sys

def getcert(addr, timeout=None):
    """Retrieve server's certificate at the specified address (host, port)."""
    # it is similar to ssl.get_server_certificate() but it returns a dict
    # and it verifies ssl unconditionally, assuming create_default_context does
    with socket.create_connection(addr, timeout=timeout) as sock:
        context = ssl.create_default_context()
        with context.wrap_socket(sock, server_hostname=addr[0]) as sslsock:
            return sslsock.getpeercert()

def main(argv):
    host = argv[1]
    port = int(argv[2]) if len(argv) > 2 else 443
    print(json.dumps(getcert((host, port)), indent=2, sort_keys=True))

if __name__ == "__main__":
    main(sys.argv)

Пример:

$ getcert encrypted.google.com | jq -r '.notAfter, .subjectAltName[][1]'
Mar 20 00:00:00 2014 GMT
*.google.com
*.android.com
*.appengine.google.com
*.cloud.google.com
...

Последняя версия: getcert.py

3
23.05.2017, 15:40
1 ответ

Я не думаю, что есть какой-либо способ сделать это надежно только с помощью переменных окружения. Проблема с использованием LIBRARY_PATH , похоже, заключается в том, что любой заданный параметр -L имеет приоритет. Если по какой-либо причине команда gcc содержит -L / usr / lib64 , сначала будет произведен поиск, и будет найдена более старая версия библиотеки. Похоже, вы собираетесь изменить файлы Makefile, вы также должны быть осторожны, чтобы сначала не появился -L / usr / lib64 .

Однако, глядя на ваш вопрос SO, не похоже, что указанное выше является проблемой. Однако в значении вашей переменной LIBRARY_PATH есть ненужное завершающее слово : , которое может объяснить, почему это не сработало.

Кроме того, как отмечено в ответе на вопрос SO, LD_LIBRARY_PATH используется динамическим компоновщиком и актуален только во время выполнения вашего приложения. Это можно использовать, если расположение динамических библиотек не может быть найдено при запуске приложения. Компоновщик GNU использует LD_RUN_PATH , который по существу выполняет для -rpath то же, что LIBRARY_PATH делает для -rpath , за исключением того, что указывает любой -rpath означает, что LIBRARY_PATH будет проигнорирован (а не просто получит более низкий приоритет).

Тогда вы можете попробовать:

LIBRARY_PATH=/opt/lib_name/X/lib LD_RUN_PATH=/opt/lib_name/X/lib make

Что-то, что может быть более надежным, - это создать сценарий оболочки для gcc , который включает необходимые параметры, например:

#!/bin/sh
gcc -L/opt/lib_name/X/lib -Wl,-rpath,/opt/lib_name/X/lib "$@"

Назовите файл gcc , сделайте его исполняемым и поместите в отдельный каталог (или хотя бы в тот, где нет файлов с такими же именами, как у жизненно важных команд). Затем вы можете запустить make , например:

PATH=/path/to/script:$PATH make
2
27.01.2020, 21:28

Теги

Похожие вопросы