javash,java實訓報告總結

本文目錄一覽:

請教個java調用shell命令操作

近日項目中有這樣一個需求:系統中的外幣資金調度完成以後,要將調度信息生成一個Txt文件,然後將這個Txt文件發送到另外一個系統(Kondor)中。生成文件自然使用OutputStreamWirter了,發送文件有兩種方式,一種是用寫個一個類似於FTP功能的程序,另外一種就是使用Java來調用Shell,在Shell中完成文件的發送操作。我們選擇後一種,即當完成外幣資金的調度工作後,用Java的OutputStreamWriter來生成一個Txt文件,然後用Java來調用Shell腳本,在Shell腳本中完成FTP文件到Kondor系統的工作。

以下為Java程序JavaShellUtil.java:import java.io.BufferedReader;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.Date;

public class JavaShellUtil {

//基本路徑

private static final String basePath = “/tmp/”;

//記錄Shell執行狀況的日誌文件的位置(絕對路徑)

private static final String executeShellLogFile = basePath + “executeShell.log”;

//發送文件到Kondor系統的Shell的文件名(絕對路徑)

private static final String sendKondorShellName = basePath + “sendKondorFile.sh”;

public int executeShell(String shellCommand) throws IOException {

int success = 0;

StringBuffer stringBuffer = new StringBuffer();

BufferedReader bufferedReader = null;

//格式化日期時間,記錄日誌時使用

DateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:SS “);

try {

stringBuffer.append(dateFormat.format(new Date())).append(“準備執行Shell命令 “).append(shellCommand).append(” \r\n”);

Process pid = null;

String[] cmd = {“/bin/sh”, “-c”, shellCommand};

//執行Shell命令

pid = Runtime.getRuntime().exec(cmd);

if (pid != null) {

stringBuffer.append(“進程號:”).append(pid.toString()).append(“\r\n”);

//bufferedReader用於讀取Shell的輸出內容 bufferedReader = new BufferedReader(new InputStreamReader(pid.getInputStream()), 1024);

pid.waitFor();

} else {

stringBuffer.append(“沒有pid\r\n”);

}

stringBuffer.append(dateFormat.format(new Date())).append(“Shell命令執行完畢\r\n執行結果為:\r\n”);

String line = null;

//讀取Shell的輸出內容,並添加到stringBuffer中

while (bufferedReader != null

(line = bufferedReader.readLine()) != null) {

stringBuffer.append(line).append(“\r\n”);

}

} catch (Exception ioe) {

stringBuffer.append(“執行Shell命令時發生異常:\r\n”).append(ioe.getMessage()).append(“\r\n”);

} finally {

if (bufferedReader != null) {

OutputStreamWriter outputStreamWriter = null;

try {

bufferedReader.close();

//將Shell的執行情況輸出到日誌文件中

OutputStream outputStream = new FileOutputStream(executeShellLogFile);

outputStreamWriter = new OutputStreamWriter(outputStream, “UTF-8”);

outputStreamWriter.write(stringBuffer.toString());

} catch (Exception e) {

e.printStackTrace();

} finally {

outputStreamWriter.close();

}

}

success = 1;

}

return success;

}

}

以下是Shell腳本sendKondorFile.sh,該Shell腳本的作用是FTP文件到指定的位置:

#!/bin/sh

#日誌文件的位置

logFile=”/opt/fms2_kondor/sendKondorFile.log”

#Kondor系統的IP地址,會將生成的文件發送到這個地址

kondor_ip=192.168.1.200

#FTP用戶名

ftp_username=kondor

#FTP密碼

ftp_password=kondor

#要發送的文件的絕對路徑

filePath=””

#要發送的文件的文件名

fileName=””

#如果Shell命令帶有參數,則將第一個參數賦給filePath,將第二個參數賦給fileName

if [ $# -ge “1” ]

then

filePath=$1

else

echo “沒有文件路徑”

echo “沒有文件路徑\n”

$logFile

return

fi

if [ $# -ge “2” ]

then

fileName=$2

else

echo “沒有文件名”

echo “沒有文件名\n”

$logFile

return

fi

echo “要發送的文件是 ${filePath}/${fileName}”

cd ${filePath}

ls $fileName

if (test $? -eq 0)

then

echo “準備發送文件:${filePath}/${fileName}”

else

echo “文件 ${filePath}/${fileName} 不存在”

echo “文件 ${filePath}/${fileName} 不存在\n”

$logFile

return

fi

ftp -n ${kondor_ip}

_end

user ${ftp_username} ${ftp_password}

asc

prompt

put $fileName

bye

_end

echo “`date +%Y-%m-%d’ ‘%H:%M:%S` 發送了文件 ${filePath}/${fileName}”

echo “`date +%Y-%m-%d’ ‘%H:%M:%S` 發送了文件 ${filePath}/${fileName}\n”

$logFile

調用方法為:

JavaShellUtil javaShellUtil = new JavaShellUtil();

//參數為要執行的Shell命令,即通過調用Shell腳本sendKondorFile.sh將/temp目錄下的tmp.pdf文件發送到192.168.1.200上

int success = javaShellUtil.executeShell(“sh /tmp/sendKondorFile.sh /temp tmp.pdf”);

java如何執行遠程伺服器上的.sh文件

你可以使用JSch

JSch全稱是「Java Secure Channel」

是SSH2的一個純Java實現。它允許你連接到一個sshd 伺服器,使用埠轉發,X11轉發,文件傳輸等等。同時也是支持執行命令;

以下是大概運行的代碼,只是提供大致思路,可以去查官方API和demo

import com.jcraft.jsch.ChannelExec;

import com.jcraft.jsch.ChannelSftp;

import com.jcraft.jsch.ChannelS;

import com.jcraft.jsch.JSch;

import com.jcraft.jsch.JSchException;

import com.jcraft.jsch.Session;

import com.jcraft.jsch.SftpATTRS;

import com.jcraft.jsch.SftpException;

…….

try{

Session session = new JSch().getSession(user, ip, port);

session.setPassword(pwd);

session.setConfig(“StrictHostKeyChecking”, “no”);

session.setConfig(“userauth.gssapi-with-mic”, “no”);

session.connect();

ChannelExec exec = (ChannelExec) session.openChannel(“exec”);

exec.setCommand(“ifconfig”);//這裡是你要執行的命令,部分命令不支持,具體自己執行下

ByteArrayOutputStream bao = new ByteArrayOutputStream();

exec.setOutputStream(bao);

ByteArrayOutputStream baerr = new ByteArrayOutputStream();

exec.setErrStream(baerr);

exec.connect();

while (!exec.isEOF())

;

String errmsg = new String(baerr.toByteArray(), “utf-8”);

if (StringUtils.notNull(errmsg)) {

throw new RuntimeException(errmsg);

} else {

System.out.println(new String(bao.toByteArray(), “utf-8”));

}

}catch(Exception e){

    e.printStackTrace();

}finally{

    //關閉session等操作

}

急~~ 用java生成.sh文件的問題

String lineSeparator = System.getProperty(“line.separator”);

這個在 Linux 得出的是 \n

這個在 Windows 得出的是 \n\r

你注意下這個就可以了。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/233889.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-11 17:11
下一篇 2024-12-11 17:11

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論