[英]How to connect to a remote unix box from java and run unix script in it?
[英]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.