Как получить вывод из os.exec в go

Я пытаюсь получить системный вывод из следующего кода

cmdString := "lxc exec " + containerName + " -- ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | cut -d/ -f1"
ip, err := exec.Command("bash", "-c", cmdString).Output()
fmt.Println(ip)

Приведенный выше код должен получить IP-адрес из контейнера LXC.

Фактический результат go: []

Я также пробовал следующее

ip, err := exec.Command("lxc", "exec ", containerName, " --", "ip addr show eth0", "|", "grep", "'inet\b'", "| awk '{print $2}'", "| cut -d/", "-f1").Output()
fmt.Println(ip)

Я все еще получаю просто [] в качестве вывода

Правильный вывод из командной строки, как показано ниже

[root@localhost toolbox]# lxc exec simon -- ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | cut -d/ -f1
10.183.201.38

Любые идеи, что я делаю неправильно?

Вы передаете всю строку в качестве одного аргумента оболочке. Передайте []string, содержащий каждый отдельный аргумент в этой строке, включая перенаправления.

Burak Serdar 12.02.2023 22:24

Я только что изменил свой код обратно на ip, err := exec.Command("lxc", "exec ", containerName, " --", "ip addr show eth0", "|", "grep", "'inet\b'", "| awk '{print $2}'", "| cut -d/", "-f1").Output() fmt.Println(ip) Результат все еще []

PrestonDocks 12.02.2023 22:33

Это недопустимая команда. проверьте ошибку или stderr, если вы не получили ожидаемый результат

JimB 12.02.2023 22:37

@JimB Вы имеете в виду, что код перехода неверен или команда LXC неверна? Команда LXC отлично работает в командной строке. См. пример внизу моего вопроса.

PrestonDocks 12.02.2023 22:42

Я имею в виду, что то, что вы написали в комментарии, бессмысленно. " --" неправильно цитируется, "|" не является аргументом для lcx, это встроенная оболочка, "awk" является отдельной командой и т. д. На первый взгляд первая выглядит так, как будто она должна работать в оболочке, поэтому проверьте наличие ошибок или stderr, чтобы понять что не работает.

JimB 12.02.2023 22:44
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
1
5
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прочитайте этот код, тогда вы сможете понять, как читать стандартный вывод результата.

package main

import (
    "bytes"
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("/usr/bin/ls")
    buf := bytes.Buffer{}
    cmd.Stdout = &buf
    err := cmd.Run()

    fmt.Println(buf.String(), err)
}

Другие вопросы по теме