我通过 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 由终端仿真器提供。程序可以分两部分将自己与终端“分离”(这取决于被测试程序实际检查的内容)
关闭 stdin/stdout/stderr(通常指向终端);例如,您可以从 /dev/null 重定向输入,并将输出发送到文件或通过管道发送:
true | myapp 2>&1 | cat
myapp </dev/null |& cat
调用 setsid() 来断开与控制终端(否则,它仍可通过 /dev/tty 进行访问,并使程序受制于 shell 的作业控制)。从 shell 中,您可以使用同名工具:
setsid myapp
因此,结合这两者,我认为您可以像这样运行测试脚本:
true | (setsid ./testscript.sh) 2>&1 | cat
(setsid ./testscript.sh) </dev/null |& cat
(是的,括号是故意的——它们可以防止setsid
工具分叉并意外地“进入后台”。)