この質問は以下に関連しています。abrt-hook-cppがインストールされているコアファイルはどこにありますか?。
故意にクラッシュしたプログラムに対してコアファイルを生成しようとしたとき、最初はabrt-ccppによってコアファイルの生成がブロックされているようです。だから/proc/sys/kernel/core_pattern
vimで手動で編集しようとしました。
> sudo vim /proc/sys/kernel/core_pattern
ファイルを保存しようとすると、vimは次のエラーを報告します。
"/proc/sys/kernel/core_pattern" E667: Fsync failed
権限の問題であると思って権限を変更してみました。
> sudo chmod 666 /proc/sys/kernel/core_pattern
chmod: changing permissions of '/proc/sys/kernel/core_pattern\': Operation not permitted
最後に、この投稿、私はこれを試しました:
>sudo bash -c 'echo /home/user/foo/core.%e.%p > /proc/sys/kernel/core_pattern'
これはうまくいきます。
作業ソリューションに基づいて、次のことを試みましたが失敗しました。
> echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
-bash: /proc/sys/kernel/core_pattern: Permission denied
>
> sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
-bash: /proc/sys/kernel/core_pattern: Permission denied
質問:
出力をファイルに編集、chmod
転送、およびリダイレクトする操作がすべて失敗し、指定された呼び出しだけがファイルを上書きまたは編集できるのはなぜですか。echo
/proc/sys/kernel/core_pattern
sudo bash...
質問:
具体的には、上記の失敗した試みの呼び出しの試みに関してsudo
:なぜ失敗したのですか?sudo
root権限で後続のコマンドを実行すると、Linux上で何でもできると思います。
答え1
procfs のエントリは一時コードで管理されます。/proc/sys
ファイルの権限と所有権を設定するコード(以下proc_sys_setattr
)権限と所有権を変更するためのEPERMの使用を拒否します。したがって、これらのファイルの権限や所有権を完全に変更することはできません。これらの変更はまだ実装されていないため、ルートになることは役に立ちません。
root以外のユーザーとして書き込もうとすると、権限エラーが発生します。を使用しても、rootではなくユーザーとして作成しようとしています。つまり、sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
rootとしてsudo
実行されているが実行中のシェルecho
でリダイレクトが発生し、sudo
そのシェルには昇格された権限がありません。を使用すると、sudo bash -c '… >…'
rootとして起動され、rootとして実行されるbashインスタンスでリダイレクトが実行されるため、書き込みはsudo
成功します。
ルートだけがsysctl設定を許可するのは、kernel.core_pattern
コマンドを指定できるようにするためです。これはグローバル設定なので、すべてのユーザーがコマンドを実行できるからです。実際、これはすべてのsysctl設定に対してある程度真実です。グローバル設定なので、ルートのみ変更できます。kernel.core_pattern
特に危険な場合です。
答え2
Ubuntu 18.04では、次を使用してスキーマを更新できます。
sudo bash -c 'echo "/data/app_crash/%t.%e.core.%p" > /proc/sys/kernel/core_pattern'
/etc/sysctl.conf
次の行を更新して追加することもできます。
kernel.core_pattern = /data/app_crash/%t.%e.core.%p
ただし、kernel.core_pattern
再起動後、他の行が設定されていなくてもモードはデフォルトに戻ります。/etc/sysctl.conf
/etc/sysctl.d/*
$ sudo sysctl -a | grep kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P
apport
これが私が変更した内容を上書きすることがわかりました。削除しapport
てからsudo apt-get remove apport
変更を使用しました。
答え3
Ubuntu 16.04 LTSでは
sudo bash -c 'echo /home/user/foo/core.%e.%p > /proc/sys/kernel/core_pattern'
失敗した
No such file or directory
私は走らなければならない
sudo sysctl -w kernel.core_pattern=/home/user/foo/core.%e.%p