![Команда SSH + DIR на удаленной машине Windows](https://rvso.com/image/192249/%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0%20SSH%20%2B%20DIR%20%D0%BD%D0%B0%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B5%20Windows.png)
Я установил OpenSSH на windows server 2008 r2 и экспортировал туда свой открытый ключ. Я могу нормально подключиться без ввода пароля, я даже могу запустить команду DIR уже в команде, которую я использую для подключения:
ssh user@ip-address "dir c:\testfolder"
Однако запуск команды DIR для каталога с пробелами в имени:
ssh user@ip-address "dir c:\test folder"
Не работает.
Кто-нибудь знает, как правильно запустить команду dir для папки с пробелами в имени? Заранее спасибо.
решение1
друг-программист научил меня, как решить эту проблему. Как мне сделать так, чтобы путь был напечатан в оболочке Windows с двойными кавычками, например так:
"c:\teste folder"
А двойные кавычки уже служат для отправки команды в Windows через SSH, чтобы отправить двойные кавычки в оболочку Windows, вам нужно использовать обратную косую черту с двойными кавычками \"
, команда будет выглядеть так:
ssh user@ip-address "dir \"c:\teste folder\""
Это останется помощью для тех, у кого в будущем возникнут такие же сомнения.
решение2
Во-первых, всегда проверяйте кавычки, правила, действующие для оболочки (команда выполняется в bash локально, но удаленная сторона может использовать что-то другое, например cmd.exe в Windows) относительно кавычек, и когда для экранирования кавычек нужно передавать их явно. Кроме того, внешняя пара часто обрезается/удаляется во время синтаксического анализа.
При использовании команды ssh user@ip-address "dir c:\\testfolder"
bash различает три ее части:
ssh
user@ip-address
dir c:\test folder
Обратите внимание, что bash НЕ включает кавычки вокруг последнего элемента! Это потому, что на этом этапе bash предполагает, что вы используете кавычки, чтобы сообщить bash, что нужно интерпретировать цитируемый текст как одну часть (хранящуюся в одной строке в пространстве памяти bash).
Когда bash передает команду ssh, ssh видит последние две части: user@ip-address
и dir c:\test folder
. shh использует первую часть, чтобы определить, куда подключаться, и после подключения передает вторую часть точно так же, как она есть, на удаленный конец — однако помните, что кавычки уже удалены.
На удаленном конце sshd (демон/служба ssh) получает его и передает в cmd.exe (так как это сторона Windows) в виде... Не двух, а трех частей:
dir
c:\test
folder
Это не то, что было задумано. Поэтому вам нужно убедиться, что кавычки передаются из команды в команду, используя экранирование по мере необходимости — некоторые команды удаляют кавычки во время обработки, а другие передают их как есть.
Итак, окончательная команда, правильно заключенная в кавычки и экранированная, выглядит так:
ssh user@ip-address "dir \"c:/test folder\""
Обратите внимание, что в этом случае я также изменил c:\ на c:/. Современный cmd.exe принимает / в большинстве мест, что помогает избежать древней проблемы необходимости дальнейшего экранирования любого \ в команде, чтобы предотвратить ее интерпретацию как самой последовательности экранирования. («Хакеры» давно используют эту проблему как инструмент для внедрения кода, внедряя «\n», который расширяется до символа новой строки в плохо спроектированных приложениях.)
Если вы оставите "\", вам, вероятно, придется экранировать его как "\\". (Обратите внимание, что этооченьРаспространенная проблема, на самом деле! Мне пришлось редактировать этот пост несколько раз, чтобы он отображался правильно. Это также известно как "escape hell". СмотритеЗапись в Wiki о последовательности побегаБольше подробностей.)
В Windows существуют и другие методы решения базовой проблемы (имена файлов с пробелами):
Вы можете сопоставить букву диска с полным путем с помощью
subst
команды. Это также часто используется для «сокращения» очень длинных путей:subst gd:/an/insanely/long/path/to/my/personal/folder/of/favorite/games
позволит вам использовать «g:» вместо того, чтобы всегда вводить полный путь.
- В современных системах Windows под NTFS можно использоватьТочки повторной обработки NTFSдля создания точек соединения и символических ссылок для имен файлов (и папок), в именах которых нет пробелов, но которые указывают на те, в которых они есть. Иногда это единственный метод, который можно использовать, если у вас есть имя, которое требует очень сложного кавычек и экранирования.