Python 3.x 如何执行govc/pyvmomi run命令,该命令列出本地pc上服务器的输出

Python 3.x 如何执行govc/pyvmomi run命令,该命令列出本地pc上服务器的输出,python-3.x,go,vmware,pyvmomi,govmomi,Python 3.x,Go,Vmware,Pyvmomi,Govmomi,我可以使用govmomi(不是终端中的一行命令govc)列出所有vm,但我正在尝试实现这一点: govc guest.run-vm$vm_name cat sample.txt从头开始,而不是通过govc运行。这些文件似乎令人困惑。有人知道它是如何在底层实现的吗?在pyvmomi中有类似的东西吗?使用Pyvmomi,我能够从本地pc在服务器上执行命令,然后将输出存储在服务器上的文件中,然后将文件从服务器传输到本地pc。但在后期,我遇到了govc guest.run-vm$vm_name cat

我可以使用govmomi(不是终端中的一行命令govc)列出所有vm,但我正在尝试实现这一点:

govc guest.run-vm$vm_name cat sample.txt
从头开始,而不是通过govc运行。这些文件似乎令人困惑。有人知道它是如何在底层实现的吗?在pyvmomi中有类似的东西吗?使用Pyvmomi,我能够从本地pc在服务器上执行命令,然后将输出存储在服务器上的文件中,然后将文件从服务器传输到本地pc。但在后期,我遇到了
govc guest.run-vm$vm_name cat sample.txt
命令,它在本地pc的控制台上提供输出。它是否也在后台将输出临时存储在服务器上?如果没有,如何实施

这是我在尝试使用govmomi列出所有vm时尝试的,我想扩展它,以便它可以实现govc run命令

package main

import (
    "flag"
    "fmt"
    "net/url"
    "os"
    "strings"
    "text/tabwriter"
    "sort"
    "github.com/vmware/govmomi"
    "github.com/vmware/govmomi/find"
    "github.com/vmware/govmomi/property"
    "github.com/vmware/govmomi/vim25/mo"
    "github.com/vmware/govmomi/vim25/types"
    "golang.org/x/net/context"
)

func GetEnvString(v string, def string) string {
    r := os.Getenv(v)
    if r == "" {
        return def
    }

    return r
}

// GetEnvBool returns boolean from environment variable.
func GetEnvBool(v string, def bool) bool {
    r := os.Getenv(v)
    if r == "" {
        return def
    }

    switch strings.ToLower(r[0:1]) {
    case "t", "y", "1":
        return true
    }

    return false
}

const (
    envURL      = "vcenter's_ip"
    envUserName = "username@organisation.org"
    envPassword = "pwd"
    envInsecure = "true"
)

var urlDescription = fmt.Sprintf("ESX or vCenter URL [%s]", envURL)
var urlFlag = flag.String("url", GetEnvString(envURL, "https://username@organisation.org:pwd@ip_of_vcenter/sdk"), urlDescription)

var insecureDescription = fmt.Sprintf("Don't verify the server's certificate chain [%s]", envInsecure)
var insecureFlag = flag.Bool("insecure", GetEnvBool(envInsecure, true), insecureDescription)

func processOverride(u *url.URL) {
    envUsername := os.Getenv(envUserName)
    envPassword := os.Getenv(envPassword)

    // Override username if provided
    if envUsername != "" {
        var password string
        var ok bool

        if u.User != nil {
            password, ok = u.User.Password()
        }

        if ok {
            u.User = url.UserPassword(envUsername, password)
        } else {
            u.User = url.User(envUsername)
        }
    }

    // Override password if provided
    if envPassword != "" {
        var username string

        if u.User != nil {
            username = u.User.Username()
        }

        u.User = url.UserPassword(username, envPassword)
    }
}

func exit(err error) {
    fmt.Fprintf(os.Stderr, "Error: %s\n", err)
    os.Exit(1)
}

type ByName []mo.VirtualMachine

