GNU/Linux >> Tutoriales Linux >  >> Linux

Ssh:¿Copiar archivos protegidos entre servidores en una línea?

Me gustaría copiar squid.conf de un servidor a otro.

  • Los servidores no se hablan entre sí. Me gustaría revisar mi estación de trabajo.
  • Ambos servidores tienen el archivo, por lo que se sobrescribirá en el destino.
  • Los archivos tienen 600 permiso 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 sola línea, si es posible, ya que será parte de una guía de configuración.

yo se que hacer

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

para copiar archivos entre servidores y conservar los 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 forma el -t permite que sudo solicite la contraseña de administrador antes de generar 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 esto posible?

ACTUALIZAR :Esto es 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 sola línea parece una exageración. Creo que lo dividiré en pasos separados en la guía de configuración.

Respuesta aceptada:

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. Puedes hacer esto con un Match cláusula en sshd_config :

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Luego, puede configurar una cadena de autenticación basada en claves desde el usuario remoto hasta el usuario local y desde el usuario local hasta la raíz. Todavía tiene un rastro de autenticación, por lo que sus registros le indican 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 en ~/.ssh/config así:

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 sudo insiste en leer desde una terminal (incluso si tiene un ticket para su cuenta)¹, y ninguno de los métodos habituales de copia de archivos (scp, sftp, rsync) admite la interacción con una terminal remota.

Relacionado:¿forma de especificar que una sección de una tubería sea completamente "transitable"?

Siguiendo con ssh y sudo, sus comandos propuestos podrían simplificarse. En cada lado, si tiene sudo configurado para no volver a solicitar una contraseña, puede ejecutarlo una vez para terminar con 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 tenga NOPASSWD , pero entonces no estarías preguntando esto.


Linux
  1. Cómo transferir archivos entre servidores en Linux usando SCP y FTP

  2. ¿Imprimir dos archivos en dos columnas?

  3. ¿Ejecutar una línea de comandos con un Sudo?

  4. ¿Acelerar la copia de 1000000 archivos pequeños?

  5. Mover todos los archivos excepto uno

Copiar archivos en Linux

Cómo leer archivos línea por línea en Bash

Cómo Rsync archivos entre dos servidores Linux automáticamente

4 formas de transferir archivos entre sistemas remotos y locales a través de SSH

Cómo usar Rsync para copiar/sincronizar archivos entre servidores

Diferencia en espacios en blanco entre dos archivos en Linux