⑴ java中操作linux的ganymed和jsch各有什麼特點
Java和Linux的理想關系是,一方面有一種可以在所有操作系統上運行的語言,另一方面操作系統可以根據需要進行各種計算。這種關系本身在過去,現在或者將來都可以實現,但現在目前Java並沒有在Linux界喚起多大的興趣,原因主要在於Java和Linux群體和技術在原則性和專業性上存在差異造成的。
原則性的差異涉及開放源碼和免費軟體這兩個術語。Java既不開放也不免費,而Linux堅持這兩個原則,至少在理論上是這樣。此外,Java倡導者也必須明白,在Linux界存在著一個明顯的分歧,大部分Linux人士都非常注重「free」這個詞,雖然有些人是從經濟上來了解這個詞,但無論怎樣他們都堅持開放源碼的原則。盡管Linux有向各個階層推廣的趨勢,但目前來說自由軟體的積極倡導者主要來自世界各大學的學生和研究人員。他們對Linux的發展是非常關鍵的,為開發Linux和操作系統軟體輸送了大批的人才。
開放源碼和Linux的商業價值取決於那些用Linux為市場開發產品的開發人員,以及喜歡根據自己需要用Linux對操作系統進行自定義的人們。如果必要,這些人會出錢購買Linux,因為它是一種開放的源碼。他們對Linux的發展也是至關重要的,否則,Linux將只是一堆計算機課程和深奧的研究課題。
⑵ 使用jsch連接到linux機器上,執行shell命令返回的結果中包含亂碼,各位大大幫忙看看,謝謝!
建議使用其他客戶端試試,如果你這個客戶端可以調整編碼也可以嘗試下換成utf-8的編碼
⑶ 使用jsch連接到linux上,然後執行shell命令,返回的結果中存在亂碼,各位大大怎麼解決
不要用command方式,用shell方式就不會有亂碼了,另外,那些我們看上去的亂碼實際上可能是shell的高亮標志
⑷ 一台4c8G的Linux,用java jsch建立SSH2連接,最多支持同時與多少台伺服器建立連接
這個需要看你的環境了,如果其它Linux都是在內網,網路環境可以排除,這時只關心業務,如果業務不復雜,這里畢竟是只開一個殼,業務處理都在另一端,但是如果傳輸到連接伺服器上的數據比較大,那建議少開一些,比如並發300-400左右,要不會卡死,如果傳輸數據較小,那無所謂了,開個一兩千都不是問題
但是如果其它伺服器都在外網環境的話,那需要再加上帶寬計算
⑸ java程序執行linux命令
首先確保Linux開啟sshd服務,並支持遠程SSH連接。java程序使用jsch框架登錄Linux,執行命令。
protected void creation() throws Exception {
JSch jsch = new JSch();
session = jsch.getSession(userName, host, port);
session.setPassword(password);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setTimeout(CONNECT_TIMEOUT);
session.setConfig("PreferredAuthentications", "password,keyboard-interactive");
session.setServerAliveInterval(1000 * 60 * 2);
session.connect();
}
public String sendCommand(String command) throws Exception {
if(!isConnected())
throw new JSchException("Session is not connected, command exec faild.");
final ChannelExec exec = (ChannelExec)session.openChannel("exec");
ByteArrayOutputStream out = new ByteArrayOutputStream();
exec.setCommand(command);
exec.setOutputStream(out);
exec.setExtOutputStream(out);
exec.connect();
final Thread thread = new Thread() {
public void run() {
while(!exec.isEOF()) {
try { Thread.sleep(500L); } catch(Exception e) {}
}
}
};
thread.setDaemon(true);
thread.start();
thread.join(EXEC_TIMEOUT);
thread.interrupt();
if(thread.isAlive()) {
throw new JSchException("Exec Time Out Error");
} else {
try {
exec.disconnect();
out.close();
} catch (Exception e) {
}
byte[] lens = out.toByteArray();
String result = new String(lens, charset);
if(result.startsWith("bash") && result.indexOf("command not found") != -1)
return "";
return result;
}
}
⑹ 使用jsch連接到linux上,然後執行shell命令,返回的結果中存在亂碼,各位大大怎麼解決
這是因為文字終端不支持其他語系,請切換到英文語系。
請輸入下列指令再執行命令。
LANG=en_US
⑺ jsch.session怎麼使用 linux的信任機制
使用 jsch 連接linux
1:首先添加maven 依賴
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.48</version>
</dependency>
使用密碼 方式連接 linux
public static String exec(String host, String user, String psw, int port,
String command) {
String result = "";
Session session = null;
ChannelExec openChannel = null;
try {
JSch jsch = new JSch();
session = jsch.getSession(user, host, port);
session.setPassword(psw.getBytes());
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
openChannel = (ChannelExec) session.openChannel("exec");
openChannel.setCommand(command);
int exitStatus = openChannel.getExitStatus();
System.out.println(exitStatus);
openChannel.connect();
InputStream in = openChannel.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(in));
String buf = null;
while ((buf = reader.readLine()) != null) {
result += new String(buf.getBytes("gbk"), "UTF-8")
+ " <br>\r\n";
}
} catch (JSchException | IOException e) {
e.printStackTrace();
result += e.getMessage();
} finally {
if (openChannel != null && !openChannel.isClosed()) {
openChannel.disconnect();
}
if (session != null && session.isConnected()) {
session.disconnect();
}
}
return result;
}
String exec = exec("192.168.80.101", "root", "111", 22,"sleep 2;ls;");
使用 秘鑰方式 連接linux
public static String exec1(String ip, String user, int port,
String privateKey, String passphrase, String command) {
String result = "";
Session session = null;
ChannelExec openChannel = null;
try {
JSch jsch = new JSch();
jsch.addIdentity(privateKey);
session = jsch.getSession(user, ip, port);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
openChannel = (ChannelExec) session.openChannel("exec");
openChannel.setCommand(command);
int exitStatus = openChannel.getExitStatus();
System.out.println(exitStatus);
openChannel.connect();
InputStream in = openChannel.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(in));
String buf = null;
while ((buf = reader.readLine()) != null) {
result += new String(buf.getBytes("gbk"), "UTF-8")
+ " <br>\r\n";
}
} catch (JSchException | IOException e) {
e.printStackTrace();
result += e.getMessage();
} finally {
if (openChannel != null && !openChannel.isClosed()) {
openChannel.disconnect();
}
if (session != null && session.isConnected()) {
session.disconnect();
}
}
return result;
}
String result=exec1("192.168.80.101", "root", 22,"C:\\Users\\ebnew\\Desktop\\office-key(1)", "", "sleep 2;ls;");
⑻ java jsch ftp上傳到linux的事情,linux是不是需要設置什麼東西。因為現在有台伺服器上傳圖片速度很慢。
1)檢查一下伺服器的網路,可以ping一下看看響應時間
2)看看伺服器端是不是設置了限速,最大連接數設置等等
3)查看伺服器的負載是不是很高
⑼ java ssh linux 編程
純Java通過SSH執行Linux命令的方法及代碼
註:此ssh非彼SSH(Struts+Spring+Hibernate)
在Java中,我們可以通過Runtime去執行一些OS的命令,如:
String[] shell = new String[] { " /bin/sh " , " -c " , " ls -l " } ;
Process p = Runtime.getRuntime().exec(shell);
通過在Linux上執行 ssh --help命令,
usage: ssh [-1246AaCfgKkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-e escape_char] [-F configfile]
[-i identity_file] [-L [bind_address:]port:host:hostport]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-R [bind_address:]port:host:hostport] [-S ctl_path]
[-w local_tun[:remote_tun]] [user@]hostname [command]
不難發現,ssh命令中並不能帶密碼。
如果不需要登錄時,我們可以用這樣的方式來執行:
String[] shell = new String[] { " /bin/sh " , " -c " , " ssh [email protected] ls -l " } ;
Process p = Runtime.getRuntime().exec(shell);
但是事情往往並不是我們想像的如此簡單,絕大部分的客戶是不能允許他們的Linux中還存在一個不需要密碼就能執行任何命令的帳戶的。那麼,在Java中就沒有任何辦法通過ssh登錄來執行一些命令嗎?
不慌,先來Google一下,從一些網上別人請教的代碼的蛛絲螞跡中,發現了JSch ( http://www.jcraft.com/jsch/) ,這東東還真是不錯,來,我們先看看其官方的簡介:
JSch is a pure Java implementation of SSH2.
JSch allows you to connect to an sshd server and use port forwarding, X11 forwarding, file transfer, etc., and you can integrate its functionality into your own Java programs. JSch is licensed under BSD style license.
這東東支持像telnet一樣的ssh的session,SFTP,SCP等。
下面,就讓我們來看一個執行ssh命令的通用方法:
public static String sshExecute(String host, String user, String pwd,
String command) {
String osName = System.getProperty("os.name");
// ps -ef|grep tomcat|grep -v grep|awk '{print $2}'
StringBuffer sb = new StringBuffer();
try {
JSch jsch = new JSch();
if (osName.toUpperCase().indexOf("WINDOWS") > -1) {
jsch.setKnownHosts("c:\\known_hosts");
} else {
jsch.setKnownHosts("/root/.ssh/known_hosts");
}
Session session = jsch.getSession(user, host, 22);
session.setPassword(pwd);
session.connect();
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command);
InputStream in = channel.getInputStream();
channel.connect();
int nextChar;
while (true) {
while ((nextChar = in.read()) != -1) {
sb.append((char) nextChar);
}
if (channel.isClosed()) {
System.out.println("exit-status: "
+ channel.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
channel.disconnect();
session.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
看看,是不是挺簡單了。
別忘了,由於這是Pure Java program,還有一個優點就是,這樣的程序不依賴於OS,可以直接在Windows或者其它OS上運行。
對了,執行這個需要RSA的Key文件,示例如下:
192.168.1.4 ssh-rsa 7NcAjjtW2FqmFNO+5x/mTwyY+ssoP5SganxDYs3G016aPZDQdGVZMn/++UELejm/Nnf9qWDBjDj/d2o8++Wk8gkASo/+==
附:產生此文件的簡單方法:可以在Linux中用ssh命令登錄一次,這樣便在/root/.ssh(假如使用root用戶登錄到Linux)目錄下生成known_hosts文件。
⑽ 使用JSCH jar包連接linux不能執行非linux自帶命令
那首先需要確定你使用的是bash的shell,如果是csh的話,你寫到bash的配置中是不會生效的
其次你可以試試看是否可以用絕對路徑來執行你的命令