Kar*_*ter 10 linux ssh sudo shell tty
我通过 SSH 维护的系统遇到了问题。当我测试需要 TTY 的命令时,它们可以工作,可能是因为 SSH 会话。在某些不清楚的情况下,没有可用的 TTY 和诸如sudo失败的命令
(sudo: sorry, you must have a tty to run sudo)
Run Code Online (Sandbox Code Playgroud)
他们在 SSH shell 中取得了成功,这使得在问题发生之前很难跟踪。由于这是一个反复出现的问题,我正在寻找一种方法来在不提供 TTY 的 shell 中测试对脚本的更改。
我正在使用带有 bash 和 ksh 的 Ubuntu 19.04、CentOS 6 和 Debian 9。
use*_*686 12
tty 不是由 shell 提供的(关系相反)。tty 由终端模拟器提供。程序可以分两部分从终端“分离”自己(这取决于被测程序实际检查的内容)
关闭 stdin/stdout/stderr(通常指向终端);例如,您可以重定向来自 /dev/null 的输入,并将输出发送到文件或通过管道:
true | myapp 2>&1 | cat
myapp </dev/null |& cat
Run Code Online (Sandbox Code Playgroud)调用 setid() 以从控制终端分离(否则仍可通过 /dev/tty 访问并使程序受外壳程序的作业控制)。在 shell 中,您可以使用同名工具:
setsid myapp
Run Code Online (Sandbox Code Playgroud)因此,将这两者结合起来,我认为您可以像这样运行您的测试脚本:
true | (setsid ./testscript.sh) 2>&1 | cat
(setsid ./testscript.sh) </dev/null |& cat
Run Code Online (Sandbox Code Playgroud)
(是的,括号是故意的——它们防止setsid工具不得不分叉并意外地“进入后台”。)