Eu gostaria de copiar squid.conf
de um servidor para outro.
- Os servidores não se falam. Eu gostaria de passar pela minha estação de trabalho.
- Ambos os servidores têm o arquivo, portanto ele será substituído no destino.
- Os arquivos têm
600
permissão e pertencem à raiz. - o login root via ssh está desativado (
PermitRootLogin no
). - Eu gostaria de fazê-lo em uma linha, se possível, pois fará parte de um guia de configuração.
Eu sei fazer
ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
ssh target 'tar xzpf - -C /etc/squid/'
copiar arquivos entre servidores e preservar permissões. No entanto, neste caso, receberei "Permissão negada".
Eu também sei que posso fazer isso:
ssh -t source 'sudo cat /etc/squid/squid.conf'
Dessa forma, o -t
sudo pode solicitar a senha de administrador antes de enviar o conteúdo do arquivo.
O problema é que não sei como combinar essas técnicas em algo que solicite a senha do sudo em cada servidor e transfira o arquivo para o seu destino. Isso é possível?
ATUALIZAÇÃO : Aqui está o melhor que eu poderia apresentar:
ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'
Chamar isso de one-liner parece um exagero. Acho que vou dividi-lo para separar as etapas no guia de configuração.
ssh
sudo
file-transfer
itsadok
fonte
fonte
Respostas:
É mais fácil encadear ssh com ssh do que encadear ssh com sudo. Portanto, alterar a configuração do servidor ssh é bom, sugiro abrir o ssh para a raiz de cada servidor, mas apenas a partir do host local. Você pode fazer isso com uma
Match
cláusula emsshd_config
:Em seguida, você pode configurar uma cadeia de autenticação baseada em chave de usuário remoto para usuário local e de usuário local para raiz. Você ainda tem uma trilha de autenticação, para que seus logs digam quem fez login como root e as etapas de autenticação são as mesmas que se o sudo estivesse envolvido.
Para conectar-se a um servidor como root, defina um alias da
~/.ssh/config
seguinte maneira:Se você insistir em usar
sudo
, acredito que precisará de comandos separados, poissudo
insiste na leitura de um terminal (mesmo que tenha um ticket para sua conta) ¹ e nenhum dos métodos usuais de cópia de arquivos (scp, sftp, rsync) suporte à interação com um terminal remoto.Seguindo o ssh e o sudo, seus comandos propostos podem ser simplificados. Em cada lado, se você tiver configurado o sudo para não solicitar uma senha novamente, poderá executá-la uma vez para suprir o requisito de senha e outra para copiar o arquivo. (Você não pode copiar facilmente o arquivo diretamente porque o prompt de senha atrapalha.)
¹ menos que você tenha
NOPASSWD
, mas não perguntaria isso.fonte
Match host localhost
.Você pode configurar
sudo
para não pedir senha da próxima maneira:Na fonte:
No alvo:
E faça na sua máquina:
Mas eu recomendo usar algo como fantoche . É muito melhor e mais fácil resolve seu problema com a distribuição de arquivos de configuração.
PS. A propósito, se você configurar
sudo
para solicitar a senha do usuário, a string com[sudo] password for user
aparecerá no arquivo de destino.fonte
Em vez de usar o ssh, você pode usar o scp para transferir o arquivo entre os servidores.
Efetue login no servidor de destino:
Mude para o diretório de destino em que deseja copiar o arquivo.
r - recursivo p - preserva os tempos de modificação, os tempos de acesso e os modos do arquivo original
fonte
Sem alterar a configuração do ssh, você pode criar dois túneis ssh host-> servidor1 e servidor2-> host através da conexão ssh ao servidor2. Conecte esses dois túneis na máquina host (mesma porta). E execute o sudo no servidor2 para recuperar dados dos túneis conectados no servidor1 e salvá-los no servidor2.
A ideia é: 1- criar um túnel local da sua máquina para a máquina de origem na porta 60000
1b- Crie um túnel remoto para retornar à sua máquina
2- conectar à máquina alvo
3- execute tudo como root na máquina de destino para escrever
4- conectar à máquina de origem através do túnel. whoami e on localhost significam o host local na máquina $ {target}.
5- empacote o (s) arquivo (s) remoto (s) e envie-o zipado para o stdout
6- receba o pacote através do stdout e extraia os arquivos adequadamente no diretório / path / to / target
Nota: Você pode receber até 3 confirmações de tecla ssh e 3 solicitações de senha. Mas os arquivos serão copiados.
fonte