簡體   English   中英

我想連接到UNIX服務器並通過使用Java程序將運行時參數傳遞給腳本來運行腳本

[英]I want to connect to UNIX server and run a script by passing a run time argument to the script using java program

我的問題:我想通過使用Java程序將運行時參數傳遞給腳本來連接到UNIX服務器並運行腳本。 我需要連接到UNIX服務器並通過向腳本傳遞運行時參數來運行腳本。我已使用以下代碼連接到Unix服務器,並且我已成功連接到服務器。該腳本具有通用grep命令和一個小邏輯,它具有所有權限。當我運行Java代碼時,我能夠看到輸出文本文件,但文件中沒有數據,但是當我從外殼程序提示符手動運行腳本時,我會得到正確的輸出。 請幫助我解決此問題,並讓我知道是否有更好的選擇可以滿足此要求。

Java代碼:

import com.jscape.inet.ssh.*;   
import com.jscape.inet.ssh.util.SshParameters;   
import java.io.*;     
public class Sshexamplelalit implements SshListener {          
// state of SSH connection   
private boolean connected = false;   
public Sshexamplelalit() {   
    Ssh ssh = null;        

    try {   
        // create new Ssh instance   
        SshParameters params = new SshParameters("sacsun","mwctrl","m33tz0n3");   
        System.out.print("sacsun Unix server is connected \n");   
        ssh = new Ssh(params);   
        // register to capture events   
        ssh.addSshListener(this);   

        System.out.println("sacsun Connecting please wait...\n");   
        SshScript script = new SshScript(ssh);   
        SshTask task = new SshTask(">","./SACSUN.sh '07Gretchen01965'",">");
                            //07Gretchen01965
        // connect   
        script.addTask(task); 
        ssh.connect();   
        while(!script.isComplete()) { 
            System.out.println("Waiting");
             Thread.sleep(30000);   
            }                  
        } catch (Exception e) {   
        e.printStackTrace();               
        } finally {   
        try {   
            if(connected) {   
              ssh.disconnect();    
            }   
        } catch(Exception e) {   

        }              
    }   
}   

/**  
 * Captures SshConnectedEvent  
 */  
public void connected(SshConnectedEvent ev) {   
    System.out.println("Connected: " + ev.getHost()+"\n");   
    connected = true;   
    System.out.println("Connected to server  "+ ev.getHost()+"\n");    
}   

/**  
 * Captures SshDataReceivedEvent  
 */  
public void dataReceived(SshDataReceivedEvent ev) {   

    ev.getData();   

}         

/**  
 * Captures SshDisconnectedEvent  
 */  
public void disconnected(SshDisconnectedEvent ev) {   

    System.out.println("Wait server is Disconnecting: " + ev.getHost()+"\n");   
    connected = false;   
}   

/*  
 * Main method for SshExample  
 */  
public static void main(String[] args) {   
    Sshexamplelalit test = new Sshexamplelalit();   
}   

}  

腳本:

    #!/bin/sh

    HOME_DIR=/usr/ftadapters/logs/adapters/rivaadp
    HOME_DIR_ARCH=$HOME_DIR/archive
    cd $HOME_DIR
    rm RivaAdp.txt
    rm BrokerLog.txt
    rm Result.txt
    rm ArchRivaAdp.txt
    echo $1 > out.txt
    grep -i $1  *.log > RivaAdp.txt
    cd $HOME_DIR_ARCH
    grep -i $1 *.log > ArchRivaAdp.txt
    echo $1 > out.txt
    mv ArchRivaAdp.txt ../
    cd ..
    grep -i 'publishMessage' RivaAdp.txt > BrokerLog.txt
    grep -i 'publishMessage' ArchRivaAdp.txt >> BrokerLog.txt
    cnt=`cat BrokerLog.txt | wc -l`
    echo $cnt
    if [ $cnt -gt 0 ]
    then
            echo "Notifications Received in the Broker Logs" > Result.txt
    else
            echo "No Data Found in Broker Logs" > Result.txt
    fi

我認為您想做一個SshSession:

http://files.jscape.com/sshfactory/docs/javadoc/com/jscape/inet/ssh/SshSession.html

發生的情況是您正在使用的SshScript正在調用腳本,但是isComplete方法無法實現您期望的功能-腳本不會將任何狀態傳達回任務。 換句話說,您正在遠程登錄,以批處理作業的形式調用腳本,並且isComplete立即返回true,因此帶有超時的while循環根本不執行任何操作。

SshTask文檔對此進行了解釋: http ://files.jscape.com/sshfactory/docs/javadoc/com/jscape/inet/ssh/SshTask.html

“ SshTask類表示要在SSH服務器上以批處理(非交互式)模式執行的命令”

我發現,通常情況下,如果您正在調用某些命令並且需要某種睡眠才能等待,這是一個警告信號,表明設計不正確。

預計到達時間:閱讀更多有關SshTask的文檔后,我認為您還可以為該任務設置結束提示,以便Java應用程序可以告知腳本何時完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM