Estou desenvolvendo um daemon que está funcionando mal e agora não consigo criar novos processos (ou seja, não consigo iniciar um novo processo para eliminar os outros processos não autorizados). Então, preciso ser capaz de encerrar os processos de uma máquina remota. Como faço para "matar" remotamente sem privilégios de administrador? Se eu não conseguir encerrar meu próprio processo em uma máquina remota como um usuário normal, diga-me para que eu possa marcá-lo como a resposta correta.
Responder1
Para encerrar um processo em execução em uma máquina, algum processo local (ou o kernel) precisa emitir o sinal de eliminação. Portanto, você precisa de uma maneira de fazer com que um processo emita esse sinal e, como não é possível criar um novo processo, você precisa encontrar uma maneira que dependa exclusivamente de processos já em execução.
Não existe um daemon padrão que possa ajudá-lo nisso. Todos eles processariam sua autenticação e, em seguida, criariam um novo processo (como um shell) executado como você. Portanto, se você não tem acesso ao console e não tem interação com a máquina, você está sem sorte.
Pelos seus comentários, parece que você ainda tem um shell na máquina. Depois, há coisas que você pode fazer. Você não pode executar nenhum processo externo, como ls
ou ps
. Mas você pode executar comandos integrados como echo
, read
, e kill
( kill
não é integrado em todos os shells, mas é um em todos os shells que suportam controle de trabalho, como bash e zsh).
Cada processo possui um diretório associado em /proc
: /proc/12345
onde 12345 é o ID do processo. Assim, você pode obter algumas informações sobre a existência explorando /proc
. echo
com curingas é útil aqui, por exemplo, cd /proc; echo [0-9]*
mostra os IDs de todos os processos em execução. Se o shell for zsh, você poderá fazer muito com qualificadores glob; por exemplo, echo /proc/*(u$UID)
mostra apenas os processos em execução sob seu ID de usuário.
Uma maneira de exibir o conteúdo de um arquivo sem bifurcar é
while read -r line; do
echo "$line"
done </path/to/file
Você pode eliminar muitos processos de uma vez, passando todos eles para kill
. Se você identificou um processo que pertence ao seu daemon, tente eliminar seu grupo de processos com kill -9 -PGID
onde PGID
está o ID do processo do líder do grupo. Você pode encontrar o ID do grupo de processos do processo 123 com </proc/123/stat read pid tcomm state ppid pgrp sid more; echo $pgrp
. (A mesma informação existe em um formato mais legível, /proc/123/
mas você não está em boas condições para lê-la.) Você também pode tentar enviar um sinal para todos os seus processos (incluindo o shell de origem) com
trap : NUM
kill -NUM -1
Escolha valores de NUM diferentes de KILL
(9) para que o trap
comando faça com que seu shell ignore o sinal ( KILL
não pode ser capturado).
Responder2
As seguintes informações foram encontradas emhttp://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/
Mate o processo usando o comando kill no Linux/UNIX
O comando kill funciona em sistemas operacionais semelhantes ao Linux e UNIX/BSD.
etapa 1: primeiro, você precisa descobrir o PID do processo (id do processo)
Use o comando ps ou o comando pidof para descobrir o ID do processo (PID). Sintaxe: ps aux | grep nome do processo pidof nome do processo
Por exemplo, se o nome do processo for lighttpd, você poderá usar qualquer um dos seguintes comandos para obter o ID do processo:
ps aux | grep lighttpdOutput
lighttpd 3486 0.0 0.1 4248 1432 ? S Jul31 0:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
lighttpd 3492 0.0 0.5 13752 3936 ? Ss Jul31 0:00 /usr/bin/php5-cg
OU use o comando pidof que é usado para encontrar o ID do processo de um programa em execução:
pidof lighttpd
Saída
3486
Etapa 2: encerrar o processo usando PID (ID do processo)
O comando acima informa o PID (3486) do processo lighttpd. Agora elimine o processo usando este PID:
# kill 3486
OU
# kill -9 3486
Onde, -9 é um sinal Kill especial, que encerrará o processo.
exemplos de comando killall
NÃO USE o comando killall no sistema UNIX (comando somente Linux). Você também pode usar o comando killall. O comando killall mata processos por nome (não há necessidade de encontrar o PID):
# killall -9 lighttpd
Mate o processo do Firefox:
# killall -9 firefox-bin
Como eu disse anteriormente, o killall no sistema UNIX faz outra coisa. Ele mata todos os processos e não apenas processos específicos. Não use killall no sistema UNIX (use kill -9).
Responder3
Como você disse em seu comentário, um administrador é a única pessoa que pode ajudá-lo neste momento. Eu sugiro que você obtenhao livro de receitas Perle leia a seção 16.19 para saber o método correto de lidar com zumbis.