防止程序影响终端?

防止程序影响终端?

一些程序在一个大脚本中启动正在执行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终端时最终允许该命令,并且在一段时间内不再要求输入密码。

相关内容