2010-06-07 13 views
3

Dans mon projet, je dispose d'un fichier de classe Java, à l'intérieur dont j'ai une routine qui exécute le fichier script SFTP externe suivant:Connexion au service SFTP via Java processus d'exécution

#!/bin/sh 
echo "cd AV/OASIS" >> sftp 
echo "put $1 $2" >> sftp 
echo "get AV/OASIS/$2 $3$2" >> sftp 
echo "bye" >> sftp 
/usr/local/bin/sftp -b sftp [email protected] 
cat /dev/null > sftp 
exit 0 

Le code Java qui exécute le fichier script est comme ci-dessous:

String script = "full path of script"; 
Process p = Runtime.getRuntime().exec(script + " " + param1 + " " + param2 + " " + param3); 

Cependant, je ne sais pas pourquoi, mais le journal généré par le fichier de classe montre toujours l'erreur « vérification de la clé hôte Échec de la connexion fermée.. »

J'avais isolé cette ligne dans le script qui connecté à la machine à distance, et a couru sur la machine locale (où ce fichier de classe et le fichier de script sont stockés), et la commande exécutée avec succès

Je aurait exécuter manuellement la commande que le fichier de classe Java exécutera et il a également testé correct:

$ script.sh param1 param2 param3 

j'avais essayé de regarder le message d'erreur sur l'Internet, et apparemment, il semble avoir quelque chose à voir avec known_hosts. Serait-ce la raison, ou y a-t-il autre chose qui me manque?

Merci beaucoup!

Répondre

2

La raison pour laquelle la clé de l'hôte ne parvient pas à vérifier sur une machine et pas sur une autre est qu'une machine s'est connectée avant et une autre non. Si la machine n'a pas encore été connectée à l'hôte, elle n'aura pas la clé de l'hôte à vérifier. La clé d'hôte peut échouer à vérifier pour un certain nombre de raisons - pour des raisons malveillantes, comme si quelqu'un était en train de commettre une attaque man-in-the-middle, et pour des raisons non malveillantes comme le nom d'hôte de la machine distante.

La façon de le fixer est de supprimer la ligne de votre fichier known_hosts dans ~/.ssh

Sur une note de côté, vous ne savez que vous n'avez pas à débourser pour SFTP/SCP? JSch existe et vous permettra d'utiliser SFTP/SCP en Java. Vous devriez probablement faire cela parce que cela fonctionnera sur des plates-formes non-Unix comme Windows et vous aurez un peu plus de contrôle sur des choses comme known_hosts. C'est prettyeasy à utiliser.

+0

Salut Tom, merci pour votre réponse. "La raison pour laquelle la clé de l'hôte ne parvient pas à vérifier sur une machine et pas sur une autre est parce qu'une machine se sera connectée avant et une autre non." Je ne sais pas si j'ai bien compris, mais j'ai exécuté la commande sur la machine sur laquelle la classe Java est stockée, et le script pourrait s'exécuter. Puisque la classe Java exécute exactement la même commande sur la même machine, ne devrait-elle pas avoir les mêmes privilèges? En ce qui concerne votre note de côté, je voudrais vraiment pouvoir l'utiliser, mais mes mains sont liées en ce qui concerne les changements de code, donc je suis en train de faire avec l'existant. – ohseekay