func (n ByName) Len() int           { return len(n) }
func (n ByName) Swap(i, j int)      { n[i], n[j] = n[j], n[i] }
func (n ByName) Less(i, j int) bool { return n[i].Name < n[j].Name }

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    flag.Parse()

    // Parse URL from string
    u, err := url.Parse(*urlFlag)
    if err != nil {
        exit(err)
    }
    fmt.Println(u)

    // Override username and/or password as required
    processOverride(u)

    // Connect and log in to ESX or vCenter
    c, err := govmomi.NewClient(ctx, u, *insecureFlag)
    if err != nil {
        exit(err)
    }

    f := find.NewFinder(c.Client, true)

    // Find one and only datacenter
    dc, err := f.DefaultDatacenter(ctx)
    if err != nil {
        exit(err)
    }

    // Make future calls local to this datacenter
    f.SetDatacenter(dc)

    // Find virtual machines in datacenter
    vms, err := f.VirtualMachineList(ctx, "in-temp-vm-2")// if instead of "in-temp-vm-2" *, then it lists down all the vm's
    //fmt.Println(vms)
    if err != nil {
        exit(err)
    }

    //fmt.Println(vms);

    pc := property.DefaultCollector(c.Client)

    // Convert datastores into list of references
    var refs []types.ManagedObjectReference

    for _, vm := range vms {
        refs = append(refs, vm.Reference())
    }

    // Retrieve name property for all vms
    var vmt []mo.VirtualMachine

    err = pc.Retrieve(ctx, refs, []string{"name"}, &vmt)
    if err != nil {
        exit(err)
    }

    tw := tabwriter.NewWriter(os.Stdout, 2, 0, 2, ' ', 0)
    fmt.Println("Virtual machines found:", len(vmt))
    sort.Sort(ByName(vmt))

    for _, vm := range vmt {
        fmt.Fprintf(tw, "%s\n", vm.Name)
    }
    tw.Flush()
}
这是我的python实现,它执行命令并将其存储在服务器上的一个文件中,然后我将该文件从服务器传送到本地pc,我不想在服务器上存储任何东西,即使是暂时的:

from pyVim import connect
from config import *
from pyVmomi import vim, vmodl
import ssl
import os
import requests

service_instance = connect.SmartConnect(host="xxxx", port=aaa,user="yyy" , pwd=pwd,sslContext=ssl._create_unverified_context())

content = service_instance.RetrieveContent()

# # Find a VM
vm = searcher.FindByIp(ip="aaaa", vmSearch=True)

creds = vim.vm.guest.NamePasswordAuthentication(username='root', password=vmpwd)

pm = service_instance.content.guestOperationsManager.processManager


#executes and saves sample.txt into server
ps = vim.vm.guest.ProcessManager.ProgramSpec(programPath='/usr/bin/python', arguments='--version  &> sample.txt')
res = pm.StartProgramInGuest(vm, creds, ps)

dest="/Users/username/Desktop/vcenter/sample.txt" #My local pc

src="/root/sample.txt" #Server's directory
fti = content.guestOperationsManager.fileManager.InitiateFileTransferFromGuest(vm, creds, src)

resp=requests.get(fti.url, verify=False)

#Writes into file
with open(dest, 'wb') as f:
        f.write(resp.content)

不确定这一点,但您使用什么shell通过golang在esxi中执行命令?我试过
/bin/sh
/bin/bash
,但都没有用。我用过zsh。但是bash应该也能工作。尝试了bash和sh,但显示了exec错误。
from pyVim import connect
from config import *
from pyVmomi import vim, vmodl
import ssl
import os
import requests

service_instance = connect.SmartConnect(host="xxxx", port=aaa,user="yyy" , pwd=pwd,sslContext=ssl._create_unverified_context())

content = service_instance.RetrieveContent()

# # Find a VM
vm = searcher.FindByIp(ip="aaaa", vmSearch=True)

creds = vim.vm.guest.NamePasswordAuthentication(username='root', password=vmpwd)

pm = service_instance.content.guestOperationsManager.processManager


#executes and saves sample.txt into server
ps = vim.vm.guest.ProcessManager.ProgramSpec(programPath='/usr/bin/python', arguments='--version  &> sample.txt')
res = pm.StartProgramInGuest(vm, creds, ps)

dest="/Users/username/Desktop/vcenter/sample.txt" #My local pc

src="/root/sample.txt" #Server's directory
fti = content.guestOperationsManager.fileManager.InitiateFileTransferFromGuest(vm, creds, src)

resp=requests.get(fti.url, verify=False)

#Writes into file
with open(dest, 'wb') as f:
        f.write(resp.content)