python - os.openpty() 在 os.seteuid() 从 root 到用户之后不允许操作

标签 python linux pty

如果我们从 root 设置 euid(123) 到用户 123,它将失败。但是以用户 123 直接运行 os.openpty() 会成功。有什么提示吗?

在 python 2.7 或 3.6 中相同。在 Redhat 7 上:

>>> os.openpty()
(3, 4)
>>> os.seteuid(12345)
>>> os.openpty()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
PermissionError: [Errno 1] Operation not permitted

最佳答案

strace 输出(最好使用 C 版本):

setresuid(-1, 123, -1)                  = 0
open("/dev/ptmx", O_RDWR)               = 3
statfs("/dev/pts", {f_type=DEVPTS_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={val=[0, 0]}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NOEXEC|ST_RELATIME}) = 0
ioctl(3, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(3, TIOCGPTN, [6])                 = 0
stat("/dev/pts/6", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0
getuid()                                = 0
chown("/dev/pts/6", 0, 5)               = -1 EPERM (Operation not permitted)
close(3)                                = 0

因为 geteuid() 不再是 root,所以不可能将 TTY 更改为由 getuid() 拥有。

您的选择是:

  • 更改 UID,而不仅仅是 EUID
  • openpty 调用之前立即重置 EUID,自己chown,然后再次更改 EUID
  • 自己实现 openpty ...在 Linux 上它非常简单(您不需要糟糕的 BSD 回退)...您需要多便携?

关于python - os.openpty() 在 os.seteuid() 从 root 到用户之后不允许操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51073144/

相关文章:

python - 有没有一种更有效的方法可以在 Python 中按大小组织随机结果?

python - 在启动 raspbian 时运行 bash 或 python 脚本

python - pty多路复用器

c - 编译时找不到融合函数

java - 为什么下面的代码不起作用?

c++ - 文件描述符的 Read() 挂起

c - PTY以更小的尺寸运行

python - 具有相同行数的两个 CSV 文件按列串联

java - 从 Jython 控制标准输出/标准错误

python - 在 Flask 应用程序中获取 Celery Group 结果