Copia um arquivo local para um servidor remoto, privilégios não-root sobre o sudo?

3

Gostaria de fazer algo como:

scp local_file remote_server:/some_directory

Mas para obter privilégios para / some_directory, precisamos chamar sudo . Eu sei que uma pergunta semelhante já havia sido feita várias vezes aqui, mas a maioria das respostas tirou proveito do cache de senhas de sudo (que, por algum motivo, parece não funcionar para mim em dois% co_de consecutivos % de chamadas) ou o fato de que somos root (para que possamos configurar um ssh sem senha ou fazer com que o SSH seja colocado na raiz).

No último, ambas as soluções parecem inseguras, então prefiro assumir que não estamos chamando sudo para se tornar root e, portanto, não é possível reconfigurar o sistema. O que pode ser feito em tal situação para simplesmente copiar um arquivo?

Aqui estão minhas tentativas até agora:

( 
read -s -p 'Enter password: ' pass; 
echo $pass ; 
tar cf - local_file ) | ssh -t -t remote_server 'sudo tar -C /some_directory' )

Existe uma maneira melhor?

    
por d33tah 10.04.2014 / 23:58

1 resposta

2

Encontrei uma maneira elegante de contornar esses problemas usando um canal nomeado . A idéia é executar o comando tar no lado remoto por meio de um soquete FIFO e torná-lo legível pelo usuário comum.

Aqui está um exemplo. No lado remoto, você primeiro cria o soquete:

remote$ sudo -s 
remote# mkfifo -m 600 /home/anarcat/tmpfifo
remote# chown anarcat /home/anarcat/tmpfifo

No lado local, você já pode começar a ler esse soquete:

local$ ssh example.net "cat tmpfifo" | pv -s 2G | tar xfz -

(A parte pv -s 2G | é totalmente opcional, para obter uma boa barra de progresso com o visualizador de canais .)

Então, no lado remoto, você pode começar a escrever:

remote# tar cfz /home/anarcat/tmpfifo files

Isso irá copiar files através dessa conexão SSH. É claro, você também poderia ter criado esse tarball diretamente no servidor remoto e torná-lo acessível ao usuário, mas, em seguida, exigiria todo o espaço do arquivo, que pode não estar disponível.

Quando isso for feito, você poderá remover o fifo como um arquivo simples:

remote$ rm /home/anarcat/tmpfifo
    
por 25.04.2014 / 16:15