So debuggen Sie Programme mit “sudo” in VSCODE

Lesezeit: 6 Minuten

Ich versuche, ein Programm in VSCODE zu debuggen. Das Programm muss als root oder mit “sudo” auf Ubuntu gestartet werden. Was ist der beste Weg, dies zu erreichen? Eine beispielhafte Startkonfiguration wäre hilfreich. Vielen Dank.

  • Die einzige Möglichkeit, einen als Root ausgeführten Prozess zu debuggen, besteht darin, einen als Root ausgeführten Debugger zu verwenden. Dies ist ein grundlegender Aspekt des POSIX-Sicherheitsmodells. Vscode kann nichts dagegen tun. Sie müssen also vscode als root ausführen.

    – Sam Varshavchik

    14. Oktober 2016 um 1:00 Uhr

  • @SamVarshavchik: Zumindest unter Linux debuggt vscode, indem es einen Debugger (gdb oder lldb) als separaten Prozess aufruft, dessen Pfad als angegeben ist miDebuggerPath ist eine Datei namens launch.json. Sie können wahrscheinlich angeben sudo /usr/bin/gdbaber Sie werden wahrscheinlich auch verwenden wollen --askpass um einen alternativen Weg zum Abrufen von Anmeldeinformationen anzugeben, da der Benutzer wahrscheinlich nicht direkt mit interagieren kann sudo zu authentifizieren.

    – Jerry Sarg

    14. Oktober 2016 um 1:34 Uhr

  • Relevant.

    – Jerry Sarg

    14. Oktober 2016 um 2:01 Uhr

Benutzer-Avatar
Chetan

Ich war kürzlich in einer ähnlichen Situation. Ich habe es gelöst, indem ich {“sudo”: true} in der Datei launch.json im Verzeichnis .vscode hinzugefügt habe.

habe gerade die folgende Zeile in .vscode>launch.json hinzugefügt

{
    "version": "0.2.0",
    "configurations": [
        {
            "other..." : "configs...",
            "request": "launch",
            "console": "integratedTerminal",
            "args": [
                "${file}"
            ],
            "sudo": true
        }
    ]
}

VS-Code-Version, die ich verwende, ist –

Version: 1.49.1 Betriebssystem: Ubuntu 16.04 LTS, 64-Bit

Dies scheint nicht in allen Sprachen zu funktionieren. Für mich hat es für Python 3.x funktioniert. Andere Benutzer haben berichtet, dass es für C/C++ nicht funktioniert.

  • Dies funktioniert nicht beim Debuggen von C/C++-Code, vielleicht für andere Sprachen? (OP hat keine Sprache angegeben)

    – Payne

    20. Dezember 2020 um 16:36 Uhr

  • Entschuldigung, dass ich die Sprache nicht erwähnt habe. Es war Python 3.x

    – Chetan

    21. Dezember 2020 um 16:23 Uhr

  • Dies funktionierte für mich auf Python3.6 und mit einem Remote-Computer.

    – Alan Abraham

    20. Juli 2021 um 22:00 Uhr

Ich habe folgendes gemacht:

  1. Erstellen Sie ein Skript namens “gdb” in z. B. meinem Home-Verzeichnis, das Folgendes enthält:
    pkexec /usr/bin/gdb "$@"
  2. ausführbar machen
  3. ändern Sie die launch.json in VSCode, um das Skript aufzurufen (offensichtlich change Nutzername entsprechend) durch Hinzufügen von “miDebuggerPath”:
...
            "externalConsole": false,
            "miDebuggerPath": "/home/<username>/gdb",
            "MIMode": "gdb",
...
  1. Verwenden Sie beim Debuggen top oder Ähnliches, um zu überprüfen, ob der Prozess als Root ausgeführt wird.

Das sollte genug sein.

  • Super hilfreich. Wenn ich nur wüsste, wie ich pkexec dazu bringen kann, sich mein Passwort zu merken! Ein weiterer Hinweis, der VSCode ist, beendet die Debugsitzung nicht, wenn Sie die Eingabeaufforderung abbrechen.

    – Ashley Duncan

    6. April 2020 um 0:39 Uhr

  • Funktioniert nicht mit kennwortloser schlüsselbasierter Authentifizierung.

    – Alex Jansen

    9. November 2021 um 8:30 Uhr

Meine Lösung:

hinzufügen /usr/bin/gdb zu /etc/sudoers wie hier

fügen Sie eine ausführbare Datei hinzu, deren Inhalt ist

sudo /usr/bin/gdb "$@"

einstellen miDebuggerPath zur Datei

  • Benutzername ALL=(ALL) NOPASSWD:/usr/bin/gdb. Das hat funktioniert. Ja, das ist scheiße, dass wir sudo für gdb hinzugefügt haben. Sicherheitslücke und so, aber ich arbeite an einem total lokalen Szenario mit einem Raspberry Pi, der ein IoT-Gerät ist, das nie in Produktion geht, also funktioniert es für mich.

    – Sanjeev Dwivedi

    2. Januar 2021 um 22:05 Uhr


  • Diese Lösung hat bei mir funktioniert, als ich an einem entfernten Ubuntu-Ziel gearbeitet habe. Beachten Sie nur, dass es besser ist, hinzuzufügen ALLE ALLE=(ALLE) NOPASSWD:/usr/bin/gdb in einer separaten Datei im Ordner /etc/sudoers.d, als die Datei /etc/sudoers zu ändern

    – Ivar Simensen

    1. Juni 2021 um 7:04 Uhr

  • es funktioniert für mein C++-Projekt, wenn ich auf einem Remote-Ubuntu-Server arbeite.

    – Aufkleber

    8. Juni um 21:49 Uhr

