Comment effectuer un scp entre 2 boîtes Unix distantes en utilisant Jsch?

J’écris un code Java en utilisant Jsch dans lequel je dois effectuer un scp entre 2 boîtiers UNIX distants.

J’ai essayé d’exécuter la commande scp de la même manière que pour exécuter une commande normale à partir de mon code Java, comme ceci:

JSch jsch=new JSch(); Session session=jsch.getSession("user", "host", 22); UserInfo ui=new MyUserInfo(); session.setUserInfo(ui); session.setPassword("pwd"); session.connect(); Channel channel=session.openChannel("exec"); ((ChannelExec)channel).setCommand("scp [email protected]:/home/user/demo.csv /home/user/demo.csv"); channel.setInputStream(null); ((ChannelExec)channel).setErrStream(System.err); InputStream in=channel.getInputStream(); channel.connect(); //Printing operations channel.disconnect(); session.disconnect(); 

Au lieu de demander le mot de passe pour [email protected] comme je l’espérais. Je n’ai que des erreurs:

 Permission denied, please try again. Permission denied, please try again. Permission denied (publickey,gssapi-with-mic,password). exit-status: 1 

En exécutant directement la commande sur la boîte UNIX, j’ai trouvé ceci:

scp demande un mot de passe pour se connecter à la machine distante. Cependant, en utilisant ce code, il ne demande aucun mot de passe. Donc, il essaie d’effectuer scp sans le mot de passe et d’essayer trois fois (indicateur NumberoOFAttempts) et donne les messages d’erreur …

Je veux savoir comment faire scp atleast prompt pour entrer quelque chose au lieu de ne pas simplement prendre le mot de passe … J’ai utilisé l’implémentation par défaut de la classe MyUserInfo donnée dans les exemples jsch pour mon code …

Ou

Est-il possible de fournir le mot de passe avec la commande scp? J’essaie d’éviter d’utiliser des combinaisons de clés privées / publiques autant que possible.

EDIT: Depuis le post de Paulo .. Maintenant, j’ai ajouté channel.setPty (true) pour obtenir un pseudo-terminal pour la commande et il me demande d’entrer un mot de passe plutôt que d’échouer automatiquement.

Comment devrais-je spécifier le mot de passe maintenant … J’ai essayé de le taper dans la console mais il n’accepte pas et attend toujours la saisie de l’utilisateur …. J’ai essayé de le configurer en utilisant channel.setInputStream (pwdbytes); mais il attend toujours à la commande et ne prend pas l’entrée.

Merci pour toute aide à ce sujet …

La commande scp sur votre première boîte Unix tente de lire le mot de passe depuis la console / le terminal. Mais cela ne fonctionnera que s’il ya un terminal associé au processus – et ce n’est pas le cas, par défaut.

Le moyen le plus simple de résoudre ce problème serait d’utiliser channel.setPty(true) avant de connecter le canal, puis de fournir le mot de passe via les stream d’entrée / sortie.