此处将为大家介绍关于Java中通过jsch来连接远程服务器执行linux命令的详细内容,此外,我们还将为您介绍关于gossh连接远程服务器并执行命令调用svn可执行文件创建用户、Java执行linux
此处将为大家介绍关于Java中通过jsch来连接远程服务器执行linux命令的详细内容,此外,我们还将为您介绍关于go ssh连接远程服务器并执行命令 调用svn可执行文件创建用户、Java 执行linux scp 远程获取文件和上传、Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息、javascript如何 执行linux命令的有用信息。
本文目录一览:- Java中通过jsch来连接远程服务器执行linux命令
- go ssh连接远程服务器并执行命令 调用svn可执行文件创建用户
- Java 执行linux scp 远程获取文件和上传
- Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息
- javascript如何 执行linux命令
Java中通过jsch来连接远程服务器执行linux命令
这篇文章主要介绍了Java中通过jsch来连接远程服务器执行linux命令的相关资料,需要的朋友可以参考下
有时候你可能需要通过代码来控制执行linux命令实现某些功能。
针对这类问题可以使用JSCH来实现,具体代码如下:
public class CogradientImgFileManager{ private static final Logger log = LoggerFactory.getLogger(CogradientImgFileManager.class); private static ChannelExec channelExec; private static Session session = null; private static int timeout = 60000; // 测试代码 public static void main(String[] args){ try{ versouSshUtil("10.8.12.189","jmuser","root1234",22); runcmd("java -version","UTF-8"); }catch (Exception e){ // Todo Auto-generated catch block e.printstacktrace(); } } /** * 连接远程服务器 * @param host ip地址 * @param userName 登录名 * @param password 密码 * @param port 端口 * @throws Exception */ public static void versouSshUtil(String host,String userName,String password,int port) throws Exception{ log.info("尝试连接到....host:" + host + ",username:" + userName + ",password:" + password + ",port:" + port); JSch jsch = new JSch(); // 创建JSch对象 session = jsch.getSession(userName, host, port); // 根据用户名,主机ip,端口获取一个Session对象 session.setPassword(password); // 设置密码 Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); // 为Session对象设置properties session.setTimeout(timeout); // 设置timeout时间 session.connect(); // 通过Session建立链接 } /** * 在远程服务器上执行命令 * @param cmd 要执行的命令字符串 * @param charset 编码 * @throws Exception */ public static void runcmd(String cmd,String charset) throws Exception{ channelExec = (ChannelExec) session.openChannel("exec"); channelExec.setCommand(cmd); channelExec.setInputStream(null); channelExec.setErrStream(System.err); channelExec.connect(); InputStream in = channelExec.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in, Charset.forName(charset))); String buf = null; while ((buf = reader.readLine()) != null){ System.out.println(buf); } reader.close(); channelExec.disconnect(); } }
go ssh连接远程服务器并执行命令 调用svn可执行文件创建用户
golang 用公钥key登陆远程服务器
下面的代码展现了公钥在可执行文件同目录或者直接以字符串形式定义在文件中两种形式
log.Fatal触发后会引发程序退出 打印输出内容 退出应用程序 defer函数不会执行
package main
import (
"fmt"
"log"
"os"
"time"
"golang.org/x/crypto/ssh"
)
// srm-hw-train-app公钥
var svnServerKey string = `-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAqq+P9RB3l6qFTNKwh+cgR3jbBQWt1oFZ+4BoutKxEtHM/bOK
ADiSoHVr4+7L8Q+I9GgVy666666666666666666NwIklyX7zmqdZ8MXoTsZhenmolQ
z9gMhXC3TLKXtnug68pa666666666666666666lcZk6DHdZXE+BBRYDkVbaaMpq+5
xEmbwJQZqX1L9YLMHTts0+6666666666666666665qCZ85eVFpt3gEt/IiY2X
PVvPBUaS5666666666666666666TOqK6xz9V2/86yj4kD+mldgXrQBAvn3g
C6cMiLqt9XPMjZF+3ML4KFsBx666666666666666666BAQCJj2iD5zubHjDE
U2E2hk17jKlniMYrhKBS666666666666666666bUQAtSnkI9MKtwAoEEt+HEZx
g4x0taVg+CxoWPuSL3666666666666666666wrgDsbVrcFRMCNVkuR/JQXnZB
E4b0+5eFL4FLe16FI6l666666666666666666ptNMx8QI8C6zSy68NRzV7oJJ
VsBbr4W1Ptez28zBzm666666666666666666w9jWKM11EzvjpWHPNnAi
LWQX9NQcSmMG6666666666666666667B7sCgt8Vva474lVgEWyVsB6FBUOOz
KzF13CuhAoGBANyuLwalHRHhs4P666666666666666666g3YprO+uoKIj
5O+lVbPOtXQGKxE/ga66666666666666666617GjJeU6kP9Rzwg04G5xi3FNG6/2f
1g7tyMiyrZdcdUIcnx5666666666666666666wDJotBasjkAcyPfAoGBAMYA
+hb/Dyrj3PSOBiznqAc666666666666666666WgtVkc+ZOdDR7PL2VZU
sLltu3GjXm6am5aeuR8w666666666666666666i0Uj8cQI19bLSDqiSLXus5zn
X7/QP6dg5CpZDEYRJ/mLf666666666666666666AcXymNG2fKH4Amo5SXWty
zvrTy0do3WKz0nfb3jx666666666666666666RA97txixFY9I7YRNxkWK
zdsmy7Co0LeJF9666666666666666666Wq1+PwUVT5w2fbIGUrQmjBwzuPv
niZP6P+ndL09HJ6666666666666666665s8D3ARBgr4JoU5JqbNxHtfZaEV
t/0A9b+aw0aXNm666666666666666666NGjgN2XIuabXlT7JBgzkt/Gh5ff6
EzGx1C86Z80+sEU/666666666666666666dzd7vhzUymeDsPSBKVldH8rjwQ3
uHMwmQKBgAYAD666666666666666666wysZy+eopHoOk5I//U8Rj3YbvX/Nu/748
oNwAaRaaSOjTJ666666666666666666bVPRT46cXV4j7LvbJivQ55eXdf
8VhofmV+sItX666666666666666666s7t1nBoEtStJ3/
-----END RSA PRIVATE KEY-----`
// ssh配置类型
type sshConfig struct {
sshHost string
sshUser string
sshPasswrod string
sshType string // password或者key
sshKeyPath string // ssh id_rsa.id路径
sshPort int
}
// 公钥在代码中是string
func publicKeyStrAuth(key string) ssh.AuthMethod {
var keyByte []byte = []byte(key)
signer, err := ssh.ParsePrivateKey(keyByte)
if err != nil {
log.Fatal("ssh key signer failed", err)
}
return ssh.PublicKeys(signer)
}
// // 公钥在文件中
// func publicKeyFileAuth(keyPath string) ssh.AuthMethod {
// keyExpandPath, err := homedir.Expand(keyPath)
// if err != nil {
// log.Fatal("find key''s home dir failed", err)
// }
// key, err := os.ReadFile(keyExpandPath)
// if err != nil {
// log.Fatal("ssh key file read failed", err)
// }
// signer, err := ssh.ParsePrivateKey(key)
// if err != nil {
// log.Fatal("ssh key signer failed", err)
// }
// return ssh.PublicKeys(signer)
// }
func sshRemoteExcute(sshCfg sshConfig, cmd string) (flag bool) {
// 创建ssh登录配置
config := &ssh.ClientConfig{
Timeout: 2 * time.Second, // ssh连接time out时间一秒钟,如果ssh验证错误会在6秒钟返回
User: sshCfg.sshUser,
HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 这个可以,但是不够安全
}
if sshCfg.sshType == "password" {
config.Auth = []ssh.AuthMethod{ssh.Password(sshCfg.sshPasswrod)}
} else {
config.Auth = []ssh.AuthMethod{publicKeyStrAuth(sshCfg.sshKeyPath)}
// return
}
// dial 获取ssh client
addr := fmt.Sprintf("%s:%d", sshCfg.sshHost, sshCfg.sshPort)
sshClient, err := ssh.Dial("tcp", addr, config)
if err != nil {
// log.Fatal("genarate ssh client fail", err)
flag = false
return flag
}
defer sshClient.Close()
// 创建ssh-session
session, err := sshClient.NewSession()
if err != nil {
// log.Fatal("genarate ssh client fail", err)
flag = false
return flag
}
defer session.Close()
// 执行远程命令
combo, err := session.CombinedOutput(cmd)
if err != nil {
// log.Fatal("remote excute cmd fail", err)
flag = false
}
log.Println("cmd output:", string(combo))
log.Println("Excute remote cmd successfully ~~")
flag = true
return flag
}
func svnAddUser() {
defer mainMenu() // 最终都回到主菜单
var svnConfig sshConfig
// svn服务器配置
svnConfig.sshHost = "192.168.x.xx"
svnConfig.sshUser = "root"
svnConfig.sshPasswrod = ""
svnConfig.sshType = "key" // password或者key
svnConfig.sshKeyPath = svnServerKey
svnConfig.sshPort = 22
var newSvnName string
fmt.Println("请输入新用户用户名:")
fmt.Scanln(&newSvnName)
cmd := "/home/svn/useradd.sh " + newSvnName // 新用户名
// 询问用户是否确定
var confirm rune
fmt.Print("确认创建用户:【" + newSvnName + "】?请输入y/Y或n/N:")
fmt.Scanf("%c", &confirm)
switch confirm {
case ''y'', ''Y'':
fmt.Println("执行生成方法")
sshRemoteExcute(svnConfig, cmd)
case ''n'', ''N'':
fmt.Println("取消创建,返回主菜单")
default:
fmt.Println("操作错误,返回主菜单")
}
}
func test() {
defer mainMenu()
var svnConfig sshConfig
svnConfig.sshHost = "192.168.x.xx"
svnConfig.sshUser = "root"
svnConfig.sshPasswrod = ""
svnConfig.sshType = "key" // password或者key
svnConfig.sshKeyPath = svnServerKey // 填写路径或字符串变量
svnConfig.sshPort = 22
testCmd := "whoami"
fmt.Println("开始测试连通性...")
f := sshRemoteExcute(svnConfig, testCmd)
if !f {
fmt.Println("不能ping通【" + svnConfig.sshHost + "】服务器!")
} else {
fmt.Println("可以ping通【" + svnConfig.sshHost + "】服务器")
}
}
func exit() {
// 保持窗口等待用户操作
fmt.Printf("Press any key to exit...")
b := make([]byte, 1)
os.Stdin.Read(b)
}
func mainMenu() {
var choice int
fmt.Println("\n***\t主菜单\t\n***\t1 SVN创建用户\t\n***\t2 测试服务器是否连通\t\n***\t3 退出\t\n***\t请输入菜单:\t")
fmt.Scanln(&choice)
switch choice {
case 1:
// 这里方法执行完之后都会有个bug 会给choice赋值为0
svnAddUser()
case 2:
test()
case 3:
exit()
default:
fmt.Println("抱歉,输入有误!")
mainMenu()
}
}
func main() {
mainMenu()
}
python 公钥密码访问服务器代码留存
import paramiko
def ssh_private_key(rsa_file, hostname, port, username, cmd):
''''''私钥ssh连接cetnos方法
''''''
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
private_key = paramiko.RSAKey.from_private_key_file(
rsa_file) # 指定私钥所在文件
# 连接服务器
ssh.connect(
hostname=hostname,
port=port,
username=username,
pkey=private_key,
timeout=5
)
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read().decode(''utf-8'')
ssh.close()
return result
def ssh_pwd(hostname, port, username, pwd, cmd):
''''''账号密码连接centos方法
''''''
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(
hostname=hostname,
port=port,
username=username,
password=pwd,
timeout=10
)
stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True)
result = stdout.read().decode(''utf-8'')
ssh.close()
return result
def ssh_transfer_file(local_file, remote_file):
''''''上传文件到服务器
''''''
transport = paramiko.Transport(''192.168.xxx.xxx'', 22)
transport.connect(username=''root'', password=''1234'')
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(local_file, remote_file) # 从本地上传文件到远程主机
transport.close()
if __name__ == "__main__":
# SVN创建用户
res = ssh_pwd(hostname=''192.168.xxx.xx'',
port=22,
username=''root'',
pwd='''',
cmd=''/home/svn/useradd.sh xxx'')
print(res)
Java 执行linux scp 远程获取文件和上传
原文连接:https://www.cnblogs.com/shijiaoyun/p/4930906.html
需要的jar包:ganymed-ssh2-build210.jar
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
public class Scpclient {
// public Scpclient(){}
static private Scpclient instance;
static synchronized public Scpclient getInstance(String IP,int port,
String username,String passward) {
if (instance == null) {
instance = new Scpclient(IP,port,username,passward);
}
return instance;
}
public Scpclient(String IP,String username,String passward) {
this.ip = IP;
this.port = port;
this.username = username;
this.password = passward;
}
public void getFile(String remoteFile,String localTargetDirectory) {
Connection conn = new Connection(ip,port);
try {
conn.connect();
boolean isAuthenticated = conn.authenticateWithPassword(username,
password);
if (isAuthenticated == false) {
System.err.println("authentication Failed");
}
SCPClient client = new SCPClient(conn);
client.get(remoteFile,localTargetDirectory);
conn.close();
} catch (IOException ex) {
Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE,null,ex);
}
}
public void putFile(String localFile,String remoteTargetDirectory) {
Connection conn = new Connection(ip,
password);
if (isAuthenticated == false) {
System.err.println("authentication Failed");
}
SCPClient client = new SCPClient(conn);
client.put(localFile,remoteTargetDirectory);
conn.close();
} catch (IOException ex) {
Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE,ex);
}
}
public void putFile(String localFile,String remoteFileName,String remoteTargetDirectory,String mode) {
Connection conn = new Connection(ip,
password);
if (isAuthenticated == false) {
System.err.println("authentication Failed");
}
SCPClient client = new SCPClient(conn);
if((mode == null) || (mode.length() == 0)){
mode = "0600";
}
client.put(localFile,remoteFileName,remoteTargetDirectory,mode);
//重命名
ch.ethz.ssh2.Session sess = conn.openSession();
String tmpPathName = remoteTargetDirectory +File.separator+ remoteFileName;
String newPathName = tmpPathName.substring(0,tmpPathName.lastIndexOf("."));
sess.execCommand("mv " + remoteFileName + " " + newPathName);//重命名回来
conn.close();
} catch (IOException ex) {
Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE,ex);
}
}
// public void putFile(String localFile,String remoteTargetDirectory) {
// Connection conn = new Connection(ip,port);
// try {
// conn.connect();
// boolean isAuthenticated = conn.authenticateWithPassword(username,
// password);
// if (isAuthenticated == false) {
// System.err.println("authentication Failed");
// }
// SCPClient client = new SCPClient(conn);
// client.put(getBytes(localFile),remoteTargetDirectory);
// conn.close();
// } catch (IOException ex) {
// Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE,ex);
// }
// }
public static byte[] getBytes(String filePath) {
byte[] buffer = null;
try {
File file = new File(filePath);
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream byteArray = new ByteArrayOutputStream(1024*1024);
byte[] b = new byte[1024*1024];
int i;
while ((i = fis.read(b)) != -1) {
byteArray.write(b,i);
}
fis.close();
byteArray.close();
buffer = byteArray.toByteArray();
} catch (FileNotFoundException e) {
e.printstacktrace();
} catch (IOException e) {
e.printstacktrace();
}
return buffer;
}
private String ip;
private int port;
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getpassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
}
调用方法:
Scpclient scp = Scpclient.getInstance(ip,uname,pwd);
scp.putFile("本地文件路径",fileFeed.getName()+".tmp","推送文件,到服务器的目录路径",null);
scp.getFile(remoteFile,localTargetDirectory);
Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息
pom.xml jar 包支持
<dependency> <groupId>com.jcraft</artifactId>jschversion>0.1.53> >
代码:
package com.spring.bean.annotation; import java.io.BufferedReader; java.io.IOException; java.io.InputStream; java.io.InputStreamReader; java.util.HashMap; java.util.Map; com.jcraft.jsch.Channel; com.jcraft.jsch.ChannelExec; com.jcraft.jsch.JSch; com.jcraft.jsch.JSchException; com.jcraft.jsch.Session; /** * 远程调用Linux shell 命令 * * @author wei.Li by 14-9-2. */ public class LinuxStateForShell { static final String cpu_MEM_SHELL = "top -b -n 1"; final String FILES_SHELL = "df -hl"final String[] COMMANDS = {cpu_MEM_SHELL,FILES_SHELL}; final String LINE_SEParaTOR = System.getProperty("line.separator"); private static Session session; * 连接到指定的HOST * * @return isConnect * @throws JSchException JSchException */ boolean connect(String user,String passwd,String host) { JSch jsch = new JSch(); try { session = jsch.getSession(user,host,22); session.setPassword(passwd); java.util.Properties config = java.util.Properties(); config.put("StrictHostKeyChecking","no"); session.setConfig(config); session.connect(); } catch (JSchException e) { e.printstacktrace(); System.out.println("connect error !"); return false; } true; } * 远程连接Linux 服务器 执行相关的命令 * * @param commands 执行的脚本 * user 远程连接的用户名 * passwd 远程连接的密码 * host 远程连接的主机IP * 最终命令返回信息 static Map<String,String> rundistanceShell(String[] commands,String user,String host) { if (!connect(user,passwd,host)) { null; } Map<String,String> map = new HashMap<>(); StringBuilder stringBuffer; BufferedReader reader = ; Channel channel = ; { for (String command : commands) { stringBuffer = StringBuilder(); channel = session.openChannel("exec"); ((ChannelExec) channel).setCommand(command); channel.setInputStream(); ((ChannelExec) channel).setErrStream(System.err); channel.connect(); InputStream in = channel.getInputStream(); reader = new BufferedReader( InputStreamReader(in)); String buf; while ((buf = reader.readLine()) != ) { //舍弃PID 进程信息 if (buf.contains("PID")) { break; } stringBuffer.append(buf.trim()).append(LINE_SEParaTOR); } 每个命令存储自己返回数据-用于后续对返回数据进行处理 map.put(command,stringBuffer.toString()); } } catch (IOException | JSchException e) { e.printstacktrace(); } finally { if (reader != ) { reader.close(); } } (IOException e) { e.printstacktrace(); } if (channel != ) { channel.disconnect(); } session.disconnect(); } return map; } * 直接在本地执行 shell * * 执行结果信息 runLocalShell(String[] commands) { Runtime runtime = Runtime.getRuntime(); Map<String,1)">(); StringBuilder stringBuffer; BufferedReader reader; Process process; (String command : commands) { stringBuffer = StringBuilder(); { process = runtime.exec(command); InputStream inputStream = process.getInputStream(); reader = InputStreamReader(inputStream)); String buf; ) { ; } stringBuffer.append(buf.trim()).append(LINE_SEParaTOR); } } (IOException e) { e.printstacktrace(); ; } map.put(command,stringBuffer.toString()); } * 处理 shell 返回的信息 * <p> * 具体处理过程以服务器返回数据格式为准 * 不同的Linux 版本返回信息格式不同 * * result shell 返回的信息 * 最终处理后的信息 static String disposeResultMessage(Map<String,1)"> result) { StringBuilder buffer = StringBuilder(); (String command : COMMANDS) { String commandResult = result.get(command); if (null == commandResult) continue; if (command.equals(cpu_MEM_SHELL)) { String[] strings = commandResult.split(LINE_SEParaTOR); 将返回结果按换行符分割 (String line : strings) { line = line.toupperCase();转大写处理 处理cpu cpu(s): 10.8%us,0.9%sy,0.0%ni,87.6%id,0.7%wa,0.0%hi,0.0%si,0.0%st if (line.startsWith("cpu(S):")) { String cpuStr = "cpu 用户使用占有率:"; { cpuStr += line.split(":")[1].split(",")[0].replace("US",""); } (Exception e) { e.printstacktrace(); cpuStr += "计算过程出错"; } buffer.append(cpuStr).append(LINE_SEParaTOR); 处理内存 Mem: 66100704k total,65323404k used,777300k free,89940k buffers } else if (line.startsWith("MEM")) { String memStr = "内存使用情况:" { memStr += line.split(":")[1] .replace("TOTAL","总计") .replace("USED","已使用") .replace("FREE","空闲") .replace("BUFFERS","缓存"); } (Exception e) { e.printstacktrace(); memStr += "计算过程出错"; buffer.append(memStr).append(LINE_SEParaTOR); ; } buffer.append(memStr).append(LINE_SEParaTOR); } } } (command.equals(FILES_SHELL)) { 处理系统磁盘状态 buffer.append("系统磁盘状态:"); { buffer.append(disposeFilesSystem(commandResult)).append(LINE_SEParaTOR); } (Exception e) { e.printstacktrace(); buffer.append("计算过程出错").append(LINE_SEParaTOR); } } } buffer.toString(); } 处理系统磁盘状态 * Filesystem Size Used Avail Use% Mounted on * /dev/sda3 442G 327G 93G 78% / * tmpfs 32G 0 32G 0% /dev/shm * /dev/sda1 788M 60M 689M 8% /boot * /dev/md0 1.9T 483G 1.4T 26% /ezsonar * * commandResult 处理系统磁盘状态shell执行结果 * 处理后的结果 String disposeFilesSystem(String commandResult) { String[] strings = commandResult.split(LINE_SEParaTOR); final String PATTERN_TEMPLATE = "([a-zA-Z0-9%_/]*)\\s"; int size = 0int used = 0for (int i = 0; i < strings.length - 1; i++) { if (i == 0) int temp = 0; for (String s : strings[i].split("\\b")) { if (temp == 0) { temp++; ; } s.trim().isEmpty()) { if (temp == 1) { size += disposeUnit(s); temp++; } else { used += disposeUnit(s); temp = 0; } } } } new StringBuilder().append("大小 ").append(size).append("G,已使用").append(used).append("G,空闲") .append(size - used).append("G").toString(); } * 处理单位转换 * K/KB/M/T 最终转换为G 处理 * * s 带单位的数据字符串 * 以G 为单位处理后的数值 int disposeUnit(String s) { { s = s.toupperCase(); String lastIndex = s.substring(s.length() - 1); String num = s.substring(0,s.length() - 1int parseInt = Integer.parseInt(num); if (lastIndex.equals("G" parseInt; } if (lastIndex.equals("T"return parseInt * 1024; } if (lastIndex.equals("M"return parseInt / 1024if (lastIndex.equals("K") || lastIndex.equals("KB"return parseInt / (1024 * 1024); } } (NumberFormatException e) { e.printstacktrace(); return 0void main(String[] args) { Map<String,String> result = rundistanceShell(COMMANDS,"dell","1","192.168.1.122"); System.out.println(disposeResultMessage(result)); } }
javascript如何 执行linux命令
我想实现在web端能执行Linux命令,有什么方法能实现么我们今天的关于Java中通过jsch来连接远程服务器执行linux命令的分享就到这里,谢谢您的阅读,如果想了解更多关于go ssh连接远程服务器并执行命令 调用svn可执行文件创建用户、Java 执行linux scp 远程获取文件和上传、Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息、javascript如何 执行linux命令的相关信息,可以在本站进行搜索。
本文标签: