Script shell de la machine locale pour exécuter la commande sur la machine distante, puis continuer sur la machine locale

10

Le problème est le suivant: je veux copier des fichiers depuis une machine distante.

Je cherche un moyen d'écrire un script shell qui se connecterait à la machine distante, obtiendrait l'emplacement du fichier stocké, une fois que je me déconnecte de l'emplacement du serveur distant et utilise scp depuis la machine locale avec l'emplacement obtenu pour copiez le fichier.

Plus précisément, je veux savoir comment à partir d'un script, je me connecterais à une machine distante, ferais des tâches sur cette machine. Déconnectez-vous et poursuivez l'exécution localement.

gnsr
la source

Réponses:

15

Solution 1:

remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path

Cela fonctionne en se connectant à la machine distante, en exécutant certaines commandes et en copiant la sortie dans une variable sur votre machine locale. Par exemple, en faisant écho du chemin du fichier à distance, en le capturant localement.

Solution 2:

ssh user@host "determine_path; cat filename" >local_filename

Cela fonctionne en recherchant et en sortant le fichier directement à distance, et en le redirigeant vers un fichier localement. Cela saute scp. Cela nécessite que les étapes avant "cat" n'aient pas de sortie (que vous pouvez résoudre avec &> / dev / null).

Mark Griffin
la source
1
+1 pour montrer comment résoudre tout le problème avec une seule connexion, au lieu de ssh + scp séparés.
Peter Cordes
Toutes les réponses sont utiles, mais celle-ci traite plus spécifiquement de mon problème
gnsr
20

Vous pouvez écrire un script au format suivant:

command1
command2
...
ssh user@machine command3
...
command4
command5

Vous devez configurer les clés SSH pour qu'elles soient command3exécutées sans vous demander de mot de passe.

Khaled
la source
2
il convient de noter que ce sera par synchrone. Pendant qu'il ssh user@remote command3est en cours d'exécution, command4ne peut pas commencer
aaaaa dit réintégrer Monica
3
@aaaaaa sauf si vous l'avez faitssh user@machine command3 &
Isaac
3
@Isaac oui, mon point est que l'un ou l'autre peut être un comportement souhaitable, mais ce devrait être une décision
consciencieuse
2

Je suppose que vous avez déjà une idée de la façon dont vous allez identifier le fichier que vous souhaitez copier et que vous êtes en mesure ou avez déjà écrit un script ou un ensemble de commandes qui s'exécutera sur la machine distante qui effectue cette identification .

En outre, je suppose également que ces commandes impriment sur la sortie standard le chemin d'accès complet au fichier, ou le chemin d'accès relatif au fichier, par rapport au répertoire personnel de l'utilisateur SSH utilisé pour la copie. Dans mon exemple, le nom du script est "getfilepath.sh", bien qu'il ne doive pas être un script shell, il peut s'agir d'un autre exécutable ou même d'une série de commandes.

# Script to be executed on local machine.

# put any leading local commands here.

FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .

# put any trailing local commands here.

Dans le code ci-dessus, la notation "$ ()" est un moyen de capturer la sortie standard d'une commande en tant que variable shell. C'est assez standard, mais si vous utilisez un shell qui ne le comprend pas, vous pouvez à la place entourer la commande de "back-ticks", qui sont les marques d'accent à gauche de la touche 1 sur la plupart des claviers américains.

Jeremy Impson
la source
0

il est peut-être possible de déclencher une tâche planifiée sur la machine distante qui fait tout le travail.

Cela vous empêcherait d'être connecté à la machine distante pendant que vous recherchez l'emplacement des fichiers que vous souhaitez copier.

Je fais ça:

la ligne de commande déclenche une tâche planifiée qui exécute un batchscript dans mon cas.

schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"

Meilleures salutations

Denyo
la source