一些程序在一个大脚本中启动正在执行stty -echo
。我不确定它是哪个程序,所以我必须通过反复试验来找到它。足以</dev/null 2>&1 | tee /dev/null
阻止程序访问终端,或者是否有其他方法可以访问终端?
实际上我无法确定哪个程序访问终端(尝试strace
整个脚本生成一个没有 17MB 的文件tcsetattr
,所以我假设终端修改只是控制字符的写入)。这个问题也是不确定的;它有时会干扰终端,有时则不会。
将以下前奏放入脚本中似乎停止了对终端的干扰并不能解决问题。但是,尚不清楚为什么它不能解决问题:进程是否仍在通过 访问终端/dev/tty
,或者程序编写的转义码是否仍在通过 转储到终端cat
。
MKTEMP="$(mktemp)"
mkfifo "$MKTEMP".fifo
(
set +o xtrace
cat "$MKTEMP".fifo
rm -f "$MKTEMP".fifo "$MKTEMP"
) </dev/null 2>&1 &
exec 1>"$MKTEMP".fifo
exec 2>&1
exec 0</dev/null
答案1
困境解决了。问题是sudo -g
在终端上后台要求输入密码,即使当前帐户没有密码。这似乎是一个错误sudo
;如果帐户没有密码,则不应要求输入密码(更改用户时不会要求输入密码,仅在更改组时才会要求输入密码):
ubuntu@ubuntu:~$ sudo -u nobody ls
Desktop Documents Downloads Music Pictures Public Templates Videos
ubuntu@ubuntu:~$ sudo -g nogroup ls
[sudo] password for ubuntu:
ubuntu@ubuntu:~$
解决方法是添加到NOPASSWD:
,sudoers
这使得问题消失了。
不确定性是由于sudo
您下次按下enter
终端时最终允许该命令,并且在一段时间内不再要求输入密码。