Copie des fichiers protégés entre les serveurs sur une seule ligne?

13

Je voudrais copier squid.confd'un serveur à un autre.

  • Les serveurs ne se parlent pas. Je voudrais passer par mon poste de travail.
  • Les deux serveurs ont le fichier, il sera donc écrasé sur la cible.
  • Les fichiers sont 600autorisés 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 il 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 conserver les autorisations. Cependant, dans ce cas, j'obtiendrai "Autorisation refusée".

Je sais aussi que je peux faire ça:

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

De cette façon, -tsudo peut 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 le meilleur que j'ai pu trouver:

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 un étirement. Je pense que je vais le décomposer en étapes distinctes dans le guide de configuration.

itsadok
la source

Réponses:

11

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 ok, je suggère d'ouvrir ssh pour la racine de chaque serveur, mais uniquement depuis localhost. Vous pouvez le faire avec une Matchclause dans sshd_config:

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Vous pouvez ensuite configurer une chaîne d'authentification basée sur les clés de l'utilisateur distant à l'utilisateur local et de l'utilisateur local à root. Vous avez toujours une trace d'authentification, donc 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 ~/.ssh/configcomme 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 sudoinsiste sur la lecture depuis un terminal (même s'il a un ticket pour votre compte) ¹, et aucune des méthodes de copie de fichiers habituelles (scp, sftp, rsync) prendre en charge l'interaction avec un terminal distant.

En conservant ssh et sudo, vos commandes proposées pourraient être simplifiées. De chaque côté, si vous avez configuré sudo pour ne pas demander à nouveau un mot de passe, vous pouvez l'exécuter une fois pour passer outre 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 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 l'avez fait NOPASSWD, mais vous ne poseriez pas cette question.

Gilles 'SO- arrête d'être méchant'
la source
La première solution a bien fonctionné pour moi, mais la deuxième ligne devrait l'être Match host localhost.
cduck
4

Vous pouvez configurer sudopour ne pas demander le mot de passe la prochaine fois:

À la source:

user    ALL=NOPASSWD:/bin/cat

Sur la cible:

user    ALL=NOPASSWD:/usr/bin/tee

Et faites sur votre machine:

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

Mais je recommande d'utiliser quelque chose comme une marionnette . C'est beaucoup mieux et plus facile résout votre problème avec la distribution des fichiers de configuration.

PS. Soit dit en passant, si vous souhaitez configurer le sudomot de passe de l'utilisateur, la chaîne avec [sudo] password for userapparaîtra dans le fichier cible.

se ruer
la source
+1 pour avoir suggéré une marionnette, mais votre solution semble incertaine. Je pourrais aussi bien autoriser la connexion en tant que root.
itsadok
2

Au lieu d'utiliser ssh, vous pouvez utiliser scp pour transférer le fichier entre les serveurs.

Connectez-vous au serveur cible:

Accédez au répertoire cible dans lequel vous souhaitez copier le fichier.

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

r - récursif p - Préserve les temps de modification, les temps d'accès et les modes du fichier d'origine

Mughil
la source
Cela suppose que je peux me connecter en tant que root, ce que je ne peux pas. Mise à jour de la question.
itsadok
2

Sans modifier la configuration ssh, vous pouvez créer deux tunnels ssh hôte-> serveur1 et serveur2-> hôte via la connexion ssh à serveur2. Connectez ces deux tunnels sur la machine hôte (même port). Et exécutez sudo sur server2 pour récupérer les données des tunnels connectés sur server1 et les enregistrer sur server2.

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 -"'

L'idée est: 1- de créer un tunnel local de votre machine vers la machine source sur le port 60000

ssh -L60000:${source}:22

1b- Créez un tunnel distant pour rejoindre votre machine

-R60000:localhost:60000

2- se connecter à la machine cible

-t ${target}

3- Exécuter tout en tant que root sur la machine cible pour l'écriture

'sudo bash -c "..."'

4- se connecter à la machine source via le tunnel. whoami et on localhost signifiant l'hôte local sur la machine $ {target}.

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

5- Empaqueter le (s) fichier (s) distant (s) et l'envoyer zippé vers stdout

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

6- Recevoir le paquet via stdout et extraire les fichiers en conséquence sur le répertoire / path / to / target

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

Remarque: vous pouvez recevoir jusqu'à 3 confirmations de clé ssh et 3 demandes de mot de passe. Mais les fichiers seront copiés.

Marco Aurelio
la source