命令没有在c#中的ssh.net下完全执行

问题描述 投票:0回答:1

我正在使用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'

进入终端

c# xen libvirt ssh.net
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.