Força a mudança do cwd de um usuário como root

5

Estou procurando alterar o processo de um usuário para que eu possa definir seu cwd.

Relacionado, e secundário para a questão, eu tenho um sistema de arquivos que eu quero desmontar, mas um usuário está sentado nele com um processo bash. Eu não quero matar o processo desse usuário, mas eu gostaria de redirecioná-los gentilmente para dizer ... / tmp enquanto desmonto o disco.

Eu sou a raiz, obviamente.

    
por fthinker 16.03.2012 / 05:26

2 respostas

9

Não há como alterar o diretório de trabalho de um processo de fora dele, raiz ou não. Isso seria extremamente perturbador para o processo da vítima, e simplesmente não há API para isso.

Agora você pode usar truques sujos. Um deles é anexar um depurador ao seu processo de destino e forçar um chdir nele - consulte esta pergunta no Stack Overflow . Alguns sistemas operacionais podem oferecer outras APIs para executar tais tarefas (injetando syscalls em processos desavisados).

Quanto ao seu objetivo de remontar um sistema de arquivos de alguém, isso é essencialmente impossível, mesmo que você tecnicamente consiga hackeá-lo - provavelmente o processo terá descritores de arquivos abertos na montagem "antiga", e não há maneira portátil re-anexá-los corretamente aos arquivos na "nova" montagem, mesmo se os arquivos correspondentes ainda estiverem lá.
Uma abordagem que parece funcionar em teoria seria uma espécie de hibernação dos processos que você quer fora do caminho para essa manutenção. Mas há muitos problemas com isso, especialmente considerando não apenas arquivos simples, mas soquetes de rede. (Veja esta outra questão para alguns pontos interessantes.)

Em suma, você é melhor com um kill educado (com um período de carência), não se sabe quais conseqüências inesperadas podem surgir de jogos com cwd em um processo aleatório.

    
por 16.03.2012 / 07:48
8

Um processo é responsável por gerenciar seu próprio diretório atual. Não há como mudar isso do lado de fora.

Você pode trapacear, fazendo com que o processo mude seu próprio diretório. Se você estiver executando como usuário root ou como o mesmo usuário do processo, poderá usar a ptrace chamada de sistema fazer todos os tipos de coisas invasivas em um processo, incluindo alterar sua memória sob o nariz e executar chamadas do sistema. Isso é o que os depuradores usam.

Trate isso como uma operação cirúrgica experimental. O paciente pode acordar ileso ou morrer. Isso deve funcionar se o processo realmente não se importar com o diretório atual. Um programa que tenha um relacionamento íntimo com seu diretório atual, como um shell, provavelmente não sobreviverá.

Aqui está um script que eu usei no passado para mover processos de montagens penduradas do NFS. Use a seu próprio risco.

#!/bin/sh
if [ $# -ne 2 ]; then
  echo 1>&2 "Usage: $0 PID DIR"
  exit 120
fi
case "$1" in
  *[!0-9]*) echo 1>&2 "Invalid pid \'$1'"; exit 3;;
esac
case "$2" in
  *[\\"]*)
    echo 1>&2 "Unsupported character in directory name, sorry."
    exit 3;;
esac

gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call chdir("$2")
detach
quit
EOF
    
por 16.03.2012 / 16:58