![SSH + DIR-Befehl auf Remote-Windows-Computer](https://rvso.com/image/192249/SSH%20%2B%20DIR-Befehl%20auf%20Remote-Windows-Computer.png)
Ich habe OpenSSH auf Windows Server 2008 R2 installiert und meinen öffentlichen Schlüssel dorthin exportiert. Ich kann mich normal verbinden, ohne ein Passwort einzugeben. Ich kann sogar den DIR-Befehl bereits in dem Befehl ausführen, den ich zum Verbinden verwende:
ssh user@ip-address "dir c:\testfolder"
Wenn Sie den Befehl DIR jedoch auf einem Verzeichnis ausführen, dessen Name Leerzeichen enthält, gilt Folgendes:
ssh user@ip-address "dir c:\test folder"
Funktioniert nicht.
Weiß jemand, wie man den Befehl „dir“ für einen Ordner mit Leerzeichen im Namen richtig ausführt? Vielen Dank im Voraus.
Antwort1
ein Freund, der Programmierer ist, hat mir gezeigt, wie man das löst. Wie muss ich den Pfad in der Windows-Shell mit doppelten Anführungszeichen wie folgt ausgeben:
"c:\teste folder"
Und die doppelten Anführungszeichen dienen bereits dazu, den Befehl per SSH an Windows zu senden. Um die doppelten Anführungszeichen an die Windows-Shell zu senden, müssen Sie den Backslash mit doppelten Anführungszeichen verwenden. \"
Der Befehl würde dann folgendermaßen aussehen:
ssh user@ip-address "dir \"c:\teste folder\""
Es dient als Hilfe für diejenigen, die in Zukunft dieselben Zweifel haben.
Antwort2
Überprüfen Sie zunächst immer die Anführungszeichen, die geltenden Regeln für die Shell (der Befehl wird lokal in Bash ausgeführt, aber die Remote-Seite verwendet möglicherweise etwas anderes, z. B. cmd.exe unter Windows) in Bezug auf Anführungszeichen und wann Anführungszeichen, die Sie explizit weitergeben müssen, maskiert werden sollen. Außerdem wird das äußere Paar während der Analyse häufig entfernt.
Mit dem Befehl ssh user@ip-address "dir c:\\testfolder"
erkennt Bash drei Teile des Befehls:
ssh
user@ip-address
dir c:\test folder
Beachten Sie insbesondere, dass Bash die Anführungszeichen um das letzte Element NICHT mit einbezieht! Das liegt daran, dass Bash in diesem Stadium davon ausgeht, dass Sie die Anführungszeichen verwenden, um Bash selbst anzuweisen, den zitierten Text als einen Teil zu interpretieren (gespeichert in einer Zeichenfolge im Speicher von Bash).
Wenn Bash den Befehl an SSH übergibt, sieht SSH die letzten beiden Teile: user@ip-address
und dir c:\test folder
. Shh verwendet den ersten Teil, um zu ermitteln, wohin die Verbindung hergestellt werden soll, und übergibt den zweiten Teil nach der Verbindung genauso an das Remote-Ende. Bedenken Sie jedoch, dass die Anführungszeichen bereits entfernt wurden.
Auf der Remote-Seite empfängt sshd (der SSH-Daemon/-Dienst) dies und gibt es an cmd.exe weiter (da dies die Windows-Seite ist), als... Nicht zwei, sondern drei Teile:
dir
c:\test
folder
Das war nicht beabsichtigt. Sie müssen also sicherstellen, dass die Anführungszeichen von Befehl zu Befehl weitergegeben werden, und bei Bedarf Escapezeichen verwenden. Einige Befehle entfernen Anführungszeichen während der Verarbeitung, während andere sie unverändert weitergeben.
Der endgültige Befehl, richtig zitiert und maskiert, lautet also:
ssh user@ip-address "dir \"c:/test folder\""
Beachten Sie auch, dass ich in diesem Fall auch c:\ in c:/ geändert habe. Moderne cmd.exe akzeptieren an den meisten Stellen ein /, wodurch das alte Problem vermieden wird, dass jedes \ im Befehl zusätzlich maskiert werden muss, um zu verhindern, dass es selbst als Escape-Sequenz interpretiert wird. („Hacker“ haben dieses Problem lange Zeit als Werkzeug zur Code-Injektion genutzt, indem sie ein „\n“ eingebettet haben, das in schlecht gestalteten Anwendungen zu einem Zeilenumbruchzeichen erweitert wird.)
Wenn Sie das "\" beibehalten, müssen Sie es wahrscheinlich als "\\" maskieren. (Beachten Sie, dass dies einsehrein häufiges Problem, in der Tat! Ich musste diesen Beitrag mehrmals bearbeiten, damit er richtig angezeigt wurde. Dies ist auch als „Flucht aus der Hölle“ bekannt. Siehe dieEscape-Sequenz-Wiki-Eintragfür mehr Details.)
Unter Windows gibt es andere Methoden zum Beheben des Basisproblems (Dateinamen mit Leerzeichen):
Mit dem Befehl können Sie einen Laufwerksbuchstaben dem vollständigen Pfad zuordnen
subst
. Dies wird auch oft verwendet, um sehr lange Pfade zu „verkürzen“:subst gd:/ein/wahnsinnig/langer/Pfad/zu/meinem/persönlichen/Ordner/mit/meinen/Lieblingsspielen
ermöglicht Ihnen die Verwendung von „g:“, anstatt immer den vollständigen Pfad einzugeben.
- Unter NTFS in modernen Windows-Systemen können SieNTFS-Analysepunkteum Verbindungspunkte und symbolische Links für Datei- (und Ordner-)Namen zu erstellen, die keine Leerzeichen enthalten, aber auf Namen mit Leerzeichen verweisen. Manchmal ist dies die einzige verwendbare Methode, wenn Sie einen Namen haben, der sehr komplexe Anführungszeichen und Escapezeichen erfordern würde.