¿Copiando archivos protegidos entre servidores en una línea?

13

Me gustaría copiar squid.confde un servidor a otro.

  • Los servidores no hablan entre sí. Me gustaría pasar por mi estación de trabajo.
  • Ambos servidores tienen el archivo, por lo que se sobrescribirá en el destino.
  • Los archivos tienen 600permiso y son propiedad de root.
  • el inicio de sesión raíz a través de ssh está deshabilitado ( PermitRootLogin no).
  • Me gustaría hacerlo en una línea, si es posible, ya que será parte de una guía de configuración.

Yo sé hacer

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'

copiar archivos entre servidores y preservar permisos. Sin embargo, en este caso obtendré "Permiso denegado".

También sé que puedo hacer esto:

ssh -t source 'sudo cat /etc/squid/squid.conf'

De esta manera, -tpermite que sudo solicite la contraseña de administrador antes de mostrar el contenido del archivo.

El problema es que no sé cómo combinar esas técnicas en algo que solicite la contraseña de sudo en cada servidor y transfiera el archivo a su destino. es posible?

ACTUALIZACIÓN : Aquí está lo mejor que se me ocurrió:

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'

Llamar a esto una frase parece una exageración. Creo que lo dividiré en pasos separados en la guía de configuración.

itsadok
fuente
Relacionado: Copiar un árbol grande de una máquina a otra, manteniendo la propiedad
Gilles 'SO- deja de ser malvado'

Respuestas:

11

Es más fácil encadenar ssh con ssh que encadenar ssh con sudo. Entonces, cambiar la configuración del servidor ssh está bien, sugiero abrir ssh para la raíz de cada servidor, pero solo desde localhost. Puede hacer esto con una Matchcláusula en sshd_config:

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Luego, puede configurar una cadena de autenticación basada en clave de usuario remoto a usuario local y de usuario local a root. Todavía tiene un rastro de autenticación, por lo que sus registros le informan quién inició sesión como root, y los pasos de autenticación son los mismos que si sudo estuviera involucrado.

Para conectarse a un servidor como root, defina un alias ~/.ssh/configcomo este:

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"

Si insiste en usar sudo, creo que necesitará comandos separados, como sudoinsiste en leer desde un terminal (incluso si tiene un ticket para su cuenta) ¹, y ninguno de los métodos habituales de copia de archivos (scp, sftp, rsync) Soporte para interactuar con un terminal remoto.

Siguiendo con ssh y sudo, sus comandos propuestos podrían simplificarse. En cada lado, si ha configurado sudo para no volver a solicitar una contraseña, puede ejecutarla una vez para superar el requisito de contraseña y otra vez para copiar el archivo. (No puede copiar fácilmente el archivo directamente porque la solicitud de contraseña se interpone).

ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'

¹ a menos que lo hayas hecho NOPASSWD, pero no estarías preguntando esto.

Gilles 'SO- deja de ser malvado'
fuente
La primera solución funcionó bien para mí, pero la segunda línea debería ser Match host localhost.
cduck
4

Puede configurar sudopara no solicitar la contraseña de la siguiente manera:

En la fuente:

user    ALL=NOPASSWD:/bin/cat

En el blanco:

user    ALL=NOPASSWD:/usr/bin/tee

Y haz en tu máquina:

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

Pero recomiendo usar algo como títeres . Es mucho mejor y más fácil resuelve su problema con la distribución de archivos de configuración.

PD. Por cierto, si configurará sudopara solicitar una contraseña al usuario, la cadena con [sudo] password for useraparecerá en el archivo de destino.

prisa
fuente
+1 por sugerir títeres, pero su solución parece insegura. También podría permitir iniciar sesión como root.
itsadok
2

En lugar de usar ssh, puede usar scp para transferir el archivo entre los servidores.

Inicie sesión en el servidor de destino:

Cambie al directorio de destino donde desea copiar el archivo.

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

r: recursivo p: conserva los tiempos de modificación, los tiempos de acceso y los modos del archivo original

Mughil
fuente
Esto supone que puedo iniciar sesión como root, que no puedo. Actualizando la pregunta.
itsadok
2

Sin cambiar la configuración de ssh, puede crear dos túneles ssh host-> servidor1 y servidor2-> host a través de la conexión ssh al servidor2. Conecte estos dos túneles en la máquina host (mismo puerto). Y ejecute sudo en el servidor2 para recuperar datos de los túneles conectados en el servidor1 y guardarlos en el servidor2.

ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'

La idea es: 1- crear un túnel local desde su máquina a la máquina fuente en el puerto 60000

ssh -L60000:${source}:22

1b- Cree un túnel remoto para volver a su máquina

-R60000:localhost:60000

2- conectar a la máquina de destino

-t ${target}

3- ejecuta todo como root en la máquina de destino para escribir

'sudo bash -c "..."'

4- conectar a la máquina fuente a través del túnel. whoami y localhost significa localhost en la máquina $ {target}.

ssh -p 60000 '$(whoami)'@localhost

5- empaquete los archivos remotos y envíelos comprimidos a stdout

cd /path/to/dir; tar -czf - file

6- recibe el paquete a través de stdout y extrae los archivos en consecuencia en el directorio / path / to / target

|tar -C/path/to/target -xzf -

Nota: Puede recibir hasta 3 confirmaciones de sshkey y 3 solicitudes de contraseña. Pero los archivos se copiarán.

Marco Aurelio
fuente