Por que você não pode sudo história?

4

Se eu quiser ver o histórico de bash do root, por que não posso executar apenas sudo history ? quando eu faço isso, diz que o histórico do comando não foi encontrado, mas se eu rodá-lo sem o sudo ele corre bem.

Editar: é uma resposta duplicada, mas não uma pergunta duplicada à que está vinculada. A pessoa que fizer a pergunta não saberá que é um comando interno do shell, em oposição a um binário.

    
por StackOverflowed 12.04.2017 / 04:16

2 respostas

5

history é um comando interno do shell bash e sudo não funciona com os recursos internos do shell.

O que é um comando interno e o que não é?

Eu usei o comando which que "retorna os nomes de caminho dos arquivos (ou links) que seriam executados no ambiente" para confirmar que history não foi um comando externo (para bash).

Por exemplo, executando

$ which history
$

não retorna nada e o código de saída é 1 (um ou mais comandos especificados são inexistentes ou não executáveis) [Para ver o código de saída com echo $? ], durante a execução

$ which ls
/bin/ls
$

e o código de saída 0 (todos os comandos especificados são encontrados e executáveis).

Além disso, no bash você pode procurar ajuda para comandos incorporados com help (ou pesquisando a página man bash ). Por exemplo, digitando

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

mostra informações de ajuda do bash. A execução de help non-bash-command retorna algo semelhante a este:

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

e o código de saída 1

Então, o que o sudo vem fazendo?

Você pode pesquisar seu próprio histórico para os comandos sudo que seu usuário executou (e não pulou para salvá-lo no histórico) com grep '^sudo' .bash_history ou history|less ou similar.

Ou, no Ubuntu o arquivo /var/log/auth.log mantém registros de qual sudo vem fazendo para todos os usuários, procura por "sudo" lá (outras distros podem usar o arquivo /var/log/secure ), ou poderia usar

sudo grep sudo /var/log/auth.log

ou execute sudo journalctl _COMM=sudo se você tiver systemd.

Veja a pergunta "Detalhes sobre comandos do sudo executados por todos usuário "no Unix & Linux para mais detalhes

    
por 12.04.2017 / 07:27
2

history é um bash embutido, não um comando regular; sudo não inicia um shell para executar o comando que você deu, ele apenas tenta executá-lo diretamente (como um comando normal), então ele não está disponível.

Você pode usar sudo bash para abrir um comando do shell de root e depois executar history , mas se você quiser um one-liner, bem, é um pouco complicado. O bash só habilita seu mecanismo de histórico quando é executado no modo interativo, e se você fizer algo como sudo bash -c history (o -c diz ao bash "aqui está o comando que eu quero que você execute:"), ele o trata como modo não interativo e na verdade não exibe nenhum histórico. Mesmo adicionando -i (para o modo interativo) não funcionou quando eu testei. Mas isso aconteceu:

sudo bash -i <<<history

Observe que <<< é um recurso somente bash; em outros shells, você pode ter que usar echo history | sudo bash -i .

    
por 12.04.2017 / 07:32