ssh执行shell命令 C# 和java

本文提供了一个C#和Java实现SSH远程执行命令的示例代码,包括如何连接SSH服务器、发送命令并获取响应结果。C#部分使用了SharpSSH库,Java部分则使用了Ganymed SSH2库。

C#版:

添加sharpssh工程Tamir.SharpSSH.dll,sharpSshTest.exe,Org.Mentalis.Security.dll,DiffieHellman.dll


程序:

using System.Threading;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System;
using System.Collections;
using System.Collections.Generic;
using Tamir.SharpSsh;


namespace testSSH
{
    class Program
    {
        static void Main(string[]args)
        {
            String str=ssh_conn("ip","user","password","cmd");
            System.Console.Write(str);
            System.Console.Read();
        }
        public static string ssh_conn(string ip, string root, string pass, string command)
        {


            SshStream ssh = new SshStream(ip, root, pass);
            ssh.Prompt = "#";
            ssh.RemoveTerminalEmulationCharacters = true;
            //Writing to the SSH channel  
            string response = ssh.ReadResponse();
            ssh.Write(command);
            ssh.Flush();
            ssh.Write("/n");
            //Reading from the SSH channel  
            response = ssh.ReadResponse();
            return response;


        }    
    }
}


Java 版:

配置构建路径,添加ganymed-ssh2-build251beta1.jar

主类:

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;


public class test {
	public static void main(String argv[]){
		Connection conn=null;
		boolean isAuthenticated=false;
		try{
			conn=new Connection("ip");
			conn.connect();
			isAuthenticated=conn.authenticateWithPassword("user", "password");
			if(isAuthenticated==false){
				System.out.println("SSH Login faild");
			}
			else{
				Session sess=conn.openSession();
				System.out.println(new SysCpuInfo(sess).getCPUInfo());
				sess.close();
			}
		}catch(Exception e){
			System.out.println(e.toString());
		}
	}
}


功能类:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;


public class SysCpuInfo {
	private int CPU_IDLE=0;
	int processStatus=0;
	public SysCpuInfo(Session session){
		InputStream is=null;
		BufferedReader brStat = null;
		StringTokenizer tokenStat=  null ;
		Session sess = null;
		String str = "";
		int i=0,j=0,cpuidle=0;
		try{
			sess=session;
			sess.execCommand("vmstat 2 10");//cmd
			/**
			 * 执行vmstat命令获得系统CPU负载情况,vmstat 2 10表示2秒钟输出一次共输出10组数据
			 * 显示结果如下:
			 * [mon724@v0A-202-40-18 ~]$ vmstat 2 10
			 * 	procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
			 * 	 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
			 * 	 1  0  41328  58860 199292 1877728    0    0     2    23    0    0  2  0 98  0  0
			 * 	 0  0  41328  58744 199292 1877884    0    0     0     0 1080 1057  3  0 96  0  0
			 * 	 0  0  41328  58084 199300 1878036    0    0     0   250 1310 1258  6  0 94  0  0
			 * 	 0  0  41328  57844 199300 1878148    0    0     0    32  761  697  3  0 97  0  0
			 * 	 0  0  41328  57852 199304 1878224    0    0     0   214  630  593  1  1 98  0  0
			 * 	 0  0  41328  56984 199304 1878372    0    0     0    50 1033  881  6  0 94  0  0
			 * 	 0  0  41328  56860 199304 1878440    0    0     0     0  536  578  2  0 98  0  0
			 * 	 1  0  41328  56868 199308 1878552    0    0     0   200  545  581  1  0 99  0  0
			 * 	 0  0  41328  56876 199308 1878644    0    0     0   102  628  663  1  0 99  0  0
			 * 	 0  0  41328  56876 199308 1878696    0    0     0   118  615  580  3  0 96  0  0 
			 */
			is = new StreamGobbler(sess.getStdout());


			brStat = new BufferedReader(new InputStreamReader(is));
			/*先读取第一行Title信息
			 * procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
			 * */
			String x=brStat.readLine();
			System.out.println(x);
			/*读取第二行Title信息读取第三行信息
			 *  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
			 * */
			x=brStat.readLine();
			System.out.println(x);
			/*读取第三行信息
			 *  1  0  41328  58860 199292 1877728    0    0     2    23    0    0  2  0 98  0  0
			 *  注意每次执行vmstat命令时,此行信息基本不变,因此不做为抽取数据使用
			 * */
			x=brStat.readLine();
			System.out.println(x);
			/*读取第4行到第12行信息
			 */
			for(j=0;j<9;j++)
			{
				str = brStat.readLine();
				System.out.println(str);
				if(str==null)
					break;
				tokenStat = new StringTokenizer(str);
				for(i=0;i<14;i++)
				{
					tokenStat.nextToken();
				}
//				int num=new Integer(tokenStat.nextToken()).intValue();
//				System.out.println(num);
//				cpuidle=cpuidle+num;
				cpuidle = cpuidle+new Integer(tokenStat.nextToken()).intValue();
			}
			CPU_IDLE = new Double(cpuidle/9).intValue();
			
	}catch(Exception e){System.out.println(e.toString());}
	}
	public int getCPUInfo()
	{
		return CPU_IDLE;
	}
}


sharpssh:https://sourceforge.net/projects/sharpssh/

ganymed-ssh2-build251beta1.jar: http://download.youkuaiyun.com/detail/wujinshan_28/4540547


C#中,如果你想要从远程Linux系统上执行Java命令,并获取该Java进程的名字,你可以使用`System.Diagnostics.Process`类配合`SSH.NET`这样的第三方库来进行操作。以下是基本步骤: 1. 首先,你需要安装`SSH.NET`库,可以在NuGet包管理器中搜索并安装它。 ```csharp using SSH.NET; ``` 2. 创建SSH客户端连接到远程Linux服务器: ```csharp var client = new SshClient("your_server_ip", "username", "password"); client.Connect(); ``` 3. 使用`RunCommand`方法执行Java命令,并获取命令的标准输出错误输出: ```csharp string commandOutput = ""; using (var session = client.OpenSession()) { session.StartShell(); using (var streamReader = session.CreatePseudoTerminalStream()) { // 执行Java命令 session.RunCommand($"nohup java YourJavaClass &"); // 获取进程ID var pidLine = session.ReadLine(); // 这里可能需要处理分隔符,找到PID int pid = Convert.ToInt32(pidLine.Split(' ')[0]); // 获取进程名称,这通常在Java命令的输出中,或者使用`jps -p {pid}`来获取 commandOutput = session.RunCommand($"jps -p {pid}"); } } ``` 4. 分析`commandOutput`来找到Java进程的实际名称,这可能涉及到字符串处理,比如查找包含"YourJavaClass"的部分。 注意:这个过程可能会受到权限限制,取决于你连接到的用户是否有足够的权限运行`jps`等命令。此外,实时获取进程名可能会有延迟,因为需要等待进程启动并开始运行。 **相关问题--:** 1. 如果无法直接读取到进程名,还有其他方式获取吗? 2. 如何处理SSH连接失败的情况? 3. 如何在Linux上设置Java环境变量以便正确执行Java命令
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值