Heim  >  Artikel  >  Backend-Entwicklung  >  „Op“ kann nicht über die Go-Anwendung ausgeführt werden

„Op“ kann nicht über die Go-Anwendung ausgeführt werden

王林
王林nach vorne
2024-02-10 08:42:08669Durchsuche

无法从 Go 应用程序运行“op”

php-Editor Yuzai kann beim Entwickeln von Anwendungen mit der Go-Sprache auf ein häufiges Problem stoßen, nämlich dass „op“ nicht von der Go-Anwendung aus ausgeführt werden kann. Dieses Problem kann dazu führen, dass die Anwendung nicht ordnungsgemäß funktioniert oder eine Fehlermeldung anzeigt. Es gibt viele Möglichkeiten, dieses Problem zu lösen. Dies kann gelöst werden, indem überprüft wird, ob das entsprechende Paket korrekt in den Code importiert wird, oder indem die entsprechenden Abhängigkeiten neu installiert werden. Probieren Sie auch andere Tools oder Methoden aus, um das Problem zu lösen. Ich hoffe, dass die Einführung in diesem Artikel Entwicklern helfen kann, die auf dieses Problem stoßen.

Frageninhalt

Ich versuche, eine kleine Go-Wrapper-Anwendung um die ausführbare 1password-CLI-Datei zu schreiben op wie folgt:

package main

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

func main() {
    op := exec.command("op", "item", "list")
    out, err := op.output()
    if e, ok := err.(*exec.exiterror); ok {
        log.fatal(e, ": ", string(e.stderr))
    }
    fmt.println(string(out))
}

Allerdings erhalte ich immer wieder die folgende Fehlermeldung:

2023/04/13 09:48:51 exit status 1: [error] 2023/04/13 09:48:51 error initializing client: connecting to desktop app: read: connection reset, make sure the cli is correctly installed and connect with 1password cli is enabled in the 1password app

Aber wenn ich dasselbe mit einem Python-Skript wie diesem mache:

#!/usr/bin/env python

import subprocess

subprocess.run(["op", "item", "list"])

...Ich erhalte einen großartigen Output.

Interessanterweise funktioniert es einwandfrei, wenn ich das Python-Skript (mit dem Namen op.py) aus der Go-Anwendung aufrufe (die modifizierte Go-Anwendung sieht so aus):

package main

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

func main() {
    op := exec.Command("/usr/bin/python3.11", "./op.py")
    //op := exec.Command("op", "item", "list")
    out, err := op.Output()
    if e, ok := err.(*exec.ExitError); ok {
        log.Fatal(e, ": ", string(e.Stderr))
    }
    fmt.Println(string(out))
}

Ich kann testen, ob es von der Go-Anwendung und nicht vom Python-Skript gedruckt wird, denn wenn ich das fmt.printf(...) entferne, wird nichts gedruckt.

Zusammenfassend:

  • go -> op: funktioniert nicht
  • python(./op.py)-> ./op.py)-> opgo -> python (./op.py) ->
  • ./op.py) -> opProblemumgehung
Ich bin auf das gleiche Problem gestoßen, als ich aus einer virtuellen pyenv-Umgebung auf zugegriffen habe. Ich denke, das Problem besteht darin, dass die ausführbare python-Datei von pyenv dem Benutzer (mir) gehört.

Es hilft tatsächlich, den Besitzer des Python-Interpreters und des Verzeichnisses, in dem er sich befindet, auf „root:root“ zu ändern. Ich bin mir nicht sicher, was sich hinter den Kulissen abspielt.

Hier sind die Schritte (ich habe pyenv 虚拟环境访问 op 时遇到同样的问题。我认为问题是 pyenv 的 python verwendet, um die virtuelle Umgebung zu erstellen, damit sie keine Symlinks verwendet – da Symlinks auf Dateien verweisen würden, die Root gehören):

$ python -m venv --copies .venv
$ .venv/bin/python -c "import subprocess; subprocess.call(['op', 'signin'])"
[ERROR] 2023/05/16 16:01:18 connecting to desktop app: read: connection reset, make sure the CLI is correctly installed and Connect with 1Password CLI is enabled in the 1Password app
# chown -R root:root .venv/
$ .venv/bin/python -c "import subprocess; subprocess.call(['op', 'signin'])"
 Select account  [Use arrows to move, type to filter]
Fazit: Ändern Sie den Besitzer der ausführbaren Datei, die den

untergeordneten Prozess erzeugt hat (und das Verzeichnis, in dem er sich befindet) in root:root

--copies Sehen Sie sich auch diesen Beitrag zu 1password an, der das gleiche Problem zu sein scheint:

op 子进程的可执行文件(及其所在目录)的所有权更改为 root:roothttps://1password.community/discussion/135768/call-from-a-go-program-cli-

Das obige ist der detaillierte Inhalt von„Op“ kann nicht über die Go-Anwendung ausgeführt werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Adaptermuster in GolangNächster Artikel:Adaptermuster in Golang