Java 从ProcessBuilder调用SCP

Java 从ProcessBuilder调用SCP,java,processbuilder,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

我在我的应用程序中使用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添加密码?

该库更适合于此。看看他们的scping文件。该库更适合于此。看看他们的scping文件。

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

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可能会失败-在这种情况下只需执行第二个命令即可。)

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

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可能会失败-在这种情况下只需使用第二个命令即可。)

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

#/usr/bin/expect-f
生成scp example.tar.gzusername@192.168.0.131/root/new
预期“assword:”
发送--“密码\r\n”
预期eof
适当地更改密码。使文件可执行:

chmod 700/some/path/scp\u expect
现在从Java代码中调用expect脚本:

String[]commands=newstring[]{“bash”、“-c”、“/some/path/scp_expect”};
如果不起作用,请将
“assword:
更改为一个字符串,该字符串在升级密码时显示


这个选项的缺点是你的密码在脚本中是透明的,所以确保你考虑了这样做的安全含义。我更喜欢自己使用密钥身份验证方法。

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

#/usr/bin/expect-f
生成scp example.tar.gzusername@192.168.0.131/root/new
预期“assword:”
发送--“密码\r\n”
预期eof
适当地更改密码。使文件可执行:

chmod 700/some/path/scp\u expect
现在从Java代码中调用expect脚本:

String[]commands=newstring[]{“bash”、“-c”、“/some/path/scp_expect”};
如果不起作用,请将
“assword:
更改为一个字符串,该字符串在升级密码时显示

这个选项的缺点是你的密码在脚本中是透明的,所以确保你考虑了这样做的安全含义。我更喜欢自己使用密钥身份验证方法