java中的ssh(在另一台机器上运行命令)
我想知道,作为java程序的一部分,是否有一种简单的方法可以做到这一点 我希望能够ssh到另一台机器上并在该机器上执行命令 一个简单的例子是: exec(“向世界问好”); (在mac电脑上)会有一个文本到语音引擎说hello world 有没有办法让java在另一台机器上运行这个方法 另外,假设上述情况是可能的,是否有一种方法可以同时ssh到多台机器中java中的ssh(在另一台机器上运行命令),java,ssh,Java,Ssh,我想知道,作为java程序的一部分,是否有一种简单的方法可以做到这一点 我希望能够ssh到另一台机器上并在该机器上执行命令 一个简单的例子是: exec(“向世界问好”); (在mac电脑上)会有一个文本到语音引擎说hello world 有没有办法让java在另一台机器上运行这个方法 另外,假设上述情况是可能的,是否有一种方法可以同时ssh到多台机器中 谢谢我建议您看看,它可以用来用java编写客户端和服务器 就在同一时间执行而言?除非您打算生成多个线程来处理远程计算机列表,否则不太可能。我建
谢谢我建议您看看,它可以用来用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
showsssh…[user@]hostname[command]
因此,我假设我们可以像平常一样编写命令。在这样的场景中,我如何确定何时需要引号?您已经帮了我很大的忙:)谢谢。@Steve命令必须使用引号才能使shell将其作为单个实体传递给ssh。为了防止shell自己扩展命令的某些部分。ssh somehost echo 1;ls将在远程上运行echo,在本地上运行ls,ssh somehost'echo 1;ls'
将在远程上同时运行echo和ls