Как я могу проверить, вошел ли пользователь в графический сеанс И что тот же пользователь выполняет скрипт

Принимая это как вызов «бежать из песочницы». Вы хотите

открыть файл без импорта каких-либо модулей (я собираюсь предположить, что это также исключает использование __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'>
1
задан 21 April 2017 в 02:00

2 ответа

Чтобы проверить, кто входит в систему, вы можете использовать who. Чтобы проверить, какой пользователь запускал скрипт: 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
1
ответ дан 18 July 2018 в 14:34
Чтобы проверить, кто входит в систему, вы можете использовать who. Чтобы проверить, какой пользователь запускал скрипт: 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
1
ответ дан 24 July 2018 в 20:25
  • 1
    Простите, если я не понял, но whoami недостаточно. Мне нужно знать, что пользователь зашел на сервер X (т. Е. Запустить gnome / unity / something else), и мне нужно проверить, что этот пользователь выполняет скрипт как сам. – tjespe 21 April 2017 в 23:02
  • 2
    Что относительно who – M. Becerra 22 April 2017 в 01:31

Другие вопросы по тегам:

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