编辑:我认为问题在于 ssh 连接正在创建仍然打开的后台连接(参见https://superuser.com/a/617670)。我会使用该标志运行 ssh -f
,但我需要确保安装了 java。有没有一种简单的方法可以强制从脚本本身关闭连接?
注意,远程计算机运行的是 Ubuntu 14.04。
我正在使用用 Clojure 编写的工具来调用 Java,Runtime.getRuntime().exec()
如下所示:
Runtime.getRuntime().exec("ssh", "-o", "StrictHostKeyChecking=no",
"user@host", "sudo su -");`
然后通过从中创建的 java.lang.Process,我获取标准输入并将文件的内容写入其中,基本上.flush
是.close
写入器。一切正常;其中有很多,所有这些都没有任何问题地发生,但我在开始时有一个运行如下所示的脚本:
if [ ! $(which java) ]; then
apt-get update -q
apt-get install -y openjdk-7-jre
fi
当我手动 ssh 进入节点时,我看到 Java 已成功安装并且进程退出。但由于某种原因,这并没有传达给调用代码(即上面的 java 进程)。
我之前提到过,这样的有很多,而且没有一个挂掉。我有可以执行各种操作的脚本,但也有其他脚本可以执行与上述操作几乎相同的操作,唯一的区别是它们安装不同的软件(例如 git),并且它们不会挂起。
所以我尝试手动执行此操作;即,进入 shell 并输入:
ssh -o StrictHostKeyChecking=no -o ubuntu@somehost sudo su -
然后将脚本粘贴到那里,一切都很好。
不确定是什么原因造成的。