java实现ssh登录linux并执行命令
1.方法一
使用ganymed-ssh2
<dependency>
<groupid>ch.ethz.ganymed</groupid>
<artifactid>ganymed-ssh2</artifactid>
<version>262</version>
</dependency>但是这个包最新版本是2014年之后,就没有更新了,linux 操作系统安装 open-ssh 8.5及更高级版本,就一直提示连接失败。就不再提供demo
2.方法二
jsch 暂时能使用,也是很久没有更新了,恐怕后续也会有无法匹配系统最新协议的问题。
<dependency>
<groupid>com.jcraft</groupid>
<artifactid>jsch</artifactid>
<version>0.1.55</version>
</dependency>public class remoteexecutecommand {
public static list<string> remoteexecute(session session, string command)
{
system.out.println("cmd:" + command);
list<string> resultlines = new arraylist<>();
channelexec channel = null;
try
{
channel = (channelexec) session.openchannel("exec");
channel.setcommand(command);
inputstream input = channel.getinputstream();
channel.connect(50000);
bufferedreader inputreader = new bufferedreader(new inputstreamreader(input));
string inputline = null;
while ((inputline = inputreader.readline()) != null)
{
system.out.println(inputline);
resultlines.add(inputline);
}
} catch (exception e)
{
e.printstacktrace();
} finally
{
system.out.println("最后关闭channel");
channel.disconnect();
}
return resultlines;
}
}
string usrname = "root";
string password = "******";
string remoteip = "*****";
string remoteip = "ifconfig";
jsch jsch = new jsch();
try
{
session session = jsch.getsession(usrname, remoteip);
session.setpassword(password);
session.setconfig("stricthostkeychecking", "no");
session.connect(100000);
session.settimeout(15000);
if (session.isconnected() == true)
{
system.out.println("host(" + remoteip + ") connected!");
}
channelexec channel = (channelexec) session.openchannel("exec");
remoteexecute(session, cmd);
3.方法三
使用sshd-core,一直在更新
<dependency>
<groupid>org.apache.sshd</groupid>
<artifactid>sshd-core</artifactid>
<version>2.8.0</version>
</dependency>//sshconnection 是自定义的,包含username,pwd,hostname的实体类
public static sshresponse runcommand(sshconnection conn, string cmd, long timeout)
throws ioexception {
sshclient client = sshclient.setupdefaultclient();
try {
// open the client
client.start();
// connect to the server
connectfuture cf = client.connect(conn.getusername(), conn.gethostname(), 22);
clientsession session = cf.verify().getsession();
session.addpasswordidentity(conn.getpassword());
session.auth().verify(timeunit.seconds.tomillis(timeout));
// create the exec and channel its output/error streams
channelexec ce = session.createexecchannel(cmd);
bytearrayoutputstream out = new bytearrayoutputstream();
bytearrayoutputstream err = new bytearrayoutputstream();
ce.setout(out);
ce.seterr(err);
// execute and wait
ce.open();
set<clientchannelevent> events =
ce.waitfor(enumset.of(clientchannelevent.closed), timeunit.seconds.tomillis(timeout));
session.close(false);
// check if timed out
if (events.contains(clientchannelevent.timeout)) {
throw new runtimeexception(conn.gethostname()+" 命令 "+cmd+ "执行超时 "+timeout);
}
return new sshresponse(out.tostring(), err.tostring(), ce.getexitstatus());
} finally {
client.stop();
}
}
public static void main(string[] args) throws ioexception {
string hostname = "*****";
string username = "root";
string pwd = "****";
sshconnection conn = new sshconnection(username,pwd,hostname);
// &&-表示前面命令执行成功在执行后面命令; ||表示前面命令执行失败了在执行后面命令; ";"表示一次执行两条命令
string cmd = "pwd && ps -ef|grep tomcat";
sshresponse response = runcommand(conn,cmd,15);
system.out.println("==error=>"+response.geterroutput());
system.out.println("===return==>"+response.getreturncode());
system.out.println("===stdout===>"+response.getstdoutput());
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论