scp au serveur distant avec sudo

65

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

Neil
la source
J'ai fermé la question plus ancienne en tant que duplicata de celle-ci, car le demandeur n'a jamais repris possession de la question.
Quack Quackote
J'ai répondu sur un autre message comment vous pouvez personnaliser scp faire le sudo pour vous directement. Ceci est similaire à ce que fait WinSCP.
YoYo

Réponses:

58

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

scp yourfile serverb:

Puis déplacez le fichier en utilisant sudo

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

Si vous n’avez pas d’emplacement inscriptible, créez un répertoire temporaire avec le droit 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
Johan
la source
7
/ tmp est un bon endroit pour écrire des fichiers temporaires auxquels (généralement) tous les utilisateurs ont accès.
Doug Harris
3
@Doug: Notez que / tmp peut être en RAM ou en / point de montage, et pas nécessairement assez grand pour héberger de gros fichiers.
Ravachol
2
Quoi que vous essayiez d'accomplir, chmod 777c'est généralement la mauvaise façon de le faire. Pensez à ce qui pourrait arriver si quelqu'un d'autre était connecté et savait que vous étiez sur le point d'exécuter ce code.
triplee
1
ssh sudone fonctionne pas pour moi - se plaint "pas de tty présent et pas de programme askpass spécifié"?
Ross Presser
1
@RossPresser désolé pour la réponse tardive, mais vous devez soit configurer sudo sans mot de passe, serverbsoit vous devez le faire ssh serverbséparément, puis vous devez vous sudo ...connecter une fois que vous vous êtes connecté.
Johan
49

Avec SCP, vous devez procéder en deux étapes. Cependant, vous pouvez le faire en une opération avec rsync, comme suit:

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

Remarque: Cela nécessite une NOPASSWDconfiguration sudo. Si vous devez entrer le mot de passe pour sudo, la procédure en deux étapes est nécessaire.

Pour copier le répertoire, vous devez ajouter un -rparamètre. Et -vpour une sortie verbeuse.


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

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem
Master Cheffinateur
la source
5
C'est de loin le moyen le plus simple de le faire.
Matt White
Erreur sudo: sorry, you must have a tty to run sudocorrigée par -e "ssh -tt".
mj41
@ mj41 Avec -e "ssh -tt", je reçois protocol version mismatch -- is your shell clean?. Des astuces sur comment résoudre ce problème?
hache
19

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

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

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

blueyed
la source
Juste une remarque: si vous obtenez tar: Invalid replacement string, supprimer -sle semble résoudre le problème (vous ne savez pas vraiment ce dont vous avez besoin s). Merci beaucoup; C'est génial.
RecursivelyIronic
Cela nécessiterait tty_ticketsd'être désactivé, correct?
Jacob Budin
@ JacobBudin oui.
blueyed
4

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

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST
DaniloNC
la source
Ceci et les méthodes rsync sont probablement la manière la plus directe de le faire en une étape. Il est regrettable que la tâche scp de ant ne la prenne pas en charge. Vous pouvez le configurer pour utiliser sftp, mais vous ne pouvez pas modifier le sous-programme distant. Notez que le sous-programme sera différent selon le type de serveur (solaris peut être différent).
YoYo
0

Si vous devez saisir un mot de passe pour sudo à chaque fois, vous pouvez l'enregistrer dans un fichier:

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

puis envoyez-le avec le fichier source.

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

Vous pouvez utiliser teeau lieu de spongesi vous n'avez pas de morilles.

Jan Tojnar
la source
0

Tout d’abord, vous devez copier le fichier à un emplacement où vous avez un accès en écriture sans sudo. Vous pouvez effectuer les deux étapes suivantes.

Étape 1: scp filename newserver

Étape 2: ssh newserver sudo mv filename /path/to/the/destination

pour plus d'informations, consultez le tutoriel scp

Mike Tyson
la source
-1
current server $ sudo scp username@server:source/path/filename /tmp/

Il copiera un fichier spécifique de la source vers / tmp / dans le serveur actuel

Kumar
la source
Il exécutera le sudo localement, ne vous donnant aucun privilège élevé à distance.
YoYo
Cela ne fonctionnera tout simplement pas, comme le dit @Yoyo.
Mani
scp ne se connectera probablement pas car il lit la clé de la racine
Pierre-Olivier Vares