Трюк для использования LD_LIBRARY_PATH
с python в строке#!
(shebang ), который не зависит ни от чего, кроме оболочки, и работает на славу:
#!/bin/sh
'''' 2>/dev/null; exec /usr/bin/env LD_LIBRARY_PATH=. python -x "$0" "$@" #'''
__doc__ = 'A great module docstring'
Как объяснялось в другом месте на этой странице, некоторые оболочки, такие как sh
, могут принимать скрипт на свой стандартный ввод.
Сценарий, который мы даем sh
, пытается выполнить команду ''''
, которая упрощается до''
(пустой строки )с помощью sh
и, конечно же, не может выполнить ее, так как нет ''
Команда, поэтому она обычно выводит line 2: command not found
в стандартном дескрипторе ошибки, но мы перенаправляем это сообщение с помощью 2>/dev/null
в ближайшую черную дыру, потому что это было бы беспорядочно и запутанно для пользователя, если бы sh
отображало его.
Затем мы переходим к интересующей нас команде :exec
, которая заменяет текущий процесс оболочки следующим, в нашем случае:/usr/bin/env python
с соответствующими параметрами:
"$0"
, чтобы сообщить Python, какой скрипт он должен открыть и интерпретировать, а также установитьsys.argv[0]
"$@"
, чтобы установить sys.argv[1:]
Python для аргументов, переданных в командной строке скрипта. И мы также просим env
установить переменную окружения LD_LIBRARY_PATH
, которая является единственной целью взлома.
Команда оболочки заканчивается комментарием, начинающимся с #
, поэтому оболочка игнорирует завершающие тройные кавычки '''
.
sh
заменяется новым блестящим экземпляром интерпретатора Python, который открывает и читает исходный скрипт Python, заданный в качестве первого аргумента (на"$0"
).
Python открывает файл и пропускает первую строку исходного кода благодаря аргументу -x
. Примечание :это также работает без -x
, потому что для Python шебанг — это просто комментарий .
Затем Python интерпретирует вторую строку как строку документации для текущего файла модуля, поэтому, если вам нужна корректная строка документации модуля, просто установите __doc__
в первую очередь в вашей программе Python, как в примере выше.
Я обновился до QEMU версии 2.7.50, и теперь Windows 10 (Anniversary edition) регистрирует указанные мной сокеты, ядра и потоки.