scp para servidor remoto com sudo


55

Eu tenho um arquivo no servidor A (que está por trás de um NAT, portanto, não diretamente endereçável). O arquivo precisa ser copiado para o servidor B em um diretório restrito à raiz. Eu tenho uma conta no servidor B com privilégios sudo. Qual é a sintaxe do comando scp?



Fechei a pergunta mais antiga como uma duplicata desta, já que o autor da questão nunca recuperou a propriedade dessa questão.
quack quixote

Eu respondi em outra postagem como você pode personalizar o scp fazer o sudo para você diretamente. Isso é semelhante ao que o WinSCP faz.
YoYo

Respostas:


50

Primeiro, você precisa copiar o arquivo para um lugar onde você tenha acesso de gravação sem sudo,

scp yourfile serverb:

Em seguida, mova o arquivo usando o sudo

ssh serverb sudo mv yourfile /path/to/the/destination

Se você não tiver um local gravável, crie um diretório temporário com permissão de gravação para seu usuário.

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

5
/ tmp é um bom lugar para escrever arquivos temporários que (geralmente) todos os usuários têm acesso.
Doug Harris

3
@ Doug: Note que / tmp pode estar na RAM ou no ponto de montagem, e não necessariamente grande o suficiente para hospedar arquivos grandes.
Ravachol

1
O que quer que você esteja tentando realizar, chmod 777 é geralmente o caminho errado para fazê-lo. Considere o que poderia acontecer se alguém estivesse logado e soubesse que você estava prestes a executar este código.
tripleee

ssh sudo não funciona para mim - reclama "não tty presente e nenhum programa askpass especificado"?
Ross Presser

38

Com o SCP, você tem que fazer em duas etapas, no entanto, você pode fazê-lo em um com o rsync da seguinte maneira:

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

Nota: Isso requer NOPASSWD configuração do sudo. Se você tiver que digitar a senha para o sudo, então o caminho de dois passos é necessário.

Para copiar o diretório, você precisa adicionar -r parâmetro. E -v para saída detalhada.


Para usar o método acima com credenciais, você precisa adicioná-las ao seu ~/.ssh/config arquivo, por exemplo

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

4
Esta é de longe a maneira mais simples de fazer isso.
Matt White

Erro sudo: sorry, you must have a tty to run sudo fixado por -e "ssh -tt".
mj41

@ mj41 Com -e "ssh -tt", Eu recebo protocol version mismatch -- is your shell clean?. Alguma dica de como consertar isso?
ax.

18

Você pode usar ssh e tar para contornar isso:

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

Isso primeiro atualiza seu timestamp sudo (pedindo uma senha, se necessário, que requer um tty ( ssh -t )) e, em seguida, usa o sudo para criar um tarball remotamente e extraí-lo localmente.

"tar" no RedHat 5 requer as opções "--preserve" após o comando "xpsf -".


Apenas uma nota: se você conseguir tar: Invalid replacement string, removendo -s na parece corrigi-lo (não tem certeza do que você precisa do s de qualquer maneira). Muito Obrigado; isso é incrível.
RecursivelyIronic

Isso exigiria tty_tickets ser desativado, correto?
Jacob Budin

@JobobBudin sim.
blueyed

4

Você pode usar o comando sftp com sudo, por exemplo:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

Este e os métodos de rsync são provavelmente a maneira mais direta de fazer isso em uma única etapa. É lamentável que a tarefa scp em form não suporte isso. Você pode configurá-lo para usar o sftp, mas não pode modificar o subprograma remoto. Observe que o subprograma será diferente dependendo do tipo de servidor (o Solaris pode ser diferente).
YoYo

0

Se você precisar digitar a senha para o sudo todas as vezes, você pode salvá-lo em um arquivo:

echo "Enter password: "; read -s password; echo $password > password_file

e depois enviá-lo junto com o arquivo de origem.

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

Você pode usar tee ao invés de sponge se você não tiver mais créditos.


-1
current server $ sudo scp username@server:source/path/filename /tmp/

Ele irá copiar um arquivo específico da fonte para / tmp / no servidor atual


Ele executará o sudo localmente, sem privilégios elevados remotamente.
YoYo

Isso simplesmente não funcionará, como diz @Yoyo.
Mani

scp provavelmente não conectará, porque ele irá ler a chave do root
Pierre-Olivier Vares
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.