【问题标题】:Putty - Delete files dynamically using C#Putty - 使用 C# 动态删除文件
【发布时间】:2015-01-02 14:40:00
【问题描述】:

我正在开发一个使用 C# 作为编程语言的 Windows 应用程序。

要求是

  1. 动态登录腻子
  2. 从特定位置删除旧文件

我目前正在使用以下代码登录腻子,但是我如何运行删除命令??

string hostname = "hostname";
string login = "login";
string password = "password";
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"C:\Putty\putty.exe";
startInfo.Arguments = string.Format("{0}@{1} -pw {2}", login, hostname, password);
startInfo.Start();

我想传递这样的东西

rm myFile*.txt

但在此之前我必须通过

导航到特定位置
cd /dir1/dir2/NewFolder

我想删除NewFolder下的所有.txt文件??

【问题讨论】:

    标签: c# c#-3.0 putty


    【解决方案1】:

    Putty 具有命令行选项-m {script_file},它允许您指定要针对远程服务器运行的脚本文件。运行完所有命令后,putty 将退出。

    您可以将要运行的命令保存在脚本文件中,调用 Putty,并在完成后删除脚本文件。

    以下代码适用于我:

    string hostname = "hostname";
    string login = "login";
    string password = "password";
    string command = "rm ~/dir1/dir2/NewFolder/*.txt"; // modify this to suit your needs
    
    const string scriptFileName = @"remote_commands.sh";
    File.WriteAllText(scriptFileName, command);
    
    var startInfo = new ProcessStartInfo();
    startInfo.FileName = @"C:\Putty\putty.exe";
    startInfo.Arguments = string.Format("{0}@{1} -pw {2} -m {3}", 
                                         login, hostname, password, scriptFileName);
    
    var process = new Process {StartInfo = startInfo};
    process.Start();
    process.WaitForExit();
    
    File.Delete(scriptFileName);
    

    如果您只想向服务器发送一条命令,那么这个解决方案就可以了。如果您需要更高级的功能,例如读取服务器响应,您应该查看Thomas' answer

    编辑:

    以下是如何使用 plink 运行命令并获取其输出:

    string hostname = "hostname";
    string login = "login";
    string password = "password";
    
    var startInfo = new ProcessStartInfo();
    startInfo.FileName = @"C:\Putty\plink.exe";
    startInfo.RedirectStandardInput = true;
    startInfo.RedirectStandardOutput = true;
    startInfo.UseShellExecute = false;
    startInfo.Arguments = string.Format("{0}@{1} -pw {2}",
                                            login, hostname, password);
    
    using (var process = new Process {StartInfo = startInfo})
    {
        process.Start();
    
        process.StandardInput.WriteLine("ls");
        process.StandardInput.WriteLine("echo 'run more commands here...'");
        process.StandardInput.WriteLine("exit"); // make sure we exit at the end
    
        string output = process.StandardOutput.ReadToEnd();
        Console.WriteLine(output);
    }
    

    【讨论】:

    • 我收到异常 - “进程对象必须将 UseShellExecute 属性设置为 false 才能使用环境变量”。 [执行上述代码时]-请帮助
    • @Coder2014 不知道为什么;它对我来说非常有效。尝试在new Process(... 行之前插入startInfo.UseShellExecute = false;
    • 谢谢它的工作!有什么方法可以验证命令是否执行。我知道你提到要检查托马斯的答案。但是在使用它时,我无法获得 p.StandardOutput。你能帮忙吗!
    • @Coder2014 刚刚试了一下,效果很好。请查看我的答案的更新。
    【解决方案2】:

    我不知道这是否有帮助,因为我无法正确尝试,但它可以引导您走向正确的方向。试试这样的:

    string hostname = "hostname";
    string login = "login";
    string password = "password";
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.UseShellExecute = false;
    startInfo.RedirectStandardInput = true;
    startInfo.FileName = @"C:\Putty\plink.exe";
    startInfo.Arguments = string.Format("{0}@{1} -pw {2}", login, hostname, password);
    
    Process p = new Process();
    p.StartInfo = startInfo;
    p.Start();
    
    p.StandardInput.WriteLine("cd /dir1/dir2/NewFolder");
    

    您应该尝试“plink”,它是 Putty 的命令行版本。使用您指定的startInfo.RedirectStandardInput,您可以使用p.StandardInput.WriteLine() 写入进程的标准输入。这也适用于标准输出,因此您可以读取进程的输出。

    【讨论】:

    【解决方案3】:

    要回答你的问题,我们首先要弄清楚一些事情:

    (1) 您没有登录 PuTTY。您可以使用 PuTTY 建立与远程服务器的连接并启动 shell。因此,您登录到服务器主机名

    (2) PuTTY 是一个为用户提供交互式 shell 的程序。它不打算用作编程接口

    您要查找的是 SSH 客户端库,例如 https://sshnet.codeplex.com/(从未使用过,此处作为示例说明)。此类库允许您使用 .NET 使用预定义的 API 发送命令

    【讨论】:

      猜你喜欢
      • 2014-09-06
      • 1970-01-01
      • 2016-01-09
      • 2020-05-03
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      相关资源
      最近更新 更多