从ProcessBuilder调用SCP

时间:2011-02-21 08:15:31

标签: java processbuilder

我在我的应用程序中使用ProcessBuilder,我需要调用SCP(上传文件),但我有权告诉你如何提供密码。怎么解决这个问题?

String[] commands=new String[]{"bash","-c","scp example.tar.gz username@192.168.0.131 /root/new "};
ProcessBuilder pb = new ProcessBuilder(commands);
pb.redirectErrorStream(true);
Process process = pb.start();

在哪里为SCP添加密码?

3 个答案:

答案 0 :(得分:1)

JSch库更适合这种情况。看看他们example的scping文件。

答案 1 :(得分:1)

实现此目标的最佳方法是使用密钥对而不是密码身份验证。要生成密钥对,请以用户名登录远程计算机。在提示符下键入:

ssh-keygen -t rsa

这将生成〜/ .ssh / id_rsa私钥和〜/ .ssh / id_rsa.pub公钥。将〜/ .ssh / id_rsa.pub复制到本地计算机,然后使用以下命令行:

mkdir ~/.ssh && chmod 700 ~/.ssh && touch ~/.ssh/authorized_keys2 && chmod 600 ~/.ssh/authorized_keys2
cat id_rsa.pub >> ~/.ssh/authorized_keys2

(注意:如果〜/ .ssh已经存在,mkdir可能会失败 - 在这种情况下只需继续使用第二个命令。)

答案 2 :(得分:1)

另一个选择是使用expect脚本。创建包含以下内容的文件,并将其另存为/ some / path / scp_expect。该文件应由将执行Java代码的用户拥有。

#!/usr/bin/expect -f

spawn scp example.tar.gz username@192.168.0.131 /root/new
expect "assword:"
send -- "password\r"
expect eof

适当更改密码。使文件可执行:

chmod 700 /some/path/scp_expect

现在从Java代码调用expect脚本:

String[] commands = new String[]{"bash", "-c", "/some/path/scp_expect"};

如果它不起作用,请将"assword:"更改为您提升密码时显示的字符串。

此选项的缺点是您的密码在脚本中是明确的,因此请务必考虑执行此操作时的安全隐患。我更喜欢自己使用密钥验证方法。