Comment puis-je utiliser SSH pour copier un fichier sur un serveur distant sous un autre utilisateur?

J'ai un fichier sur mon ordinateur local Je souhaite copier sur un serveur distant à l'aide du programme SSH (pas scp, pas rsync, pas sftp), le fichier local est une clé privée SSL et je ne veux pas créer de copies temporaires sur Le serveur distant pendant le transfert.

L'utilisateur root sur le serveur distant ne peut pas se connecter via SSH pour des raisons de sécurité, mais mon utilisateur distant (avec le même nom d'utilisateur que mon utilisateur local) peut apporter des modifications à la suite de la commande sudo après une invite de mot de passe.

Problème: Comment puis-je copier le fichier local, me connecter via SSH, passer à l'utilisateur root avec une invite de mot de passe sudo , puis écrire le fichier dans le serveur distant dans un répertoire utilisateur root? Et de préférence tous dans une seule ligne de commande!

cat est ton ami

 cat key | ssh user@host sudo "cat > final_location" 

Mais cela nécessiterait une authentification sans mot de passe (peut-être surmonté à l'aide de ControlMaster ) et sans NOPASSWD mot de passe ( NOPASSWD ou authentification à l'aide de pam_ssh_agent_auth – je recommande de tenter celui-ci si vous connaissez le ssh-agent ).

Vous pouvez également autoriser temporairement les connexions de la racine (avec la clé publique – il existe une option PermitRootLogin without-password , ce qui fait exactement ce que vous voulez) et vous pouvez simplement utiliser la méthode scp .

Sinon, je ne pense pas qu'il existe une autre manière raisonnable, sauf la méthode Copier Coller.

Cela fera ce que vous voulez faire. Notez l'option -t passée à ssh. Cela attribue un TTY afin que l'invite du mot de passe sudo fonctionne correctement.

 TEXT=`cat ~/.ssh/id_dsa.pub` ssh user@host -t sudo "bash -c \"echo '$TEXT' > foo.pub\"" 

Cela fonctionne aussi longtemps qu'il n'y a pas de guillemets simples dans les données d'entrée. S'il existe, vous pouvez utiliser la base 64 pour encoder / décoder les données pendant la transmission.

 TEXT=`base64 ~/.ssh/id_dsa.pub` ssh user@host -t sudo "bash -c \"echo '$TEXT' | base64 -d > foo.pub\""