Принимая это как вызов «бежать из песочницы». Вы хотите
открыть файл без импорта каких-либо модулей (я собираюсь предположить, что это также исключает использование __import__). и без использования встроенной функции open. Я собираюсь предположить, что использование встроенной функции (Python 2-only) file также является обманом.Ну, разве это не интересно? (Python 3)
>>> [c for c in object.__subclasses__() if c.__module__ == '_io']
[<class '_io._BytesIOBuffer'>, <class '_io._IOBase'>,
<class '_io.IncrementalNewlineDecoder'>]
Давайте будем ходить по иерархии типов _io._IOBase:
>>> _iobase = _[1]
>>> _iobase.__subclasses__()
[<class '_io._RawIOBase'>, <class '_io._BufferedIOBase'>,
<class 'io.IOBase'>, <class '_io._TextIOBase'>]
>>> [x.__subclasses__() for x in iobase.__subclasses__()]
[[<class '_io.FileIO'>, <class 'io.RawIOBase'>],
[<class '_io.BytesIO'>, <class '_io.BufferedReader'>,
<class '_io.BufferedRandom'>, <class 'io.BufferedIOBase'>,
<class '_io.BufferedRWPair'>, <class '_io.BufferedWriter'>],
[<class 'io.RawIOBase'>, <class 'io.BufferedIOBase'> <class 'io.TextIOBase'>],
[<class '_io.StringIO'>, <class '_io.TextIOWrapper'>, <class 'io.TextIOBase'>]]
Bingo. _io.FileIO - это класс, который мы хотим: он имеет открытый конструктор с функциональностью подмножество open() (он может открывать только двоичные файлы, это достаточно хорошо для этого упражнения). Итак, вот полный побег:
def get_subclass(cls, name):
for c in cls.__subclasses__():
if c.__name__ == name: return c
return None
_iobase = get_subclass(object, '_IOBase')
_rawiobase = get_subclass(_iobase, '_RawIOBase')
fileio = get_subclass(_rawiobase, 'FileIO')
with fileio("/tmp/i_escaped", "w") as fp:
fp.write(b"booyah\n")
Если вам не разрешено использовать встроенный глобальный object (например, если __builtins__ был кастрирован), вы все равно можете попасть в класс [ f13]:
>>> {}.__class__.__base__
<class 'object'>
ps aux | grep $0 | awk '{ print $1 }' | uniq
ps aux: список всех запущенных процессов, включая соответствующего пользователя, в первом столбце. grep $0: Ищет текущий скрипт awk '{ print $1 }': печатает только то, что находится в первом столбце uniq: удаляет возможные дубликаты. Чтобы проверить, является ли пользователь, который запускал сценарий, таким же, как и пользователь, входивший в систему: LOGED_USER=$(who | awk '{ print $1 }')
EXEC_USER=$(ps aux | grep $0 | awk '{ print $1 }' | uniq)
if [ $LOGED_USER == $EXEC_USER ]; then
echo "Same USER"
else
echo "Different USER"
fi
ps aux | grep $0 | awk '{ print $1 }' | uniq
ps aux: список всех запущенных процессов, включая соответствующего пользователя, в первом столбце. grep $0: Ищет текущий скрипт awk '{ print $1 }': печатает только то, что находится в первом столбце uniq: удаляет возможные дубликаты. Чтобы проверить, является ли пользователь, который запускал сценарий, таким же, как и пользователь, входивший в систему: LOGED_USER=$(who | awk '{ print $1 }')
EXEC_USER=$(ps aux | grep $0 | awk '{ print $1 }' | uniq)
if [ $LOGED_USER == $EXEC_USER ]; then
echo "Same USER"
else
echo "Different USER"
fi