① 如何用java實現SSH遠程連接
這還要思路。。。
表單提交到後台,觸發方法, 然後調jsch的方法,獲取返回信息。 然後return到頁面。
搞定!
② 如何使用java通過ssh的方式登錄遠程伺服器執行命令
mina。apache。org/sshd-project/如何使用java通過ssh的方式登錄遠程伺服器執行命令
③ java 怎麼使用sshbase 和遠程機器進行交互
在本地使用 ssh $RemoteNode <cmd> 可以在執行遠程機器上的命令,例如 ssh user@node ls /local 會執行遠程機器上的 ls /local 命令,如果想在遠程機器上連續執行多條命令,可以用單引號或者雙引號將這些命令括起來,
例如:ssh user@node "cd /local; pwd;ls"
如果想在本地啟動遠程機器上的命令後就返回來,可以這樣 ssh user@node " /local/x.sh 1>/dev/null 2>&1 & "
注意如果沒有「」,例如 ssh user@node cd /local ; ls 則 ls 只會執行 cd /local 命令,ls命令在本地執行,加了雙引號或者單引號,則被括起來的命令被當做ssh命令的一個參數,所以會在遠程連續執行。
單引號和雙引號在ssh命令中的區別:
以一個例子來說明問題,
假設本地機器上配置了JAVA環境變數,在本地執行 echo $JAVA_HOME=/opt/jdk
假若我想查看遠程機器上的JAVA環境變數,則只能使用單引號了,ssh user@node ' echo $JAVA ', 則是' ' 中的$JAVA不會被shell解析,而是當做一個字元串,此時參數 echo $JAVA 傳遞給了 ssh;
如果我們使用 ssh user@node 」 echo $JAVA ",則 shell 首先會解析$JAVA,得到它的值,則該命令就變成了 ssh user@node ' echo /opt/jdk ' 了
④ java連接ssh登陸路由器
packagecom.flyingzl.ssh;importjava.util.ArrayList
importjava.util.Hashtable
importjava.util.List
importorg.apache.log4j.Logger
importorg.apache.oro.text.regex.MalformedPatternException
importcom.jcraft.jsch.ChannelShell
importcom.jcraft.jsch.JSch
importcom.jcraft.jsch.Session
importcom.jcraft.jsch.UserInfo
importexpect4j.Closure
importexpect4j.Expect4j
importexpect4j.ExpectState
importexpect4j.matches.EofMatch
importexpect4j.matches.Match
importexpect4j.matches.RegExpMatch
importexpect4j.matches.TimeoutMatch
publicclassShell{privatestaticLoggerlog=Logger.getLogger(Shell.class)
privateSessionsession
privateChannelShellchannel
privatestaticExpect4jexpect=null
=1000
privateStringBufferbuffer=newStringBuffer()
publicstaticfinalintCOMMAND_EXECUTION_SUCCESS_OPCODE=-2
_R=" "
_N=" "
publicstaticfinalStringCOLON_CHAR=":"
publicstaticStringENTER_CHARACTER=BACKSLASH_R
publicstaticfinalintSSH_PORT=22
//正則匹配,用於處理伺服器返回的結果publicstaticString[]linuxPromptRegEx=newString[]{"~]#","~#","#",":~#","/$",">"}
publicstaticString[]errorMsg=newString[]{"couldnotacquiretheconfiglock"}
//ssh伺服器的ip地址privateStringip
//ssh伺服器的登入埠privateintport
//ssh伺服器的登入用戶名privateStringuser
//ssh伺服器的登入密碼privateStringpassword
publicShell(Stringip,intport,Stringuser,Stringpassword){this.ip=ip
this.port=port
this.user=user
this.password=password
expect=getExpect()
}/***關閉SSH遠程連接*/publicvoiddisconnect(){if(channel!=null){channel.disconnect()
}if(session!=null){session.disconnect()
}}/***獲取伺服器返回的信息*@return服務端的執行結果*/publicStringgetResponse(){returnbuffer.toString()
}//獲得Expect4j對象,該對用可以往SSH發送命令請求privateExpect4jgetExpect(){try{log.debug(String.format("Startloggingto%s@%s:%s",user,ip,port))
JSchjsch=newJSch()
session=jsch.getSession(user,ip,port)
session.setPassword(password)
Hashtable<String,String>config=newHashtable<String,String>()
config.put("StrictHostKeyChecking","no")
session.setConfig(config)
localUserInfoui=newlocalUserInfo()
session.setUserInfo(ui)
session.connect()
channel=(ChannelShell)session.openChannel("shell")
Expect4jexpect=newExpect4j(channel.getInputStream(),channel.getOutputStream())
channel.connect()
log.debug(String.format("Loggingto%s@%s:%ssuccessfully!",user,ip,port))
returnexpect
}catch(Exceptionex){log.error("Connectto"+ip+":"+port+"failed,!")
ex.printStackTrace()
}returnnull
}/***執行配置命令*@paramcommands要執行的命令,為字元數組*@return執行是否成功*/publicbooleanexecuteCommands(String[]commands){//如果expect返回為0,說明登入沒有成功if(expect==null){returnfalse
}log.debug("----------:----------")
for(Stringcommand:commands){log.debug(command)
}log.debug("----------End----------")
Closureclosure=newClosure(){publicvoidrun(ExpectStateexpectState)throwsException{buffer.append(expectState.getBuffer())
//bufferisstring//bufferforappending//outputofexecuted//commandexpectState.exp_continue()
}}
List<Match>lstPattern=newArrayList<Match>()
String[]regEx=linuxPromptRegEx
if(regEx!=null&®Ex.length>0){synchronized(regEx){for(StringregexElement:regEx){//listofregxlike,:>,/>//etc.itispossible//commandpromptsofyour//remotemachinetry{RegExpMatchmat=newRegExpMatch(regexElement,closure)
lstPattern.add(mat)
}catch(MalformedPatternExceptione){returnfalse
}catch(Exceptione){returnfalse
}}lstPattern.add(newEofMatch(newClosure(){//shouldcause//entirepagetobe//collectedpublicvoidrun(ExpectStatestate){}}))
lstPattern.add(newTimeoutMatch(defaultTimeOut,newClosure(){publicvoidrun(ExpectStatestate){}}))
}}try{booleanisSuccess=true
for(StringstrCmd:commands){isSuccess=isSuccess(lstPattern,strCmd)
}//防止最後一個命令執行不了isSuccess=!checkResult(expect.expect(lstPattern))
//找不到錯誤信息標示成功Stringresponse=buffer.toString().toLowerCase()
for(Stringmsg:errorMsg){if(response.indexOf(msg)>-1){returnfalse
}}returnisSuccess
}catch(Exceptionex){ex.printStackTrace()
returnfalse
}}//檢查執行是否成功privatebooleanisSuccess(List<Match>objPattern,StringstrCommandPattern){try{booleanisFailed=checkResult(expect.expect(objPattern))
if(!isFailed){expect.send(strCommandPattern)
expect.send(" ")
returntrue
}returnfalse
}catch(MalformedPatternExceptionex){returnfalse
}catch(Exceptionex){returnfalse
}}//檢查執行返回的狀態privatebooleancheckResult(intintRetVal){if(intRetVal==COMMAND_EXECUTION_SUCCESS_OPCODE){returntrue
}returnfalse
}//登入SSH時的控制信息//設置不提示輸入密碼、不顯示登入信息等{Stringpasswd
publicStringgetPassword(){returnpasswd
}publicbooleanpromptYesNo(Stringstr){returntrue
}publicStringgetPassphrase(){returnnull
}publicbooleanpromptPassphrase(Stringmessage){returntrue
}publicbooleanpromptPassword(Stringmessage){returntrue
}publicvoidshowMessage(Stringmessage){}}}
⑤ 如何使用java通過ssh的方式登錄遠程伺服器執行命令並返回結果
讓用戶輸入要執行的命令,接收端會認為它是密碼,應該會提示密碼錯誤之類的吧?獲取這個信息,提醒用戶輸入密碼。
⑥ java遠程進行telnet ftp ssh連接的方法
文件傳輸協議(File Transfer Protocol, FTP)FTP是用於在網路上進行文件傳輸的一套標准協議。 它屬於網路協議組的應用層。 FTP是一個8位的客戶端-伺服器協議, 能操作任何類型的文件而不需要進一步處理, 就像MIME或Unencode一樣。但是, FTP有著極高的延時,這意味著, 從開始請求到第一次接收需求數據之間的時間會非常長, 並且不時的必需執行一些冗長的登陸進程。 概述 FTP服務一般運行在20和21兩個埠。 埠20用於在客戶端和伺服器之間傳輸數據流, 而埠21用於傳輸控制流,並且是命令通向ftp伺服器的進口。 當數據通過數據流傳輸時,控制流處於空閑狀態。 而當控制流空閑很長時間後,客戶端的防火牆會將其會話置為超時, 這樣當大量數據通過防火牆時,會產生一些問題。此時, 雖然文件可以成功的傳輸,但因為控制會話會被防火牆斷開, 傳輸會產生一些錯誤。 FTP實現的目標: 促進文件的共享(計算機程序或數據) 鼓勵間接或者隱式的使用遠程計算機 向用戶屏蔽不同主機中各種文件存儲系統的細節 可靠和高效的傳輸數據 缺點: 密碼和文件內容都使用明文傳輸,可能產生不希望發生的竊聽。 因為必需開放一個隨機的埠以建立連接,當防火牆存在時, 客戶端很難過濾處於主動模式下的FTP流量。 這個問題通過使用被動模式的FTP得到了很大解決。 伺服器可能會被告知連接一個第三方計算機的保留埠。 FTP雖然可以被終端用戶直接使用, 但是它是設計成被FTP客戶端程序所控制。 運行FTP服務的許多站點都開放匿名服務,在這種設置下, 用戶不需要帳號就可以登錄伺服器,默認情況下, 匿名用戶的用戶名是:「anonymous」。 這個帳號不需要密碼, 雖然通常要求輸入用戶的郵件地址作為認證密碼, 但這只是一些細節或者此郵件地址根本不被確定, 而是依賴於FTP伺服器的配置情況。 [編輯] 主動和被動模式 FTP有兩種使用模式:主動和被動。 主動模式要求客戶端和伺服器端同時打開並且監聽一個埠以建立連 接。在這種情況下,客戶端由於安裝了防火牆會產生一些問題。 所以,創立了被動模式。 被動模式只要求伺服器端產生一個監聽相應埠的進程, 這樣就可以繞過客戶端安裝了防火牆的問題。 一個主動模式的FTP連接建立要遵循以下步驟: 客戶端打開一個隨機的埠(埠號大於1024,在這里, 我們稱它為x), 同時一個FTP進程連接至伺服器的21號命令埠。此時, 源埠為隨機埠x,在客戶端,遠程埠為21,在伺服器。 客戶端開始監聽埠(x+1),同時向伺服器發送一個埠命令( 通過伺服器的21號命令埠), 此命令告訴伺服器客戶端正在監聽的埠號並且已准備好從此埠接 收數據。這個埠就是我們所知的數據埠。 伺服器打開20號源埠並且建立和客戶端數據埠的連接。此時, 源埠為20,遠程數據埠為(x+1)。 客戶端通過本地的數據埠建立一個和伺服器20號埠的連接, 然後向伺服器發送一個應答,告訴伺服器它已經建立好了一個連接。 [編輯] FTP和網頁瀏覽器 大多數最新的網頁瀏覽器和文件管理器都能和FTP伺服器建立連接 。這使得在FTP上通過一個介面就可以操控遠程文件, 如同操控本地文件一樣。 這個功能通過給定一個FTP的URL實現,形如ftp://< 伺服器地址>(例如, ftp://ftp.gimp.org )。是否提供密碼是可選擇的,如果有密碼,則形如ftp://< login>:<password>@< ftpserveraddress>。 大部分網頁瀏覽器要求使用被動FTP模式, 然而並不是所有的FTP伺服器都支持被動模式。
⑦ java SSH遠程到linux 執行本地的腳本
scp file yonghuming@伺服器 :/路徑
把本地文件 file 傳送到 伺服器 的 /路徑 下。
然後就可以遠程執行了。
⑧ java使用ssh遠程連接Linux並執行命令,可以終止進程,但是無法開啟
ps-eopid,cmd|grep程序的名稱獲得其pidkillpid或者killall程序名稱
⑨ 怎麼用java實現ssh協議通信
importch.ethz.ssh2.Connection;
importch.ethz.ssh2.Session;
importch.ethz.ssh2.StreamGobbler;
importcom.io.Debug;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
/**
*
*@authorleon.lee
*/
{
privateStringusername="";
privateStringoldpassword="";
privateConnectionconn=;
privatebooleanhasError=false;
privateStringErrorMessage="";
privatebooleanisSuccessfully=false;
privateStringSystemMessage="";
publicstaticfinalStringHOST="127.0.0.1";//serverip
publicbooleanisSuccessfully(){
returnisSuccessfully;
}
publicbooleanisHasError(){
returnhasError;
}
publicStringgetErrorMessage(){
returnErrorMessage;
}
publicvoidsetErrorMessage(Stringmsg){
hasError=true;
this.ErrorMessage=msg;
}
/**
*Createsanewinstanceof<code>ChangeEmailPassword</code>.
*@paramusername
*@paramoldpassword
*/
publicChangeEmailPassword(Stringusername,Stringoldpassword){
this.username=username;
this.oldpassword=oldpassword;
try{
conn=newConnection(HOST);
conn.connect();
/*Authenticate*/
booleanisAuthenticated=conn.authenticateWithPassword(username,oldpassword);
if(isAuthenticated==false){
setErrorMessage("Authenticationfailed.");
conn=;
}
}catch(Exceptione){
conn.close();
conn=;
System.out.println(e);
}
}
publicvoidsetNewPassword(Stringnewpassword){
if(hasError){
return;
}
if(conn==){
return;
}
try{
Sessionsess=conn.openSession();
sess.execCommand("passwd");
InputStreamso=sess.getStdout();
InputStreamerr=sess.getStderr();
OutputStreamout=sess.getStdin();
byte[]buffer=newbyte[500];//其實沒有必要這么大.130就差不多了.怕萬一有什麼提示.
intlength=0;
length=err.read(buffer);
//if(length>0){
//System.out.println("#1:"+newString(buffer,0,length));
////(current)UNIXpassword:
//}
Stringcoldpassword=oldpassword+" ";
out.write(coldpassword.getBytes());
length=err.read(buffer);
//if(length>0){
//System.out.println("#2:"+newString(buffer,0,length));
////(current)UNIXpassword:
//}
Stringcnewpass=newpassword+" ";
out.write(cnewpass.getBytes());
length=err.read(buffer);
if(length>0){
Stringrs=newString(buffer,0,length);
//System.out.println("#3:"+rs);
if(rs.indexOf("BAD")>-1){
sess.close();
conn.close();
setErrorMessage(rs);
return;
}
}
out.write(cnewpass.getBytes());
length=so.read(buffer);
if(length>0){
Stringrs=newString(buffer,0,length);
if(rs.indexOf("successfully")>-1){
this.isSuccessfully=true;
this.SystemMessage=rs;
}
}
/*Closethissession*/
sess.close();
/*Closetheconnection*/
conn.close();
}catch(IOExceptione){
e.printStackTrace(System.err);
}
}
/**
*@
*/
publicstaticvoidmain(String[]args){
ChangeEmailPasswordcep=newChangeEmailPassword("username","oldpassword");
if(cep.isHasError()){
System.out.println(cep.getErrorMessage());
cep=;
return;
}
cep.setNewPassword("newpassword");
if(cep.isHasError()){
System.out.println(cep.getErrorMessage());
cep=;
return;
}
if(cep.isSuccessfully){
System.out.println(cep.getSystemMessage());
}
}
/**
*@returntheSystemMessage
*/
publicStringgetSystemMessage(){
returnSystemMessage;
}
}