Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的ssh(在另一台机器上运行命令)_Java_Ssh - Fatal编程技术网

java中的ssh(在另一台机器上运行命令)

java中的ssh(在另一台机器上运行命令),java,ssh,Java,Ssh,我想知道,作为java程序的一部分,是否有一种简单的方法可以做到这一点 我希望能够ssh到另一台机器上并在该机器上执行命令 一个简单的例子是: exec(“向世界问好”); (在mac电脑上)会有一个文本到语音引擎说hello world 有没有办法让java在另一台机器上运行这个方法 另外,假设上述情况是可能的,是否有一种方法可以同时ssh到多台机器中 谢谢我建议您看看,它可以用来用java编写客户端和服务器 就在同一时间执行而言?除非您打算生成多个线程来处理远程计算机列表,否则不太可能。我建

我想知道,作为java程序的一部分,是否有一种简单的方法可以做到这一点

我希望能够ssh到另一台机器上并在该机器上执行命令

一个简单的例子是: exec(“向世界问好”); (在mac电脑上)会有一个文本到语音引擎说hello world

有没有办法让java在另一台机器上运行这个方法

另外,假设上述情况是可能的,是否有一种方法可以同时ssh到多台机器中


谢谢

我建议您看看,它可以用来用java编写客户端和服务器


就在同一时间执行而言?除非您打算生成多个线程来处理远程计算机列表,否则不太可能。我建议,这也在报告中提到。在同一个站点中,您还可以找到其他可用于Java的库

这是使用Ganymed SSH-2通过SSH执行的
ls-r
命令的一个示例:

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;

[...]

public static ArrayList<String> lsViaSSH(String hostname, String username, String password, String dir) {
    ArrayList<String> ls = new ArrayList<String>();

    try
    {
        Connection conn = new Connection(hostname);

        conn.connect();

        boolean isAuthenticated = conn.authenticateWithPassword(username, password);

        if (isAuthenticated == false) {
            return null;
        }

        Session sess = conn.openSession();

        sess.execCommand("ls -r " + dir);

        InputStream stdout = new StreamGobbler(sess.getStdout());

        BufferedReader br = new BufferedReader(new InputStreamReader(stdout));

        while (true)
        {
            String line = br.readLine();
            if (line == null)
                break;
            ls.add(line);
        }

        sess.close();
        conn.close();
    }
    catch (IOException e)
    {
        return null;
    }

    if(StringUtils.isEmpty(ls.get(0)))
        return null;

    return ls;
}
导入ch.ethz.ssh2.Connection;
导入ch.ethz.ssh2.Session;
导入ch.ethz.ssh2.StreamGobbler;
[...]
公共静态ArrayList lsviash(字符串主机名、字符串用户名、字符串密码、字符串目录){
ArrayList ls=新的ArrayList();
尝试
{
连接连接=新连接(主机名);
连接();
布尔值isAuthenticated=conn.authenticateWithPassword(用户名、密码);
如果(isAuthenticated==false){
返回null;
}
会话sess=conn.openSession();
sess.execCommand(“ls-r”+dir);
InputStream stdout=new StreamGobbler(sess.getStdout());
BufferedReader br=新的BufferedReader(新的InputStreamReader(stdout));
while(true)
{
String line=br.readLine();
如果(行==null)
打破
ls.添加(行);
}
sess.close();
康涅狄格州关闭();
}
捕获(IOE异常)
{
返回null;
}
if(StringUtils.isEmpty(ls.get(0)))
返回null;
返回ls;
}

这不是通过SSH执行命令所需的唯一功能,但我希望它可以成为您的一个良好起点。

考虑到您所在的系统中有SSH命令,为了避免输入密码,最简单的方法是

runtime.exec("ssh remote_comp 'say hello world'");

我想现在可以用了。为什么需要单引号?因为它比双引号更容易,你必须转义(\”)为什么我们需要引号?
manssh
shows
ssh…[user@]hostname[command]
因此,我假设我们可以像平常一样编写命令。在这样的场景中,我如何确定何时需要引号?您已经帮了我很大的忙:)谢谢。@Steve命令必须使用引号才能使shell将其作为单个实体传递给ssh。为了防止shell自己扩展命令的某些部分。
ssh somehost echo 1;ls将在远程上运行echo,在本地上运行ls,
ssh somehost'echo 1;ls'
将在远程上同时运行echo和ls