O kernel do Linux gerencia multitarefas por meio do uso de processos. O kernel mantém informações sobre cada processo para ajudar a manter as coisas organizadas, e cada processo recebe um número chamado ID de processo (PID).
O shell Linux também introduz o conceito de jobs para facilitar o fluxo de trabalho do usuário durante uma sessão de terminal. Como exemplo, cat error.txt | wc -m é um pipeline de dois processos, que o shell considera um único job. O controle de job se refere à capacidade de suspender seletivamente a execução de jobs e retomar sua execução em um momento posterior. Isso pode ser alcançado com a ajuda de comandos específicos, que exploraremos em breve.
Os trabalhos anteriores neste módulo foram executados em primeiro plano, o que significa que o terminal está ocupado e nenhum outro comando pode ser executado até que o atual termine. Como a maioria dos nossos exemplos foram curtos e agradáveis, isso não causou problemas. No entanto, estaremos executando comandos mais longos e complexos em módulos posteriores que podemos enviar para o segundo plano para recuperar o controle do terminal e executar comandos adicionais.
A maneira mais rápida de colocar um processo em segundo plano é anexar um e comercial (&) ao final do comando para enviá-lo para o segundo plano imediatamente após seu início. Vamos tentar um breve exemplo:
ping -c 500 127.0.0.1 > pings.txt &
No comando acima enviamos 500 solicitações de echo ICMP para a interface local com o comando ping e gravamos os resultados em um arquivo chamado pings.txt. A execução roda automaticamente em segundo plano, deixando o shell livre para operações adicionais.
Mas o que teria acontecido se tivéssemos esquecido de acrescentar o e comercial no final do comando? O comando teria sido executado em primeiro plano, e seríamos forçados a cancelar o comando com CTRL +C ou esperar até que o comando termine para retomar o controle do terminal. A outra opção é suspender o trabalho usando CTRL +Z depois que ele já tiver iniciado. Uma vez que um trabalho tenha sido suspenso, podemos retomá-lo em segundo plano usando o comando bg:
O job agora está sendo executado em segundo plano e podemos continuar usando o terminal como quisermos. Ao fazer isso, tenha em mente que alguns processos são sensíveis ao tempo e podem dar resultados incorretos se forem deixados suspensos por muito tempo. Por exemplo, no exemplo do ping, a resposta de echo pode retornar, mas se o processo for suspenso quando o pacote chegar, o processo pode perdê-lo, levando a uma saída incorreta. Sempre considere o contexto do que os comandos que você está executando estão fazendo ao se envolver no controle de tarefas.
Para verificar rapidamente o status de nossas solicitações de echo ICMP, precisamos usar dois comandos adicionais: jobs e fg.
Nesse exemplo iniciei o comando sem colocá-lo em segundo plano. Parei o job (processo) com o CTRL + Z, digitei o comando jobs para ver os processos, depois coloquei ele em primeiro plano com o comando fg, parei de novo, e em seguida eu peguei o PID do processo com o comando jobs -l. Agora eu posso matar o processo com o comando kill.
Um dos comandos mais úteis para monitorar processos em praticamente qualquer sistema operacional do tipo Unix é o ps (abreviação de process status). Ao contrário do comando jobs, o ps lista processos em todo o sistema, não apenas para a sessão de terminal atual. Este utilitário é considerado um padrão em sistemas operacionais do tipo Unix e seu nome é tão bem reconhecido que, mesmo no Windows PowerShell, o ps é um alias de comando predefinido para o cmdlet Get-Process, que serve essencialmente ao mesmo propósito.
Como PenTester (Red Team) , uma das primeiras coisas a verificar após obter acesso remoto a um sistema é entender qual software está sendo executado na máquina comprometida. Isso pode nos ajudar a elevar nossos privilégios ou coletar informações adicionais para adquirir mais acesso à rede.
Como exemplo, vamos tentar encontrar o ID de processo (PID) do systemd na linha de comando usando o comando ps:
ps -ef
As opções -ef que usamos acima significam:
- e: selecionar todos os processos
- f: exibir listagem de formato completo (UID, PID, PPID, etc.)
Encontrar nosso aplicativo systemd nessa listagem enorme definitivamente não é fácil, mas como sabemos o nome do aplicativo que estamos procurando, podemos substituir a opção -e por -C (selecionar pelo nome do comando) da seguinte forma:
ps -fC systemd
Conforme mostrado na imagem acima, a busca de processos retornou resultado do qual coletamos o PID do systemd. Reserve um tempo para explorar o manual de comandos (man ps), pois o ps é realmente o canivete suíço do gerenciamento de processos.
Digamos que agora queremos parar o processo do systemd (não faça isso) sem interagir com a GUI. O comando kill pode nos ajudar aqui, pois seu propósito é enviar um sinal específico para um processo.
Fizemos isso com o comando ping anteriormente.
kill -9 [Número Processo]