GNU/Linux >> Tutoriels Linux >  >> Linux

Ssh – Copier des fichiers protégés entre serveurs sur une seule ligne ?

Je voudrais copier squid.conf d'un serveur à l'autre.

  • Les serveurs ne se parlent pas. J'aimerais parcourir mon poste de travail.
  • Les deux serveurs ont le fichier, il sera donc écrasé sur la cible.
  • Les fichiers ont 600 autorisation et appartiennent à root.
  • la connexion root via ssh est désactivée (PermitRootLogin no ).
  • J'aimerais le faire en une seule ligne, si possible, car cela fera partie d'un guide de configuration.

Je sais faire

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

pour copier des fichiers entre les serveurs et préserver les autorisations. Cependant, dans ce cas, j'obtiendrai "Autorisation refusée".

Je sais aussi que je peux faire ceci :

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

De cette façon, le -t permet à sudo de demander le mot de passe administrateur avant de sortir le contenu du fichier.

Le problème est que je ne sais pas comment combiner ces techniques en quelque chose qui demandera le mot de passe sudo sur chaque serveur et transférera le fichier vers sa destination. Est-ce possible ?

MISE À JOUR  : Voici ce que j'ai trouvé de mieux :

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'

Appeler cela un one-liner semble exagéré. Je pense que je vais simplement le décomposer en étapes distinctes dans le guide de configuration.

Réponse acceptée :

Il est plus facile de chaîner ssh avec ssh que de chaîner ssh avec sudo. Donc, changer la configuration du serveur ssh est correct, je suggère d'ouvrir ssh pour la racine de chaque serveur, mais uniquement à partir de localhost. Vous pouvez le faire avec un Match clause dans sshd_config :

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Ensuite, vous pouvez configurer une chaîne d'authentification basée sur une clé de l'utilisateur distant à l'utilisateur local et de l'utilisateur local à la racine. Vous avez toujours une trace d'authentification afin que vos journaux vous indiquent qui s'est connecté en tant que root, et les étapes d'authentification sont les mêmes que si sudo était impliqué.

Pour vous connecter à un serveur en tant que root, définissez un alias dans ~/.ssh/config comme ceci :

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

Si vous insistez pour utiliser sudo , je pense que vous aurez besoin de commandes distinctes, comme sudo insiste pour lire depuis un terminal (même s'il a un ticket pour votre compte)¹, et aucune des méthodes habituelles de copie de fichiers (scp, sftp, rsync) ne prend en charge l'interaction avec un terminal distant.

En relation :comment spécifier qu'une section d'un pipeline doit être complètement "traversée" ?

En vous en tenant à ssh et sudo, vos commandes proposées pourraient être simplifiées. De chaque côté, si vous avez configuré sudo pour ne plus demander de mot de passe, vous pouvez l'exécuter une fois pour surmonter l'exigence de mot de passe et une autre fois pour copier le fichier. (Vous ne pouvez pas facilement copier le fichier directement car l'invite de mot de passe vous gêne.)

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'

¹ sauf si vous avez NOPASSWD , mais alors vous ne poseriez pas cette question.


Linux
  1. Comment transférer des fichiers entre serveurs sous Linux à l'aide de SCP et FTP

  2. Déplacer tous les fichiers sauf un

  3. Serveur FTP sur une ligne

  4. Concaténer des fichiers et insérer une nouvelle ligne entre les fichiers

  5. Comment copier rapidement un grand nombre de fichiers entre deux serveurs

Copier des fichiers sous Linux

Comment lire des fichiers ligne par ligne dans Bash

Comment synchroniser automatiquement des fichiers entre deux serveurs Linux

4 façons de transférer des fichiers entre des systèmes distants et locaux via SSH

Comment utiliser Rsync pour copier/synchroniser des fichiers entre des serveurs

Différence d'espace entre deux fichiers sous Linux