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

王林
Freigeben: 2024-02-10 08:42:08
nach vorne
674 Leute haben es durchsucht

无法从 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))
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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

#!/usr/bin/env python

import subprocess

subprocess.run(["op", "item", "list"])
Nach dem Login kopieren

...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))
}
Nach dem Login kopieren

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]
Nach dem Login kopieren
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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!