Parse url in shell-Skript
Habe ich url wie:
sftp://user@host.net/some/random/path
Möchte ich extrahieren Benutzer, host, und Pfad von diesem string. Jeder Teil kann ein zufälliger Länge.
Welche shell? Wie haben Sie versucht, dies zu tun so weit?
Haben Sie verwenden, um ein shell-Skript aus? Ich vermute BASH. können Sie die Verwendung von python statt?
Ich bin versucht, zu schreiben benutzerdefinierte nautilus-shell-script öffnet eine neue ssh-Sitzung im terminal in aktuelle sftp-Sitzung in nautilus unter Ubuntu. Diese url ist $NAUTILUS_SCRIPT_CURRENT_URI global einem bariable. Aber eigentlich hast du Recht, vielleicht kann ich python oder PHP.
Ich Stimme mit den Kommentaren oben, mit Hilfe von perl/python/php vereinfachen vieles. (Dieses Posting nach dem erstellen einer bash-Lösung)
Der zweite Teil der Frage stackoverflow.com/questions/6174906/...
Haben Sie verwenden, um ein shell-Skript aus? Ich vermute BASH. können Sie die Verwendung von python statt?
Ich bin versucht, zu schreiben benutzerdefinierte nautilus-shell-script öffnet eine neue ssh-Sitzung im terminal in aktuelle sftp-Sitzung in nautilus unter Ubuntu. Diese url ist $NAUTILUS_SCRIPT_CURRENT_URI global einem bariable. Aber eigentlich hast du Recht, vielleicht kann ich python oder PHP.
Ich Stimme mit den Kommentaren oben, mit Hilfe von perl/python/php vereinfachen vieles. (Dieses Posting nach dem erstellen einer bash-Lösung)
Der zweite Teil der Frage stackoverflow.com/questions/6174906/...
InformationsquelleAutor umpirsky | 2011-05-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit Python (beste Werkzeug für diesen job, IMHO):
Weiter Lesen:
os.environ
urlparse.urlparse()
Hinzugefügt os.system("gnome-terminal --execute /usr/bin/ssh" + Benutzer + "@" + host) an der Unterseite um die Arbeit zu tun 😉
Erfreut, das zu hören. Ich habe das update meiner Antwort mit einigen links in Fall müssen Sie anpassen.
Das war nicht ein Teil der Frage! In diesem Fall können Sie
[...]ssh result.netloc
zu speichern Aufteilung deruser
von derhost
nur beitreten, um Sie wieder zusammen... (und tun, Weg mit derprint
ruft.)Sicher, wird das tun. Ich Frage mich nur, wie setzt das aktuelle Verzeichnis, wenn ich ssh..
InformationsquelleAutor Johnsyweb
Vorausgesetzt, Ihre URL übergeben als ersten parameter dem Skript:
Ich muss zugeben, dies ist nicht die sauberste Lösung, aber es verlässt sich nicht auf andere scripting
Sprache wie perl oder python.
(Die Bereitstellung einer Lösung mit einem von Ihnen produzieren würde sauberere Ergebnisse 😉 )
Mit Ihrem Beispiel die Ergebnisse sind:
Dies funktioniert auch für URLs ohne Protokoll/Benutzernamen oder den Pfad.
In diesem Fall werden die jeweiligen Variablen enthalten eine leere Zeichenfolge.
[BEARBEITEN]
Wenn Ihr bash-version nicht zurecht mit den Substitutionen (${1/$proto/}) dies versuchen:
Mein schlechtes - ich korrigiert, das original-sample - (ersetzen Sie ${1/$proto} mit ${1/$proto/})
Wenn dies nicht funktioniert, bash-version ist möglicherweise zu alt - ich bin das hinzufügen einer Probe für diesen Fall zu.
Gleichen Fehler. Vielen Dank für die Mühe. Es funktionierte in python sowieso 😉
aktualisiert zum extrahieren der port (das ist etwas komplexer..)
InformationsquelleAutor Shirkrin
Oben, raffiniert (Hinzugefügt Passwort-und port-parsing) und in /bin/sh:
Gepostet b/c ich es brauchte, so schrieb ich es (basierend auf @Shirkin die Antwort, natürlich), und ich dachte, jemand anderes könnte es zu schätzen wissen.
InformationsquelleAutor pjz
Diese Lösung im Prinzip funktioniert genauso wie Adam Ryczkowski ist, in diesem thread - aber hat sich verbessert regulären Ausdruck basiert auf RFC3986, (mit einigen änderungen) und behebt einige Fehler (z.B. userinfo enthalten kann ' _ ' - Zeichen). Dies kann auch verstehen, relative URIs (z.B. zum extrahieren von query oder fragment).
Ja, es hat - natürlich, wenn Sie möchten, um mehr als einen Wert aus URI (wie in der ursprünglichen Frage), dann ist es angemessen extrahieren von Zeichenfolgen aus BASH_REMATCH array (wenn Sie kümmern sich mehr um die Geschwindigkeit als die Lesbarkeit), genau so, wie @adam ryczkowski haben.
Danke. Jedenfalls habe ich die regex für eine Anwendung, die ich laufen haben, in einem docker-container, wo ich nicht wollen, ändern müssen, um jemand anderem docker-image nur, um sed...
InformationsquelleAutor Patryk Obara
Hier ist meine Meinung, basierend auf einigen der vorhandenen Antworten, es kann aber auch fertig mit GitHub SSH-Klon URLs:
gibt
Und für
PROJECT_URL="ssh://[email protected]:29418/jgit/jgit"
erhalten SieInformationsquelleAutor sschuberth
Ich wusste nicht, wie oben genannten Methoden und schrieb mein eigenes. Es ist für ftp-link, ersetzen Sie einfach
ftp
mithttp
wenn Ihr es brauchen.Erste Zeile ist eine kleine Validierung von link, link Aussehen sollte
ftp://user:[email protected]/path/to/something
.Meine eigentliche Ziel war zu überprüfen, ftp-Zugriff per url. Hier ist das vollständige Ergebnis:
InformationsquelleAutor user3132194
Wenn Sie wirklich wollen, es zu tun in der Schale, die Sie tun können, etwas so einfaches wie die folgenden durch die Verwendung von awk. Dies erfordert zu wissen, wie viele Felder, die Sie auch tatsächlich weitergegeben werden (z.B. kein Passwort manchmal und nicht andere).
Wenn Sie nicht haben, awk und grep, und Sie können verlangen, dass jedes Feld mindestens zwei Zeichen lang sein und vernünftigerweise vorhersehbaren in-format, dann kannst du das tun:
InformationsquelleAutor relistan
Nur benötigt, um das gleiche zu tun, so war neugierig, ob es möglich ist, es zu tun in eine einzige Zeile, und dies ist, was ich habe:
Wie es funktioniert:
PS: vorsichtig sein, wenn diese für die willkürliche Eingaben, da diese code ist anfällig für Skript-Injektionen.
InformationsquelleAutor Stam
Wenn Sie Zugriff auf Bash >= 3.0 Sie können dies tun, in reinen bash als auch, Dank der re-match-operator =~:
pattern='^(([[:alnum:]]+)://)?(([[:alnum:]]+)@)?([^:^@]+)(:([[:digit:]]+))?$'
if [[ "http://[email protected]:3142" =~ $pattern ]]; then
proto=${BASH_REMATCH[2]}
user=${BASH_REMATCH[4]}
host=${BASH_REMATCH[5]}
port=${BASH_REMATCH[7]}
fi
Sollte es schneller sein und weniger Ressourcen-hungrig, dann werden die vorherigen Beispiele, da keine externen Prozess erzeugt werden.
InformationsquelleAutor Adam Ryczkowski
Habe ich weitere Analyse, die Erweiterung der Lösung gegeben durch @Shirkrin:
InformationsquelleAutor Lisias