Je voudrais copier squid.conf
d'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
600
autorisé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, -t
sudo 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.
ssh
sudo
file-transfer
itsadok
la source
la source
Réponses:
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
Match
clause danssshd_config
: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/config
comme ceci:Si vous insistez pour utiliser
sudo
, je pense que vous aurez besoin de commandes distinctes, commesudo
insiste 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.)
¹ sauf si vous l'avez fait
NOPASSWD
, mais vous ne poseriez pas cette question.la source
Match host localhost
.Vous pouvez configurer
sudo
pour ne pas demander le mot de passe la prochaine fois:À la source:
Sur la cible:
Et faites sur votre machine:
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
sudo
mot de passe de l'utilisateur, la chaîne avec[sudo] password for user
apparaîtra dans le fichier cible.la source
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.
r - récursif p - Préserve les temps de modification, les temps d'accès et les modes du fichier d'origine
la source
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.
L'idée est: 1- de créer un tunnel local de votre machine vers la machine source sur le port 60000
1b- Créez un tunnel distant pour rejoindre votre machine
2- se connecter à la machine cible
3- Exécuter tout en tant que root sur la machine cible pour l'écriture
4- se connecter à la machine source via le tunnel. whoami et on localhost signifiant l'hôte local sur la machine $ {target}.
5- Empaqueter le (s) fichier (s) distant (s) et l'envoyer zippé vers stdout
6- Recevoir le paquet via stdout et extraire les fichiers en conséquence sur le répertoire / path / to / target
Remarque: vous pouvez recevoir jusqu'à 3 confirmations de clé ssh et 3 demandes de mot de passe. Mais les fichiers seront copiés.
la source