web-dev-qa-db-ja.com

「スクリプト」を/ dev / null /にリダイレクトすると、別のユーザーとしてsuされているときに「画面」が機能するのはなぜですか?

特定の長時間実行スクリプトを実行するようユーザーに訴えられました。画面を使用したかったのですが、「端末 '/ dev/pts/4'を開けません-確認してください。」というエラーメッセージが表示されました。

それで私は周りをグーグル検索して、$ script '/dev/null/'を実行するように指示するフォーラム投稿に出くわしました。私はそうし、それから私はスクリーニングすることができました。

なぜこれが機能するのですか?その画面をsu'edユーザーとして実行することはできませんか? 「スクリプト」を/ dev/nullにリダイレクトすると、それができないのはなぜですか?スクリプトを使用して、元のユーザーとしてログをどこかに書き込みますか?

38
Ichorus

まあ、厳密には、ここでは何もリダイレクトしていません。

script /dev/nullを呼び出すと、scriptTypeScript全体を/dev/nullに保存します。これは、実際にはコンテンツを破棄することを意味します。

詳細についてはman scriptを、実装についてはtil-linux-ngパッケージを参照してください(misc-utils/script.c) 。

これは実際にはscreenとは関係ありません。これが機能する理由は、scriptを呼び出すと、/dev/pts/Xに疑似端末が作成されるという副作用があります。これにより、自分で行う必要がなくなり、画面に権限の問題が発生しなくなります。ユーザーからsuを受け取った場合[〜#〜] a [〜#〜]からユーザー[〜#〜] b [〜#〜]screenを直接呼び出すことにより、ユーザー[〜#〜] a [ 〜#〜]の疑似端末。 rootでない限り、これは成功しません。そのため、エラーメッセージが表示されます。

42
Karol J. Piczak

端末ウィンドウに直接出力するには、実行中のプログラムが制御端末に書き込むことができる必要があります。 xterm、ssh、またはその他の仮想接続を使用している場合(実際に直接接続されている端末とは対照的に)、制御端末は pseudo tty (pty)です。

あなたのptyは、あなたがログオンしたときにあなただけに書き込み許可が設定されています。そうでない場合、他のユーザーがあなたのディスプレイに落書き(またはそれを読む)する可能性があります。したがって、別のユーザーにsuを実行すると(そのユーザーはrootではない)、そのユーザーは基礎となるptyにアクセスできません。

ただし、screenなどのより複雑なI/Oでは、ptyに直接アクセスして、画面全体を制御する魔法を使う必要があります。これは、コマンドを実行している人が制御端末に適切にアクセスできないという問題に遭遇したときです。

スクリプトを/ dev/nullにリダイレクトすると、画面が制御端末に書き込みを行わないため、権限の問題が発生しません。

7
Phil Hollenback