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