120 votes

scp vers le serveur distant avec sudo

J'ai un fichier sur le serveur A (qui est derrière un NAT et n'est donc pas directement adressable). Le fichier doit être copié sur le serveur B dans un répertoire réservé à root. J'ai un compte sur le serveur B avec des privilèges sudo. Quelle est la syntaxe de la commande scp ?

0 votes

J'ai répondu sur autre affichage comment vous pouvez personnaliser scp pour qu'il fasse le sudo pour vous directement. C'est similaire à ce que fait WinSCP.

102voto

objectified Points 424

Tout d'abord, vous devez copier le fichier à un endroit où vous avez un accès en écriture sans sudo,

scp yourfile serverb:

Ensuite, déplacez le fichier en utilisant sudo

ssh serverb sudo mv yourfile /path/to/the/destination

Si vous n'avez pas d'endroit accessible en écriture, créez un répertoire temporaire avec des droits d'écriture pour votre utilisateur.

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

11 votes

/tmp est un bon endroit pour écrire des fichiers temporaires auxquels (généralement) tous les utilisateurs ont accès.

4 votes

@Doug : Notez que /tmp peut être dans la RAM ou dans le point de montage /, et n'est pas nécessairement assez grand pour héberger de gros fichiers.

9 votes

Tout ce que vous essayez d'accomplir, chmod 777 est généralement la mauvaise façon de procéder. Pensez à ce qui pourrait se passer si quelqu'un d'autre était connecté et savait que vous êtes sur le point d'exécuter ce code.

101voto

MasterCheffinator Points 1001

Avec SCP, vous devez le faire en deux étapes, cependant, vous pouvez le faire en une seule avec rsync comme suit :

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

Note : Cela nécessite NOPASSWD configuration sudo. Si vous devez entrer le mot de passe pour sudo, alors la méthode en deux étapes est nécessaire.

Pour copier un répertoire, vous devez ajouter -r paramètre. Et -v pour une sortie verbeuse.


Pour utiliser la méthode ci-dessus avec les informations d'identification, vous devez les ajouter dans votre fichier ~/.ssh/config fichier, par exemple

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

7 votes

C'est de loin la façon la plus simple de procéder.

0 votes

Erreur sudo: sorry, you must have a tty to run sudo fixé par -e "ssh -tt" .

5 votes

@mj41 Avec -e "ssh -tt" J'obtiens protocol version mismatch -- is your shell clean? . Des conseils sur la façon de résoudre ce problème ?

21voto

blueyed Points 1171

Vous pouvez utiliser ssh et tar pour contourner ce problème :

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

Cela met d'abord à jour votre horodatage sudo (en demandant un mot de passe si nécessaire, ce qui nécessite un tty ( ssh -t )), et utilise ensuite sudo pour créer une archive à distance et l'extraire localement.

"tar" sur RedHat 5 exige que les options "--preserve" viennent après la commande "xpsf -".

0 votes

Juste une remarque : si vous obtenez tar: Invalid replacement string , supprimant -s dans le semble pour le corriger (on ne sait pas trop ce dont vous avez besoin pour le s de toute façon). Merci beaucoup, c'est génial.

0 votes

Pour ce faire, il faudrait tty_tickets d'être désactivé, n'est-ce pas ?

0 votes

@JacobBudin oui.

6voto

DaniloNC Points 151

Vous pouvez utiliser sftp avec la commande sudo, par exemple :

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

1 votes

Cette méthode et la méthode rsync sont probablement les moyens les plus directs de le faire en une seule étape. Il est regrettable que la tâche scp dans ant ne le supporte pas. Vous pouvez la configurer pour qu'elle utilise sftp, mais vous ne pouvez pas modifier le sous-programme remote. Notez que le sous-programme sera différent selon le type de serveur (solaris peut être différent).

1 votes

Je ne vois pas où, dans cette solution, vous spécifiez le fichier local à transférer sur le serveur.

2voto

Jan Tojnar Points 162

Si vous devez taper le mot de passe pour sudo à chaque fois, vous pouvez le sauvegarder dans un fichier :

echo "Enter password: "; read -s password; echo $password > password_file

et l'envoyer avec le fichier source.

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

Vous pouvez utiliser tee 代わりに sponge si vous n'avez pas moreutils.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X