在C#中使用putty执行Unix命令

时间:2014-12-25 08:43:02

标签: c# putty

您好,我有以下代码,

我能够打开putty会话,但我无法使用C#提供输入,我尝试使用process.StandardInput.WriteLine但它无效。请帮帮我。

class Program
{
    static void Main(string[] args)
    {
        Process process = new Process();
        process.StartInfo.FileName = @"C:\Users\win7\Desktop\putty.exe";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardInput = true;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.Arguments = "-ssh mahi@192.168.37.129 22 -pw mahi";
        process.Start();
        process.StandardInput.WriteLine("ls");


    }
}

大家好,我根据Onots的建议使用了Plink而不是putty。

我做了以下

1.将环境变量中的路径编辑到我的plink位置,即D:\ Plink \

2.手动打开命令提示符并使用命令使用plink登录到我的主机服务器 plink-0.57.exe -ssh mahi@192.168.37.129 -pw mahi我可以手动执行命令。

3.现在我修改了以下代码

class Program
{
    static void Main(string[] args)
    {
        Process process = new Process();
        process.StartInfo.FileName = @"D:\Plink0.57\plink-057.exe"; 
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardInput = true;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.Arguments = " -ssh mahi@192.168.37.129  -pw mahi";
        process.Start();
        process.StandardInput.WriteLine("ls");
    }
}

但是我无法打开plink并且命令没有使用C#执行。但是会发生的是,命令提示符只是出现并立即关闭,我已将错误消息视为

"Unable to write to standard input"

请帮助我,我无法继续下去。在此先感谢。

2 个答案:

答案 0 :(得分:1)

使用命令行Plink(PuTTY Link)代替GUI会不会更容易?我相信它更适合自动化任务。

有关使用示例,请参阅http://the.earth.li/~sgtatham/putty/0.63/htmldoc/Chapter7.html#plink

我会在这里引用相关部分,以防链接变坏:

  

7.2.2使用Plink进行自动连接

     

更典型的是Plink与SSH协议一起使用,以便您使用   直接与服务器上运行的程序对话。要做到这一点,你有   确保Plink使用SSH协议。您可以在几个中执行此操作   方法:

     

使用-ssh选项,如第7.2.1节所述。设置PuTTY   已保存的会话,描述您要连接的服务器,以及   它还将协议指定为SSH。设置Windows环境   变量PLINK_PROTOCOL到单词ssh。通常不会调用Plink   直接由用户,但由另一个进程自动运行。   因此,您通常不希望Plink提示您输入用户   名称或密码。

     

接下来,您可能需要避免各种交互式提示   Plink可以生产。系统可能会提示您验证主机密钥   您要连接的服务器,输入用户名或输入   密码。

     

避免在使用Plink时提示输入服务器主机密钥   自动连接,您应该首先进行手动连接   (使用PuTTY或Plink中的任何一个)到同一服务器,验证主机   键(请参阅第2.2节以获取更多信息),然后选择是以添加   注册表的主机密钥。之后,Plink命令连接到   除非主机密钥,否则该服务器不应提供主机密钥提示   变化。

     

为避免提示输入用户名,您可以:

     

使用-l选项在命令行上指定用户名。对于   例如,plink login.example.com -l fred。设置PuTTY保存的会话   它描述了您要连接的服务器,也是   指定要登录的用户名(请参阅第4.14.1节)。避免   提示输入密码,你几乎肯定会设置   公钥验证。 (有关一般性介绍,请参阅第8章   公共密钥身份验证。)同样,您可以通过两种方式执行此操作:

     

设置PuTTY保存的会话,描述您所在的服务器   连接到,并且还指定了私钥文件(参见章节   4.20.8)。为了在没有提示的情况下工作,您的私钥将不需要密码。将私钥存储在Pageant中。看到   第9章了解更多信息。完成所有这些后,你就完成了   应该能够在SSH服务器机器上运行远程命令   让它自动执行而不提示:

     

Z:\ sysosd> plink login.example.com -l fred echo hello,world hello,   世界

     

Z:\ sysosd>或者,如果您已经设置了所有保存的会话   连接细节:

     

Z:\ sysosd> plink mysession echo hello,world hello,world

     

Z:\ sysosd>然后,您可以设置其他程序来运行此Plink   命令并与它交谈就好像它是服务器机器上的进程一样。

答案 1 :(得分:0)

以下代码给出了解决方案

class Program
    {
        static void Main(string[] args)
        {
            ProcessStartInfo startinfo = new ProcessStartInfo();
            startinfo.FileName = @"D:\Plink0.57\plink-057.exe";
            startinfo.Arguments = "-ssh mahi@192.168.37.129  -pw mahi";
            Process process = new Process();
            process.StartInfo = startinfo;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardInput = true;
            process.Start();
            process.StandardInput.WriteLine("ls");
            process.WaitForExit();
            Console.ReadKey();
        }
    }