Sie wissen nicht, wie Sie vscode dazu bringen, sudo gdb auszuführen. Aber Sie können sudo verwenden, um vscode auszuführen, so dass Sie natürlich gdb zum Debuggen verwenden können.

sudo-Code. –user-data-dir=”.”

Wie aus den vorherigen Antworten musste ich die Methode mit einer ausführbaren Datei im Home-Verzeichnis wie: /home/youruser/gdbasroot verwenden

Aber ich musste den Inhalt verwenden:

sudo /usr/bin/gdb “$@”

anstelle von gdbk, weil ich gdbk nicht zum Laufen bringen konnte, ohne nach einem Passwort zu fragen (was nicht funktionierte, da es vom vscode-Remote-Debugger aufgerufen wurde). Ich habe es gemäß diesem Beitrag getan (die positiv bewertete und akzeptierte Antwort):

https://askubuntu.com/questions/542397/change-default-user-for-authentication

Wenn Sie sudo verwenden, können Sie im vscode-Terminal einen sudo-Befehl ausführen und von da an können Sie den “sudo-Debugger” ohne das Passwort verwenden. Andernfalls wird vscode aufgefordert und kann damit nicht umgehen.

Grüße

Ich habe folgendes gemacht:

  1. versuchen, was Jason tat
  2. müde mit endlosen lästigen Dialogfeldern für das Passwort
  3. Schreiben Sie ein Python-Skript, um das zu lösen

launch.json:

...
"externalConsole": false,
"miDebuggerPath": "${workspaceFolder}/scripts/gdb_root.py",
"MIMode": "gdb",
...

gdb_root.py:

#!/usr/bin/python3
import os
import sys
import stat
import time
import json
import hashlib
from pathlib import Path

GRANT_EXPIRE_SEC = 2 * 60 * 60
TARGET_EXECUTABLE = '/usr/bin/gdb'
TMP_BIN_DIR = '/tmp/exec_as_root'


class ExecFailed(Exception):
    pass


def instance_hash(argv):
    command = ' '.join(argv)
    return hashlib.md5(command.encode()).hexdigest()


def write_c_code(path, argv):
    CODE_TEMPLATE = '''
    #include <time.h>
    #include <stdlib.h>
    #include <unistd.h>

    int main(int argc, char *argv[])
    {
        int test_mode = (argc > 1);
        if (time(NULL) > (time_t)EXPIRE) {
            char path[1024] = { 0 };
            readlink("/proc/self/exe", path, sizeof(path));
            unlink(path);
            return !test_mode;
        }

        if (!test_mode)
            execl(PARAMS, NULL);

        return 0;
    }'''

    expire = time.time() + GRANT_EXPIRE_SEC
    params = [argv[0]] + argv
    params = json.dumps(params)[1:-1]
    content = CODE_TEMPLATE \
        .replace('EXPIRE', str(expire)) \
        .replace('PARAMS', params)

    with open(path, 'w') as f:
        f.write(content)


def system(cmd):
    is_ok = os.system(cmd) == 0
    if not is_ok:
        cmd_str = json.dumps(cmd)
        summary = 'failed to execute:'
        os.system(f'notify-send -- "{summary}" {cmd_str}')
        raise ExecFailed()


def build_instance(instance, argv):
    c_file = instance.with_suffix('.c')
    write_c_code(c_file, argv)
    compile_cmd = f'gcc -o {instance} {c_file}'
    system(compile_cmd)


def did_grant_root(file):
    fs = os.stat(file)
    root_own = (fs.st_uid == 0)
    uid_set = fs.st_mode & stat.S_ISUID
    return root_own and uid_set


def grant_root(file):
    setuid_cmd = f'chown root:root {file}; chmod 4111 {file}'
    pkexec_cmd = f'pkexec bash -c "{setuid_cmd}"'
    system(pkexec_cmd)


def main():
    bin_dir = Path(TMP_BIN_DIR)
    bin_dir.mkdir(exist_ok=True)

    argv = [TARGET_EXECUTABLE] + sys.argv[1:]
    instance = bin_dir / instance_hash(argv)

    if instance.exists():
        system(f'{instance} test')

    if not instance.exists():
        build_instance(instance, argv)

    if not did_grant_root(instance):
        grant_root(instance)

    os.execv(instance, [instance.name])


if __name__ == '__main__':
    try:
        main()
    except ExecFailed:
        exit(1)

Dies ist eine tragbare Lösung, keine Auswirkung auf das System, und vergessen Sie nicht: chmod +x scripts/gdb_root.py

Benutzer-Avatar
Matej Vargovčík

Dies funktionierte für Java, aber vielleicht auch für andere Sprachen:

Beim ersten Ausführen einer Debug-Sitzung erstellt VSCode ein Terminal namens eg Debug: Main. Öffnen Sie einfach das Terminal, drücken Sie Strg + C, geben Sie einsudo sugeben Sie Ihr Passwort ein und beim nächsten Mal wird die Debug-Sitzung von diesem Terminal mit Root-Rechten gestartet

1369420cookie-checkSo debuggen Sie Programme mit “sudo” in VSCODE

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy