如何模拟没有tty的shell?

如何模拟没有tty的shell?

我通过 SSH 维护的系统遇到了问题。当我测试需要 TTY 的命令时,它们可以正常工作,可能是因为 SSH 会话。在某些不明确的情况下,没有可用的 TTY,并且sudo由于以下原因,命令失败:

(sudo: sorry, you must have a tty to run sudo)

他们在 SSH shell 中成功了,这使得问题在发生之前很难追踪。由于这是一个反复出现的问题,我正在寻找一种方法来测试在不提供 TTY 的 shell 中对脚本的更改。

我正在使用带有 bash 和 ksh 的 Ubuntu 19.04、CentOS 6 和 Debian 9。

答案1

tty 不是由 shell 提供的(关系正好相反)。tty 由终端仿真器提供。程序可以分两部分将自己与终端“分离”(这取决于被测试程序实际检查的内容)

  1. 关闭 stdin/stdout/stderr(通常指向终端);例如,您可以从 /dev/null 重定向输入,并将输出发送到文件或通过管道发送:

    true | myapp 2>&1 | cat
    
    myapp </dev/null |& cat
    
  2. 调用 setsid() 来断开与控制终端(否则,它仍可通过 /dev/tty 进行访问,并使程序受制于 shell 的作业控制)。从 shell 中,您可以使用同名工具:

    setsid myapp
    

因此,结合这两者,我认为您可以像这样运行测试脚本:

true | (setsid ./testscript.sh) 2>&1 | cat
(setsid ./testscript.sh) </dev/null |& cat

(是的,括号是故意的——它们可以防止setsid工具分叉并意外地“进入后台”。)

相关内容