================前情提要================
為了實(shí)現(xiàn)DHCP
服務(wù)器的IP
存儲、回收和查詢機(jī)制,我們需要將服務(wù)器中LXD
容器的網(wǎng)卡IP
查詢出來,并且存儲到服務(wù)器中的Mysql
中。所以,下面介紹如何通過Java
遠(yuǎn)程連接Linux
服務(wù)器以及操作多條Shell
命令。
一、JAVA連接至Linux服務(wù)器
創(chuàng)建Maven
項(xiàng)目,導(dǎo)入依賴jsch
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
實(shí)現(xiàn)遠(yuǎn)程連接,往后我們只需要調(diào)用如下兩個(gè)方法即獲取連接和關(guān)閉連接。連接的原理即:創(chuàng)建session
對話,使用ip,port,userName,password
進(jìn)行校驗(yàn),函數(shù)返回session
對話
//jsch創(chuàng)建連接
public Session getJSchSession(String ip , int port, String userName, String password){
JSch jSch = new JSch();
Session session = null;
try {
//創(chuàng)建連接
session = jSch.getSession(userName,ip,port);
session.setPassword(password);
//是否使用密鑰登錄,一般默認(rèn)為no
session.setConfig("StrictHostKeyChecking", "no");
//啟用連接
session.connect();
System.out.println("==============服務(wù)器連接成功==============");
}catch (Exception e){
e.printStackTrace();
System.out.println("==============服務(wù)器連接失敗==============");
}
return session;
}
//jsch關(guān)閉連接
public void closeJSchSession(Session session){
if (session != null) {
try {
session.disconnect();
System.out.println("===========服務(wù)器連接關(guān)閉成功===========");
}catch (Exception e){
e.printStackTrace();
System.out.println("===========服務(wù)器連接關(guān)閉失敗===========");
}
}
}
二、JAVA操作多條Shell命令
網(wǎng)上找了很多資料,發(fā)現(xiàn)大家都是只執(zhí)行一條命令,這在實(shí)際使用中幾乎不可能,我們一般都需要傳入Shell
命令集合進(jìn)行操作,并且如果有返回值要進(jìn)行接受。根據(jù)網(wǎng)上的資料,我進(jìn)行了自己的代碼編寫。
操作原理
- 使用上述連接中實(shí)現(xiàn)的
session
對話創(chuàng)建Channel
執(zhí)行通道 - 命令集合參數(shù)傳遞給通道,連接通道,通道執(zhí)行命令,使用
IO
流讀命令結(jié)果 - 循環(huán)讀取結(jié)果并且將返回值拼接為字符串,若沒有返回值則標(biāo)注
- 將拼接好的字符串保存到集合,并且返回
//用來執(zhí)行命令
//Session表示傳遞連接對話,commands表示傳遞命令集合
public List<String> getCmdResult(Session session , List<String> commands){
//用來存放命令的返回值
List<String> cmdResult = new ArrayList<>();
for (String command : commands) {
Channel channel = null;
try {
//創(chuàng)建執(zhí)行通道
channel = session.openChannel("exec");
//設(shè)置命令
((ChannelExec) channel).setCommand(command);
//連接通道
channel.connect();
//讀取通道的輸出
InputStream in = channel.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
//存放命令的執(zhí)行結(jié)果,如果結(jié)果有很多行,則每次line的值不同
String line;
//lines用來拼接line結(jié)果
StringBuffer lines = new StringBuffer();
while ((line = reader.readLine()) != null) {
//去除頭尾的空格
line.trim();
lines = lines.append(line);
}
//如果命令執(zhí)行沒有返回值,則直接輸出沒有返回值
if (String.valueOf(lines).equals("")){
cmdResult.add("命令["+command+"]執(zhí)行成功,但沒有返回值");
}else {
//否則將每行返回直接存入到list中
cmdResult.add(String.valueOf(lines));
}
reader.close();
channel.disconnect();
} catch (JSchException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return cmdResult;
}
三、使用
簡單的介紹一下調(diào)用過程【這里特別要注意:cd
命令是不生效的。所謂不生效就是你不能先切換到某個(gè)目錄,然后直接執(zhí)行創(chuàng)建文件夾,創(chuàng)建文件夾的路徑依然要寫絕對路徑】文章來源:http://www.zghlxwxcb.cn/news/detail-643767.html
public static void main(String[] args) {
String ip = "服務(wù)器ip地址";
int port = 22;
String userName = "服務(wù)器賬號";
String password = "服務(wù)器密碼";
List<String> cmds = new ArrayList<>();
cmds.add("ls -l");
cmds.add("mkdir MyDir");
GetLinuxConnection GLC = new GetLinuxConnection();
Session session = GLC.getJSchSession(ip,port,userName,password);
ExecLinuxCommands ELC = new ExecLinuxCommands();
List<String> result = ELC.getCmdResult(session, cmds);
result.forEach((x)-> System.out.println(x));
GLC.closeJSchSession(session);
}
執(zhí)行結(jié)果如下文章來源地址http://www.zghlxwxcb.cn/news/detail-643767.html
到了這里,關(guān)于Java利用JSCH庫遠(yuǎn)程連接Linux服務(wù)器以及操作多條Shell命令的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!