{"id":4607,"date":"2025-12-21T11:13:10","date_gmt":"2025-12-21T10:13:10","guid":{"rendered":"https:\/\/vielhuber.de\/?p=4607"},"modified":"2026-01-14T12:09:45","modified_gmt":"2026-01-14T11:09:45","slug":"git-ohne-ssh","status":"publish","type":"post","link":"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/","title":{"rendered":"Git ohne SSH"},"content":{"rendered":"\n<p>Wer kennt es nicht: Man muss auf einem g\u00fcnstigen Shared-Hosting-Paket (z.B. bei IONOS) schnell mal <code>git pull<\/code> ausf\u00fchren oder eine Datenbank nutzen, aber der Hoster gew\u00e4hrt keinen SSH-Zugang \u2013 oder nur in teureren Tarifen.&nbsp;Oft bleibt einem dann nur der m\u00fchsame Weg, Dateien manuell via FTP hochzuladen, was Deployments unn\u00f6tig kompliziert und fehleranf\u00e4llig macht.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Ein m\u00f6glicher Workaround ist das Mounten des Dateisystems via <code>sshfs<\/code>. Das klingt in der Theorie gut: Man bindet den Remote-Ordner lokal ein und arbeitet so, als l\u00e4gen die Dateien auf dem eigenen Rechner. Daf\u00fcr erstellt man lediglich ein lokales Verzeichnis und verbindet dieses \u00fcber den FTP\/SSH-User mit dem Server. Die notwendigen Befehle, um die Verbindung herzustellen und Git f\u00fcr diesen Ordner vorzubereiten, sehen unter Linux wie folgt aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get install sshfs\nmkdir \/var\/www\/remote\ncd \/var\/www\/remote\nsshfs username@your.host:\/ -p 22 \/var\/www\/remote\ngit config --global --add safe.directory \/var\/www\/remote\ngit status\n...\numount \/var\/www\/remote<\/code><\/pre>\n\n\n\n<p>Das Problem: Die Performance ist unterirdisch. Da Git f\u00fcr Befehle wie <code>git status<\/code> tausende kleine Dateioperationen durchf\u00fchrt und jede davon \u00fcber das Netzwerk muss, wartet man oft minutenlang auf einfache R\u00fcckmeldungen. Produktives Arbeiten ist so kaum m\u00f6glich. Gerade bei Projekten mit vielen Dependencies friert das Terminal dabei oft komplett ein, sodass man den Prozess entnervt abbrechen muss.<\/p>\n\n\n\n<p>Genau f\u00fcr dieses Szenario gibt es Libraries wie <a href=\"https:\/\/github.com\/vielhuber\/ftpsh\" target=\"_blank\" rel=\"noreferrer noopener\">ftpsh<\/a>. Die Library erm\u00f6glicht es, Shell-Befehle auf einem Remote-Server auszuf\u00fchren, der nur (S)FTP- und HTTP-Zugang bietet. Der Trick dabei: Es wird tempor\u00e4r ein PHP-Skript hochgeladen, das gegebene Befehle ausf\u00fchrt und den Output zur\u00fcckliefert. Das passiert alles im Hintergrund, f\u00fchlt sich aber an wie eine echte Shell.<\/p>\n\n\n\n<p>Die Installation geht schnell von der Hand:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir ftpsh\ncd ftpsh\nwget -O ftpsh.sh https:\/\/raw.githubusercontent.com\/vielhuber\/ftpsh\/main\/ftpsh.sh\nchmod +x ftpsh.sh<\/code><\/pre>\n\n\n\n<p>Danach legen wir eine .env an mit den (S)FTP-Zugangsdaten an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HOST=your-server.com\nPORT=22\nUSERNAME=your-username\nPASSWORD=your-password\nREMOTE_PATH=\"\/\"\nWEB_URL=\"https:\/\/your-server.com\"<\/code><\/pre>\n\n\n\n<p>Nun k\u00f6nnen wir beliebige Befehle auf dem Server ausf\u00fchren, sofern die Tools remote verf\u00fcgbar sind:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ftpsh git status\nftpsh \"mysqldump -h xxx --port 3306 -u xxx -p\\\"xxx\\\" --routines xxx\" &gt; dump.sql<\/code><\/pre>\n\n\n\n<p>Das Skript l\u00e4dt im Hintergrund einen Worker hoch, f\u00fchrt den Befehl lokal auf dem Server aus (wo er schnell ist) und liefert das Ergebnis zur\u00fcck. Damit lassen sich Deployments, Datenbank-Dumps oder Git-Operationen auch auf eingeschr\u00e4nkten Hosting-Umgebungen performant automatisieren. Es spielt beispielsweise auch perfekt mit <a href=\"https:\/\/github.com\/vielhuber\/syncdb\" target=\"_blank\" rel=\"noreferrer noopener\">syncdb<\/a> zum Synchronisieren von Datenbanken zusammen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer kennt es nicht: Man muss auf einem g\u00fcnstigen Shared-Hosting-Paket (z.B. bei IONOS) schnell mal git pull ausf\u00fchren oder eine Datenbank nutzen, aber der Hoster gew\u00e4hrt keinen SSH-Zugang \u2013 oder nur in teureren Tarifen.&nbsp;Oft bleibt einem dann nur der m\u00fchsame Weg, Dateien manuell via FTP hochzuladen, was Deployments unn\u00f6tig kompliziert und fehleranf\u00e4llig macht.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"gtbabel_prevent_lngs":"","gtbabel_alt_lng":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-4607","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-blog"},"acf":[],"yoast_head":"<title>Git ohne SSH &#060; Vielhuber David<\/title>\n<meta name=\"description\" content=\"Wer kennt es nicht: Man muss auf einem g\u00fcnstigen Shared-Hosting-Paket (z.B. bei IONOS) schnell mal git pull ausf\u00fchren oder eine Datenbank nutzen, ab...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Git ohne SSH &#060; Vielhuber David\" \/>\n<meta property=\"og:description\" content=\"Wer kennt es nicht: Man muss auf einem g\u00fcnstigen Shared-Hosting-Paket (z.B. bei IONOS) schnell mal git pull ausf\u00fchren oder eine Datenbank nutzen, aber der\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/\" \/>\n<meta property=\"og:site_name\" content=\"Vielhuber David\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-21T10:13:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-14T11:09:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"700\" \/>\n\t<meta property=\"og:image:height\" content=\"552\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"David\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@vielhuber\" \/>\n<meta name=\"twitter:site\" content=\"@vielhuber\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"David\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"2\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-ohne-ssh\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-ohne-ssh\\\/\"},\"author\":{\"name\":\"David\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"headline\":\"Git ohne SSH\",\"datePublished\":\"2025-12-21T10:13:10+00:00\",\"dateModified\":\"2026-01-14T11:09:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-ohne-ssh\\\/\"},\"wordCount\":345,\"publisher\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"articleSection\":[\"Blog\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-ohne-ssh\\\/\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-ohne-ssh\\\/\",\"name\":\"Git ohne SSH &#060; Vielhuber David\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#website\"},\"datePublished\":\"2025-12-21T10:13:10+00:00\",\"dateModified\":\"2026-01-14T11:09:45+00:00\",\"description\":\"Wer kennt es nicht: Man muss auf einem g\u00fcnstigen Shared-Hosting-Paket (z.B. bei IONOS) schnell mal git pull ausf\u00fchren oder eine Datenbank nutzen, aber der\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-ohne-ssh\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-ohne-ssh\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/blog\\\/git-ohne-ssh\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vielhuber.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Git ohne SSH\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#website\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/\",\"name\":\"Vielhuber David\",\"description\":\"Full-Stack Developer\",\"publisher\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vielhuber.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/vielhuber.de\\\/#\\\/schema\\\/person\\\/64d4ff14713d413ea4d9b210d0c2c6ef\",\"name\":\"David\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"url\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"contentUrl\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\",\"width\":700,\"height\":552,\"caption\":\"David\"},\"logo\":{\"@id\":\"https:\\\/\\\/vielhuber.de\\\/wp-content\\\/uploads\\\/about.jpg\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/vielhuber\"]}]}<\/script>","yoast_head_json":{"title":"Git ohne SSH &#060; Vielhuber David","description":"Wer kennt es nicht: Man muss auf einem g\u00fcnstigen Shared-Hosting-Paket (z.B. bei IONOS) schnell mal git pull ausf\u00fchren oder eine Datenbank nutzen, ab...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/","og_locale":"de_DE","og_type":"article","og_title":"Git ohne SSH &#060; Vielhuber David","og_description":"Wer kennt es nicht: Man muss auf einem g\u00fcnstigen Shared-Hosting-Paket (z.B. bei IONOS) schnell mal git pull ausf\u00fchren oder eine Datenbank nutzen, aber der","og_url":"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/","og_site_name":"Vielhuber David","article_published_time":"2025-12-21T10:13:10+00:00","article_modified_time":"2026-01-14T11:09:45+00:00","og_image":[{"width":700,"height":552,"url":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","type":"image\/jpeg"}],"author":"David","twitter_card":"summary_large_image","twitter_creator":"@vielhuber","twitter_site":"@vielhuber","twitter_misc":{"Verfasst von":"David","Gesch\u00e4tzte Lesezeit":"2\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/#article","isPartOf":{"@id":"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/"},"author":{"name":"David","@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"headline":"Git ohne SSH","datePublished":"2025-12-21T10:13:10+00:00","dateModified":"2026-01-14T11:09:45+00:00","mainEntityOfPage":{"@id":"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/"},"wordCount":345,"publisher":{"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"articleSection":["Blog"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/","url":"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/","name":"Git ohne SSH &#060; Vielhuber David","isPartOf":{"@id":"https:\/\/vielhuber.de\/#website"},"datePublished":"2025-12-21T10:13:10+00:00","dateModified":"2026-01-14T11:09:45+00:00","description":"Wer kennt es nicht: Man muss auf einem g\u00fcnstigen Shared-Hosting-Paket (z.B. bei IONOS) schnell mal git pull ausf\u00fchren oder eine Datenbank nutzen, aber der","breadcrumb":{"@id":"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vielhuber.de\/blog\/git-ohne-ssh\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vielhuber.de\/"},{"@type":"ListItem","position":2,"name":"Git ohne SSH"}]},{"@type":"WebSite","@id":"https:\/\/vielhuber.de\/#website","url":"https:\/\/vielhuber.de\/","name":"Vielhuber David","description":"Full-Stack Developer","publisher":{"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vielhuber.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":["Person","Organization"],"@id":"https:\/\/vielhuber.de\/#\/schema\/person\/64d4ff14713d413ea4d9b210d0c2c6ef","name":"David","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","url":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","contentUrl":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg","width":700,"height":552,"caption":"David"},"logo":{"@id":"https:\/\/vielhuber.de\/wp-content\/uploads\/about.jpg"},"sameAs":["https:\/\/x.com\/vielhuber"]}]}},"_links":{"self":[{"href":"https:\/\/vielhuber.de\/fr\/wp-json\/wp\/v2\/posts\/4607","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vielhuber.de\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vielhuber.de\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vielhuber.de\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vielhuber.de\/fr\/wp-json\/wp\/v2\/comments?post=4607"}],"version-history":[{"count":15,"href":"https:\/\/vielhuber.de\/fr\/wp-json\/wp\/v2\/posts\/4607\/revisions"}],"predecessor-version":[{"id":4681,"href":"https:\/\/vielhuber.de\/fr\/wp-json\/wp\/v2\/posts\/4607\/revisions\/4681"}],"wp:attachment":[{"href":"https:\/\/vielhuber.de\/fr\/wp-json\/wp\/v2\/media?parent=4607"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vielhuber.de\/fr\/wp-json\/wp\/v2\/categories?post=4607"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vielhuber.de\/fr\/wp-json\/wp\/v2\/tags?post=4607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}