2017-12-08 64 views
1

誰かが私になぜこのようなことが起こるのか説明できますか?-su:/ dev/tty:このようなデバイスやアドレスはありません

# su - someone -s /bin/bash -c "ls -la /dev/tty" 
crw-rw-rw- 1 nobody nogroup 5, 0 Dec 7 20:53 /dev/tty 
# BUT: 
# su - someone -s /bin/bash -c "echo hello > /dev/tty" 
-su: /dev/tty: No such device or address 

私は内部に2つのサービスを持つドッカーコンテナーを構築するためにトライエンです。シェルスクリプトでこれらのサービスstartet:

CMD ["./starter.sh"] 

は、私は、問題は、私はサービスのいずれかを実行しようとしているということです/dev/stderrまたは/dev/tty

# None of the following works: 
RUN ln -sf /dev/tty /var/log/thelog.log 
RUN ln -sf /dev/stdout /var/log/thelog.log 
RUN ln -sf /dev/stderr /var/log/thelog.log 

にログをリダイレクトしたDockerfileをWithing次のエラーだ与えないルート(su - someone -c "service")、よう:

unable to open log file [/var/log/thelog.log]: [6] No such device or address 

は、どのように私はこの問題を解決するだろうか?ログを/dev/*にリンクし、そのユーザーをroot以外のユーザーとして実行します。また、ユーザーをグループttyに追加しようとしましたが、うまくいかなかったのです。

ありがとうございました。

+1

デバイスをシンボリックリンクに置き換えることは、非常に脆く、危険なことです。カーネルはttyを操作します。静的なファイル記述子ではありません。そのため、最初にエラーが発生します。 – tripleee

+0

サービスを適切な場所にキャプチャするものにサービスをラップします。とにかく、ほとんどの正常なサービスはコンソールに何も印刷しません。 – tripleee

+0

こんにちは、ありがとう、しかしそうすることは、ドッカーとの共通の練習です。 '/ dev/*'にリダイレクトすると 'docker logs mycontainer'でログを見ることができます。したがって、この問題の要点は 'su - 'であり、プロセスを別の(!= root)ユーザーとして開始することです。 – chevallier

答えて

1

suのマンページ実行されたコマンドには制御端末がありません。

sudo -u someone /bin/bash -c "echo hello > /dev/tty" 

あなたでは、/ dev /へのシンボリックリンクを作成するために必要はありません:

$ errno ENXIO 
ENXIO 6 No such device or address 

はsudoのが制御端末を割り当てるん:は/ dev/ttyのにどれ書き込みはENXIOエラーを返しますdockerfileまたはsupervisorのユーザディレクティブを使用する場合は、tty(/ dev/stdoutおよび/ dev/stderrで十分です)またはsudoを使用してください。

+0

こんにちは、ありがとう。はい、私は上司を使うことができ、私は「ユーザ」について知っています。しかし、シェルスクリプトを使って2つのサービスを開始するには、管理者を使わずに非ルートと1つのルートとして実行する必要があります。 'USER non_root'を使うと' RUN'コマンドが1つしかないので、ルートサービスを開始できませんでした。 – chevallier

+0

スーパーバイザを使用するか、別のコンテナで各サービスを実行してください。 –

+0

'supervisord 'であっても、'/dev/tty'をルート以外のユーザとして使用することはできません。 – chevallier

関連する問題