У меня есть этот базовый c python скрипт test.py
, использующий библиотеку invoke:
#!/usr/bin/python3
from invoke import run
run('whoami')
И когда я пытаюсь запустить его, используя runuser
как root
, он не работает.
Команда выполнена:
runuser -l david -c '/home/david/test.py'
Stacktrace:
Traceback (most recent call last):
File "/home/david/test.py", line 5, in <module>
run('whoami')
File "/home/david/.local/lib/python3.6/site-packages/invoke/__init__.py", line 48, in run
return Context().run(command, **kwargs)
File "/home/david/.local/lib/python3.6/site-packages/invoke/context.py", line 94, in run
return self._run(runner, command, **kwargs)
File "/home/david/.local/lib/python3.6/site-packages/invoke/context.py", line 101, in _run
return runner.run(command, **kwargs)
File "/home/david/.local/lib/python3.6/site-packages/invoke/runners.py", line 363, in run
return self._run_body(command, **kwargs)
File "/home/david/.local/lib/python3.6/site-packages/invoke/runners.py", line 422, in _run_body
return self.make_promise() if self._asynchronous else self._finish()
File "/home/david/.local/lib/python3.6/site-packages/invoke/runners.py", line 474, in _finish
raise ThreadException(thread_exceptions)
invoke.exceptions.ThreadException:
Saw 1 exceptions within threads (OSError):
Thread args: {'kwargs': {'echo': None,
'input_': <_io.TextIOWrapper name='<stdin>' mode='r' encoding='ANSI_X3.4-1968'>,
'output': <_io.TextIOWrapper name='<stdout>' mode='w' encoding='ANSI_X3.4-1968'>},
'target': <bound method Runner.handle_stdin of <invoke.runners.Local object at 0x7f7a767b5e10>>}
Traceback (most recent call last):
File "/home/david/.local/lib/python3.6/site-packages/invoke/util.py", line 233, in run
super(ExceptionHandlingThread, self).run()
File "/usr/lib/python3.6/threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "/home/david/.local/lib/python3.6/site-packages/invoke/runners.py", line 813, in handle_stdin
with character_buffered(input_):
File "/usr/lib/python3.6/contextlib.py", line 81, in __enter__
return next(self.gen)
File "/home/david/.local/lib/python3.6/site-packages/invoke/terminals.py", line 176, in character_buffered
or not stdin_is_foregrounded_tty(stream)
File "/home/david/.local/lib/python3.6/site-packages/invoke/terminals.py", line 139, in stdin_is_foregrounded_tty
return os.getpgrp() == os.tcgetpgrp(stream.fileno())
OSError: [Errno 25] Inappropriate ioctl for device
Я знаю, что это можно сделать с помощью sudo -u david
, но так как это всего лишь упрощенный пример, мне нужно использовать его с runuser.
Есть идеи?