Команда не полностью выполняется под ssh.net в C # - PullRequest
0 голосов
/ 07 сентября 2018

Я беру строку, сгенерированную 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-пароль: toor --firstboot-command 'reboot «

в терминал

1 Ответ

0 голосов
/ 13 сентября 2018

Решение состоит в том, чтобы использовать sshclient.CreateShellStream (), чтобы ssh api не возвращался только потому, что ничего не было возвращено при выполнении в оболочке.

...