一部のプログラムは大規模スクリプトで起動して実行されますstty -echo
。どんなプログラムなのかよく分からないので試行錯誤を経て探してみなければなりませんね。プログラムが端末にアクセスするのを防ぐだけで十分ですか</dev/null 2>&1 | tee /dev/null
、それとも端末にアクセスする他の方法はありますか?
実際にどのプログラムが端末にアクセスしているのかわかりません(strace
スクリプト全体を試してみると、17 MBのないファイルが生成されるため、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
最終的にコマンドが許可され、しばらくの間パスワードを要求されないという事実によるものです。