我知道有AntBuilder
和JSch
等,但我想做类似的事情 - 没有任何依赖:
def sshArray = ["ssh root@11.11.11.11 -p 111 '/etc/init.d/tomcat7 stop'", ...]
def env = System.getenv().collect { k,v -> "$k=$v" }
sshArray.each {
println "Executing: " + it
def process = (it).execute(env, null)
def writer = new PrintWriter(new BufferedOutputStream(process.out))
writer.println("mypassword")
writer.close()
process.waitFor()
process.consumeProcessOutput(System.out, System.err)
}
但遗憾的是,这不起作用,因为我得到的输出是:
Executing: ssh root@11.11.11.11 -p 111 '/etc/init.d/tomcat7 stop'
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
...
此外,如果我注释掉这些行,我会得到相同的输出:
def writer = new PrintWriter(new BufferedOutputStream(process.out))
writer.println("mypassword")
writer.close()
为什么我3次获得“权限被拒绝”?如何为ssh进程提供密码? 这可能吗?
答案 0 :(得分:4)
像ssh这样的程序通常不会从标准输入中读取密码;他们直接从终端阅读。 Java和groovy不提供任何控制终端的方法。
这不是ssh或Java的问题:密码是由一个人输入的。如果您的程序需要使用ssh,则使用它的正确方法是使用基于密钥的身份验证。
答案 1 :(得分:0)
很抱歉,但我认为你正在做的是启动一个进程,然后消耗它的输出(process.out)。您应该将输入提供给流程。它应该是您正在处理的 InputStream 。