java - 在 cli 上和通过 Java 执行 ssh 时的不同行为

标签 java ssh

我正在尝试通过 ssh 将文件从远程服务器复制到客户端。在 cli 上执行我的命令时,文件被复制到正确的位置。但是,如果我通过 Java 执行完全相同的命令,该文件将被复制到远程计算机目录而不是客户端目录。

这是我正在使用的命令(我正在使用 key ,无需输入密码):

ssh -i /home/user/.ssh/id_rsa -C -p 2201 test@localhost 'cat /opt/test/file.txt' > /home/user/file.txt

这是代码,非常简单:

Process p;
p = Runtime.getRuntime().exec("ssh -i /home/user/.ssh/id_rsa -C -p 2201 test@localhost 'cat /opt/test/file.txt' > /home/user/file.txt");

知道为什么文件被复制到错误的机器目录以及如何在使用 java 执行命令时将其复制到客户端目录吗?

最佳答案

不要在命令中使用>。通过从结果 Process 对象中检索的 InputStream 读取数据。与问题的早期版本中提到的 ~ 一样,> 是 shell 特定功能,并且 shell 不涉及 exec().

Process p = Runtime.getRuntime().exec("your command");
p.waitFor();
InputStream commandOutput = p.getInputStream();

从此流中读取并将其写入文件。

替代方案:

尝试

p = Runtime.getRuntime().exec("sh -c ssh -i /home/user/.ssh/id_rsa -C -p 2201 test@localhost 'cat /opt/test/file.txt' > /home/user/file.txt");

关于java - 在 cli 上和通过 Java 执行 ssh 时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57390556/

相关文章:

java - 如何检查 MySQL 表是否有来自 Java/Android 的下一行

java - 添加 Eclipse 插件项目的 Maven 依赖项

c# - 通过另一个 SSH 连接进行 SSH

ssh - Amazon EC2 AMI 根 Authorized_keys

shell - 我可以 ssh 某个地方,运行一些命令,然后给自己一个提示吗?

linux - 如何使用 bash 别名作为命令行参数

java - 如何在 Maven 中指定某些后缀文件之间的依赖规则?

java - 如何从 XML 中提取子元素到 Java 中的字符串?

java - 在jaxb中生成list标签和object标签

git - 为 tortoiseGit 更改 GIT_SSH 的值