29Jun

Shell Script para carregar um arquivo para o mesmo subdiretório em um servidor remoto

Uma tarefa muito comum para um desenvolvedor web é carregar um único arquivo de um subdiretório em sua caixa de desenvolvimento para o mesmo subdiretório em um servidor remoto. Infelizmente, isso sempre acaba sendo um processo manual irritante envolvendo alternar diretórios em ambos os servidores e desperdiça uma grande quantidade de tempo.

Então, considerei escrever um script de shell para automatizar isso para mim, usando o scp para cópia de arquivos segura.(Important Side Note: o ftp é horrivelmente inseguro, use o WinSCP em vez disso)

O principal problema a resolver foi que a minha instalação do WordPress na minha máquina de desenvolvimento possui um diretório de base diferente do que a instalação no meu servidor. Na minha máquina de desenvolvimento é /var/ www, e no meu servidor é algo mais como /var/www/howtogeek/docs/.Eu decidi apenas movê-los para variáveis ​​no início do script, como este:

[email protected]
RDIR = /var/www/howtogeek/ docs
LDIR = '\ / var \ / www'

Observe que o diretório local( LDIR) no script tem um \ antes de cada / no caminho. Isso é porque nós vamos passar para um comando sed mais tarde no script, então nós temos que escapar desses valores. Tenho certeza de que há alguma outra maneira de contornar isso, mas não tenho conhecimento disso.

Em seguida, configurei logs automáticos ssh. Para fazer isso, você precisa primeiro executar o utilitário ssh keygen assim:

ssh-keygen -t rsa

Então você precisa copiar o arquivo ~ /.ssh/ id_rsa.pub para o arquivo ~ /.ssh/ authorized_keys no servidor remoto. Se o diretório ~ /. ssh já estiver criado no servidor remoto( pode querer verificar), então você pode executar este comando para copiar as chaves:

cat ~ /.ssh/ id_rsa.pub |ssh user @ hostname 'cat & gt; & gt;

. ssh / authorized_keys. Agora, temos logins ssh automatizados, o que permitirá o uso do utilitário scp sem uma senha. Agora vamos dar uma olhada no comando scp que usamos no script:

scp $ 1 $ SSHSERVER: $ RDIR`pwd | sed "s / ${ LDIR} //" `/` echo $ 1 | sed 's /.* \ /// '`

O $ 1 é o parâmetro que você passará para o script para o nome do arquivo que você está tentando fazer o upload.$ SSHSERVER e $ RDIR são variáveis ​​que definiremos no início do script para configurar o usuário @ hostname e o caminho remoto anterior.

O primeiro bloco que começa com pwd | sed leva o caminho do diretório atual e remove a parte anterior do caminho que não coincide com o servidor remoto, mas deixa o resto do caminho. Por exemplo, se você estivesse no /var/www/ wp-content / quando executou o comando, o bloco sed eliminaria o /var/ www com base em nossa variável LDIR, mas deixe o / wp-content / part of it.

O segundo bloco apenas garante que você tira todo o caminho anterior do nome do arquivo passado para o script para que você apenas obtenha o nome do arquivo.

Por exemplo, se você chamou o script up.sh e o executou de seu diretório local /var/www/ wp-content /plugins/ em um arquivo:

up.sh myplugin.php

Isso teria sido expandido pelo shell como o seguinte:

scpmyplugin.php [email protected]: /var/www/howtogeek/docs/ wp-content /plugins/ myplugin.php

Em vez de tentar criar seu próprio arquivo de script com base no artigo, forneci o seu download. Dessa forma, não haverá problemas com caracteres especiais que não funcionem. .. e sim, usei o script para carregar sozinho =)

Faça o download do geek-uploader.sh

Basta colocá-lo em algum lugar do seu caminho e nomeie o que quiser. Eu renomeiei o meu para apenas "para cima", então eu posso simplesmente digitar "up filename.txt" para fazer o upload. Lembre-se também de abri-lo e alterar as variáveis ​​no início do script para corresponder ao seu ambiente.

Este script deve funcionar em qualquer coisa com um shell * nix e o utilitário scp. Estou usando o Ubuntu, mas deveria funcionar no Solaris, no OS X ou mesmo no Windows com o Cygwin instalado.