当前位置: 首页 > 面试题库 >

使用popen和专用的TTY Python运行交互式Bash

傅翰池
2023-03-14
问题内容

我需要使用自己的专用TTY在Python的单独进程中运行交互式Bash实例(我不能使用pexpect)。我使用了类似程序中常见的代码片段:

master, slave = pty.openpty()

p = subprocess.Popen(["/bin/bash", "-i"], stdin=slave, stdout=slave, stderr=slave)

os.close(slave)

x = os.read(master, 1026)

print x

subprocess.Popen.kill(p)
os.close(master)

但是当我运行它时,我得到以下输出:

$ ./pty_try.py
bash: cannot set terminal process group (10790): Inappropriate ioctl for device
bash: no job control in this shell

运行的轨迹显示一些错误:

...
readlink("/usr/bin/python2.7", 0x7ffc8db02510, 4096) = -1 EINVAL (Invalid argument)
...
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7ffc8db03590) = -1 ENOTTY (Inappropriate ioctl for device)
...
readlink("./pty_try.py", 0x7ffc8db00610, 4096) = -1 EINVAL (Invalid argument)

该代码段看起来非常简单,Bash是否没有得到所需的东西?这可能是什么问题?


问题答案:

这是最后对我有用的解决方案(由qarma建议):

libc = ctypes.CDLL('libc.so.6')

master, slave = pty.openpty()
p = subprocess.Popen(["/bin/bash", "-i"], preexec_fn=libc.setsid, stdin=slave, stdout=slave, stderr=slave)
os.close(slave)

... do stuff here ...

x = os.read(master, 1026)
print x


 类似资料:
  • 问题内容: 只是想知道,是否有可能单独使用PHP创建一个交互式shell。我的意思是您在数据库,python等方面拥有类似的东西。 如果是,怎么办? 问题答案: 是的,有可能。为了进行交互,该程序必须能够等待并从 stdin中 读取用户输入。在PHP中,您可以通过向打开文件描述符来从 stdin中 读取。从一个不同的问题的答案中获得,这是PHP中的交互式用户提示的示例(当然是从命令行运行时): 当

  • 问题内容: 我通常使用java.lang.ProcessBuilder和java.lang.Process来运行外部命令行程序,并且对运行和完成命令运行良好。例如,这将在工作目录中运行带有参数“ myArg”的“ myProgram”: 但是,假设我想运行脚本或程序或具有交互式输入的内容(启动后提示我提供更多输入)。我可以使用与上面类似的代码在Java中执行此操作,还是需要其他方法?还是有一些图书

  • 有没有办法只使用Docker Compose在容器中启动一个交互式shell?我在我的docker-compose.yml: 当我使用docker-compose up启动这个容器时,它会立即退出。是否有任何标志可以添加到命令中,或者作为的附加选项来启动交互式shell? 我知道有本机docker命令选项来实现这一点,只是好奇是否也可以只使用docker Compose。

  • 问题内容: 我正在尝试通过paramiko运行交互式命令。该cmd执行尝试提示输入密码,但是我不知道如何通过paramiko的exec_command提供密码,并且执行挂起。如果cmd执行期望交互输入,是否可以将值发送到终端? 有谁知道如何解决?谢谢。 问题答案: 完整的paramiko发行版附带了很多很好的演示。 在demos子目录中,并有完整的交互式TTY示例,这可能对您的情况有些过分。 在您

  • 本文向大家介绍Python 运行.py文件和交互式运行代码的区别详解,包括了Python 运行.py文件和交互式运行代码的区别详解的使用技巧和注意事项,需要的朋友参考一下 代码版本:3.6.3 1. 交互式运行代码会直接给出表达式的结果,运行代码文件必须print才能在控制台看到结果。 直接给出结果:   没有print是看不到结果的: 有print才能看到结果: 另:交互式中可以用下划线 `_`

  • 十五、 运行时的交互 Nmap 目前还不具有这个功能,本节内容可能会增加或删除。 在执行 Nmap 时,所有的键盘敲击都被记录。这使得用户可以与 程序交互而不需要终止或重启 特定的键可改变选项,其它键会输出 一个有关扫描的状态消息。约定如下,小写字母增加 打 印量,大写字母减少打印量。 v / V 增加 / 减少细节 d / D 提高 / 降低调试级别 p / P 打开/ 养老报文跟踪 其它 打印