在 c# 中的 ssh.net 下命令未完全执行
Command not fully executing under ssh.net in c#
我将 constructVirtBuilderCommand 生成的字符串用作我的服务器在 xen 中生成图像所需的命令。然而,命令 returns multiple things 因为它通知您在下载图像的过程中在 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] Resizing(使用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] Resizing(使用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 命令 'reboot'
进入终端
解决方案是使用 sshclient.CreateShellStream(),这样 ssh api 就不会 return 只是因为在 shell.
我将 constructVirtBuilderCommand 生成的字符串用作我的服务器在 xen 中生成图像所需的命令。然而,命令 returns multiple things 因为它通知您在下载图像的过程中在 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] Resizing(使用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] Resizing(使用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 命令 'reboot'
进入终端
解决方案是使用 sshclient.CreateShellStream(),这样 ssh api 就不会 return 只是因为在 shell.