【问题标题】:Problem with bin/sh -i in a forked process, error: 'can't access tty, job control turned off'分叉进程中的 bin/sh -i 问题,错误:“无法访问 tty,作业控制已关闭”
【发布时间】:2009-12-21 00:16:31
【问题描述】:

我正在为我的 Sheevaplug(运行默认的 Ubuntu 安装)编写一个 cgi-bin 程序,它在浏览器页面中显示一个 shell。它是一个单独的 C 程序,放置在 cgi-bin 文件夹中并在浏览器中查看。它会自动启动一个守护进程,并且该守护进程会派生一个 shell 实例。 cgi-bin 通过共享内存块与守护进程通信,守护进程通过将其 stdin/stdout 重定向到 shell 的 stdout/stdin 来与 shell 通信。当您离开页面时,它会自动关闭守护进程。

如果我使用“/bin/sh”启动它并且我一次从浏览器向它发送整个命令行,它就可以工作。但是使用这种设计,它不是交互式的。

所以我将其更改为一次发送一个字符到“/bin/sh”并添加“-i”以便 shell 以交互模式运行。

shell 启动时显示错误“无法访问 TTY,作业控制已关闭。”

当它准备好输入并且似乎可以工作时,它会显示“$”,但是向它发送删除字符只会混淆它并且它不能正确处理删除。我不确定它是否处于交互模式。当我输入“su root”时,我收到错误“必须从终端运行”。

任何想法我做错了什么?

PS:当我完成后,它将在 GPL 下发布。

【问题讨论】:

    标签: c linux shell fork


    【解决方案1】:

    对于交互模式,sh 希望与终端或模拟终端(pseudo-terminal)的东西交谈,而不仅仅是直接 IO 管道。考虑使用 forkpty 来启动您启动 shell 的进程,并与它提供的流对话。

    【讨论】:

    • 谢谢,我将 fork 更改为 forkpty,现在初始错误消息不再出现,但我仍然得到“必须从终端运行”,我尝试“su root”,任何更多想法?
    • 也许你可以让你的 CGI 成为一个 setuid 程序?
    • 如果我在 root 下手动启动我的守护进程,它工作正常,但如果守护进程由 cgi-bin 自动启动,则它不起作用。所以我还有一些东西要弄清楚。谢谢!
    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多