web-dev-qa-db-ja.com

なぜSudoの歴史ができないのですか?

Rootのbash履歴を表示したいのに、Sudo historyを実行できないのはなぜですか?コマンド履歴が見つかりませんと表示されますが、Sudoなしで実行すると正常に実行されます。

編集:それは重複した答えですが、リンクされたものと重複した質問ではありません。どちらかの質問をしている人は、それがバイナリではなくシェルの組み込みコマンドであることを知りません。

4
StackOverflowed

historyはbashShell組み込みコマンドであり、SudoはShell組み込みコマンドでは機能しません。


組み込みコマンドとは何ですか?そうでないものは何ですか?

コマンドwhichを使用しました。 "はファイル(またはリンク)のパス名を返します。環境内で実行されました」historyが外部(bashへの)コマンドではないことを確認します。

たとえば、実行中

$ which history
$

何も返さず、終了コードは1です(1つ以上の指定されたコマンドが存在しないか実行可能ではありません)[FYI実行中にecho $?で終了コードが表示されます]

$ which ls
/bin/ls
$

および終了コード0(指定されたすべてのコマンドが検出されて実行可能)。

また、bashでは、help(またはman bashページの検索)を使用して組み込みコマンドのヘルプを検索できます。たとえば、次のように入力します

$ help history
history: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps
arg [arg...]
   Display or manipulate the history list.
...

bashのヘルプ情報を表示します。 help non-bash-commandを実行すると、次のようなものが返されます。

$ help ls
bash: help: no help topics match `ls'.  Try `help help' or `man -k ls' or
`info ls'.

および終了コード1


では、須藤は何をしているのでしょうか。

grep '^Sudo' .bash_historyまたはhistory|lessなどを使用して、ユーザーが実行した(履歴への保存をスキップしない)Sudoコマンドの履歴を検索できます。

または、Ubuntuでは、ファイル/var/log/auth.logがすべてのユーザーに対してSudoが行ったことの記録を保持し、そこで「Sudo」を検索します(他のディストリビューションではファイル/var/log/secureを使用できます)。使用できます

Sudo grep Sudo /var/log/auth.log

または、systemdを使用している場合は、Sudo journalctl _COMM=Sudoを実行します。

詳細については、質問 「すべてのユーザーが実行するSudoコマンドの詳細」(UnixおよびLinux) を参照してください。

5
Xen2050

historyはbashに組み込まれており、通常のコマンドではありません。 Sudoは、指定したコマンドを実行するためにシェルを起動しません。シェルを直接(通常のコマンドとして)実行しようとするだけなので、使用できません。

Sudo bashを使用してルートシェルコマンドを開いてからhistoryを実行できますが、ワンライナーが必要な場合は少し複雑です。 bashは、インタラクティブモードで実行されている場合にのみ履歴メカニズムを有効にし、Sudo bash -c history-cはbashに「実行してほしいコマンドは次のとおりです:」)のようなことを行うと、次のように扱います。非対話型モードであり、実際には履歴を表示しません。 -i(インタラクティブモードの場合)を追加しても、テストしたときに機能しませんでした。しかし、これはしました:

Sudo bash -i <<<history

<<<はbashのみの機能であることに注意してください。他のシェルでは、代わりにecho history | Sudo bash -iを使用する必要がある場合があります。

2
Gordon Davisson