【问题标题】:Command not fully executing under ssh.net in c#在 c# 中的 ssh.net 下命令未完全执行
【发布时间】:2018-09-06 23:39:25
【问题描述】:

我正在获取由constructVirtBuilderCommand 生成的字符串,并将其用作我的服务器在xen 中生成图像所需的命令。但是,该命令会返回多个内容,因为它会通知您在下载映像过程中在 libvirt 中执行的多个步骤,返回的第一个(也是唯一一个)内容是“[2.5] 下载:http://libguestfs.org/download/builder/ubuntu-18.04.xz”,但这只是整个输出中的一行:

[3.2]下载:http://libguestfs.org/download/builder/ubuntu-18.04.xz

[4.7] 规划如何构建此映像

[4.7] 解压缩

[14.7] 调整大小(使用 virt-resize)将磁盘扩展至 15.0G

[497.3] 安装 firstboot 命令:reboot

[497.7] 设置密码

[510.8] 结束

         Output file: test.img
         Output size: 15.0G
         Output format: raw
         Total usable space: 14.7G
         Free space: 13.2G (99%)

这似乎给我带来了问题。因为该命令在返回之前没有完全执行。有没有人有过这个问题的经验?没有为我下载图像 - 如果它只存在片刻,并且一旦开始下载另一个图像,文件就会突然消失。我尝试了一些方法来强制我的客户等待它完成下载图像。第一个是将“| grep Finishing”附加到命令的末尾。我尝试的第二件事是“> file.txt”在命令完全执行后生成此文件,但效果不佳。

谁能帮我弄清楚如何让 libvirt 完全执行这个命令?如果我在我的服务器上通过 ssh 手动输入它,它就可以正常工作。谢谢!

    private String constructVirtBuilderCommand()
    {
        String virt_builder_command = "sudo virt-builder ";
        virt_builder_command += operating_system_comboBox.SelectedItem.ToString();
        virt_builder_command += "-";
        virt_builder_command += operating_system_version_comboBox.SelectedItem.ToString();
        virt_builder_command += " --arch ";
        virt_builder_command += operating_system_architecture_comboBox.SelectedItem.ToString();
        virt_builder_command += " -o nodeand#.img --size ";
        virt_builder_command += storage_textBox.Text;
        virt_builder_command += "G --root-password password:toor --firstboot-command 'reboot'";
        return virt_builder_command;
    }



    private void add_new_cluster_button_Click(object sender, EventArgs e)
    {

        if (new_cluster_name_textBox.Text != "")
        {

            String virtbuilder = constructVirtBuilderCommand();
            String virtinstaller = constructVirtInstallCommand();
            for (int i=0;i<Int32.Parse(number_of_vms_textBox.Text);i++)
            {
                String tmp_virtbuilder_command = virtbuilder.Replace("nodeand#", new_cluster_name_textBox.Text + i.ToString());
                String tmp_virtbuilder_result = sshclient.CreateCommand(tmp_virtbuilder_command).Execute();
                Console.WriteLine(tmp_virtbuilder_result);      
            }
            label19.Text = "completed";
        }
        else
        {
            // some error message popup
        }
    }

编辑:

1) 延长超时时间似乎有助于使其进一步进入命令。但是由于某种原因,下载的文件在下一次图像下载迭代中被删除。如果超时通过以下方式延长:sshclient.ConnectionInfo.Timeout = TimeSpan.FromSeconds(1000); 然后我可以在输出中达到这一点:

[3.2]下载:http://libguestfs.org/download/builder/ubuntu-18.04.xz

[4.7] 规划如何构建此映像

[4.7] 解压缩

[14.7] 调整大小(使用 virt-resize)将磁盘扩展至 15.0G

不需要将超时延长到更长的时间,因为这一切都应该很快执行。我只是将其设置为 1000 秒以确保这不是主要问题。

2) 如果要重新创建预期的输出,请输入:sudo virt-builder centos-7.1 --arch x86_64 -o testc0.img --size 15G --root-password password:toor --firstboot-command 'reboot '

进入终端

【问题讨论】:

  • @MartinPrikryl 感谢您澄清该方法调用!我最初只是使用 CreateCommand。
  • 好的,那么你在tmp_virtbuilder_result 中得到了什么,在shell 中执行相同的命令时你通常会得到什么?
  • @MartinPrikryl 如果您想查看返回的内容,这是一个示例命令: sudo virt-builder centos-7.1 --arch x86_64 -o testc0.img --size 15G --root-password 密码:toor --firstboot-command '重启'
  • @MartinPrikryl 我得到 [2.5] 正在下载:libguestfs.org/download/builder/ubuntu-18.04.xz,这只是打印到屏幕上的一系列信息中的第一行。我认为这里的问题是返回了多个内容,下载文件的完成百分比为 0-100%。以及有关图像配置的信息。我会展示它应该返回的内容,但 virt-buidler 不在 Windows 上运行。我怀疑它需要像“ls”这样的命令用于 Execute 方法,所以它认为只有一件事打印到屏幕而不是多行。
  • @MartinPrikryl 这就是为什么我试图通过使用“| grep Finishing”(最后一行的旁边)和“> file.txt”来欺骗它。但这些尝试并没有按预期工作。

标签: c# xen libvirt ssh.net


【解决方案1】:

解决方案是使用 sshclient.CreateShellStream() 以便 ssh api 不会因为在 shell 中执行没有返回任何内容而返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2019-10-19
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2012-11-06
    相关资源
    最近更新 更多