Copie um arquivo e sobrescreva o arquivo existente

3

Eu tenho duas imagens (image1.png e image2.png) na mesma pasta no meu servidor, eu quero executar um comando que sobrescreve image2.png para image1.png. Eu prefiro substituir a imagem em vez de excluí-la e substituí-la pela outra. Como posso conseguir isso via linha de comando ssh?

    
por Mina Hafzalla 26.07.2014 / 02:13

3 respostas

5

ssh host "cd path/to/directory && cp image1.png image2.png"

O && é mais seguro que ; no caso de o cd falhar, por exemplo por causa de um erro de digitação: em tal caso, o cp não será executado em vez de possivelmente copiar um arquivo errado.

    
por 26.07.2014 / 02:18
1

Sem sudo , o comando ssh server "cd path/to/directory && cp image1.png image2.png" não tem privilégios para chmod das permissões.

Mas com sudo , mas sendo executado após ssh , ele nunca recebe entrada de senha para ele no servidor remoto, portanto, a solução usa -S e canaliza uma senha para sudo da seguinte forma:

ssh server " cd path/to/directory && echo sudo_password | sudo -S chmod 600 image2.png && cp image1.png image2.png"

EDITAR:

No entanto, como @terdon marcado, não precisamos alterar as permissões aqui, mas use sudo cp , então vem para:

ssh server " cd path/to/directory && echo sudo_password | sudo -S cp image1.png image2.png"

ou (no caso de você achar que sua senha pode ser lida)

ssh server -t " cd path/to/directory && sudo cp image1.png image2.png"

ATUALIZAÇÃO: também @terdon avisou e acrescentei isso, porque acho importante enfatizar e enfatizar essa possível realização:

I really would remove this suggestion of using -S, it is not needed and very dangerous (see @mikserv's comments and my answer). It is also pointless. The only "advantage" you mention, that of being able to pipe is a fringe case and in most situations you could just pipe on the server instead. You can also use sshpass as you suggested or set up passwordless sudo. All sorts of ways that don't store a server's password as plaintext. – terdon

Por um lado, isso é bom para a automação sem obter sudo prompts de senha e, para ter código / script completamente automatizado, você adicionaria sshpass -p password ssh... .

No entanto, no servidor em que outras pessoas podem facilmente ler sua senha sudo fornecida como texto aberto durante a sessão ssh , isso não é recomendado das perspectivas de segurança. Portanto, para ter um sudo com ssh e seja um uso seguro, use ssh -t

ssh -t server "cd path/to/directory && sudo chmod 600 image2.png && cp image1.png image2.png"

No entanto, com -t , é impossível canalizar ssh "sudo command"| command , por exemplo, ssh -t server "cd path/to/directory && sudo"|grep "text" , mas é possível usar ussage de -S e senha de eco, por exemplo. ssh server 'echo password | sudo -S ls -l'| grep 'a'

    
por 26.07.2014 / 07:50
1

Para se conectar a um servidor via ssh e executar um comando específico, tudo que você precisa é         ssh "comando"

No seu caso, você quer copiar um arquivo (ele sobrescreve por padrão), então você quer o comando cp . Funciona como cp /path/to/original /path/to/copy . Agora, você disse em seus comentários que tentar isso lhe dá um erro de permissão negada. Isso significa que você precisará executar o comando como root. Isso é feito usando sudo , então sudo cp /path/to/original /path/to/copy .

O próximo problema é que o ssh executa um shell não interativo com nenhum tty, então sudo não pode pedir uma senha. Você precisará usar o -t do ssh para isso. Então, colocando tudo isso junto, você pode fazer:

ssh -t user@server sudo cp /path/to/image2.png /path/to/image1.png

Fazer não nunca ecoar sua senha sudo como sugerido por outra resposta. Isso é extremamente perigoso, pois o tornará visível para qualquer usuário conectado no sistema e também será mantido em seu arquivo de histórico em texto simples. Isso significa que tudo que eu preciso fazer é grep sudo ~youruser/.bash_history e eu tenho sua senha e acesso completo ao servidor. Portanto, qualquer invasor que tenha acesso ao servidor agora pode fazer o que quiser.

    
por 26.07.2014 / 13:01