Волшебная комбинация для запуска rsync на cygwin через ssh в Windows 10

Во-первых, я прочитал более десятка подобных сообщений по этому поводу, и ни одно из рекомендованных решений не работает для меня. Но я очень новичок в cygwin, поэтому, по-видимому, упускаю что-то, что предполагают эти ответы.

Пример использования: я пытаюсь создать метод для загрузки измененных файлов на сервер с компьютера для разработки Windows 10. Это для некоторых веб-разработок, когда локальный инструмент сборки сначала удаляет все существующие файлы, поэтому сравнение временных меток не годится. Я пробовал WinSCP, но он не поддерживает синхронизацию контрольных сумм (хотя я использую proftpd SFTP, который поддерживает — трекер WinSCP для этой функции не обновлялся 3 года). Если есть какой-то способ заставить WinSCP сделать это, я с радостью откажусь от всего остального ниже.

Итак, rsync по ssh с дельтами и --ignore-times кажется хорошим решением. Обратите внимание, что сервер только принимает ssh с открытым ключом.

Я установил cygwin и с терминала cygwin настроил ssh с помощью ключа и создал файл конфигурации. Из окна терминала cygwin теперь я могу сделать:

$ ssh server.com

без проблем, а также такие вещи, как:

$ rsync -e ssh /local/source server.com:/remote/target

Теперь локальные инструменты сборки запускаются из командной строки в PowerShell, поэтому я хотел бы, в качестве последнего шага, запустить команду, которая загрузит выходные данные сборки на сервер. Вроде просто...

Во-первых, в терминале cygwin я попытался создать сценарий bash с именем deploy-dev.sh. Если я запускаю это из терминала cygwin, все работает нормально. Но если я запущу это из PowerShell:

PS C:\cygwin64\bin> .\bash.exe /home/davidl/deploy-dev.sh

Я получаю следующую ошибку:

Warning: Identity file /home/davidl/.ssh/key.pem not accessible: No such file or directory.

Но он создал файл known_hosts в C:\Users\davidl\.ssh. Поэтому я скопировал туда ключ ssh. Но я все еще получаю ту же ошибку - до сих пор не знаю, почему.

Во всяком случае, с другой стороны, как насчет того, чтобы просто запустить rsync.exe из PowerShell, а не скрипт bash:

PS C:\cygwin64\bin> .\rsync.exe -e ssh test.txt server.com:/target
Bad owner or permissions on C:\\Users\\davidl/.ssh/config

Хорошо, пока игнорируйте это и попробуйте загрузить ключ напрямую:

PS C:\cygwin64\bin> .\rsync.exe -e "ssh -i C:\Users\davidl\.ssh\key.pem" test.txt [email protected]:/target
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\Users\\davidl\\.ssh\\key.pem' are too open.

Прогресс! Он ищет нужный файл. Итак, о разрешениях:

PS C:\cygwin64\bin> .\ls.exe -al C:\Users\davidl\.ssh\
total 14
drwxr-xr-x 1 davidl None    0 Aug  8 19:04 .
drwxr-xr-x 1 davidl None    0 Aug  8 18:33 ..
-rw-r--r-- 1 davidl None 1692 Aug  8 19:02 key.pem
-rw-r--r-- 1 davidl None   94 Aug  8 19:04 config
-rw-r--r-- 1 davidl None  187 Aug  8 19:02 known_hosts

Хм. Это не выглядит правильно. Итак, исправьте это с помощью chgrp и chown в соответствии со многими ответами, опубликованными о таких вещах:

PS C:\cygwin64\bin> .\chgrp.exe -R :Users C:\Users\davidl\.ssh\
/usr/bin/chgrp: invalid group: ':Users'

Хорошо, может быть, просто разрешений будет достаточно:

PS C:\cygwin64\bin> .\chmod.exe -R 600 C:\Users\davidl\.ssh\
PS C:\cygwin64\bin> .\ls.exe -al C:\Users\davidl\.ssh\
total 14
drwxr-xr-x 1 davidl None    0 Aug  8 19:04 .
drwxr-xr-x 1 davidl None    0 Aug  8 18:33 ..
-rw-r--r-- 1 davidl None 1692 Aug  8 19:02 key.pem
-rw-r--r-- 1 davidl None   94 Aug  8 19:04 config
-rw-r--r-- 1 davidl None  187 Aug  8 19:02 known_hosts

Так что теперь я застрял. Я не могу установить правильную группу или разрешения для локальных файлов через cygwin, и, глядя на них внутри терминала cygwin, разрешения все равно выглядят правильно:

davidl@DESKTOP2 /cygdrive/c/Users/davidl/.ssh
$ ls -al
total 14
drwx------+ 1 davidl None      0 Aug  8 19:04 .
drwxrwx---+ 1 SYSTEM SYSTEM    0 Aug  8 18:33 ..
-rw-------+ 1 davidl None     94 Aug  8 19:04 config
-rw-------+ 1 davidl None   1692 Aug  8 19:02 key.pem
-rw-------+ 1 davidl None    187 Aug  8 19:02 known_hosts

Примечание. Я проверил, что это монтирование NTFS, а не FAT32.

Как мне проще всего это сделать, кроме необходимости открывать терминал cygwin и запускать скрипт вручную?


person dsl101    schedule 08.08.2018    source источник
comment
ты пробовал .\bash.exe -l /home/davidl/deploy-dev.sh ?   -  person matzeri    schedule 08.08.2018
comment
Нет, я никогда раньше так не запускал bash, и теперь скрипт работает отлично. Большое спасибо за предложение, и если вы можете опубликовать это как ответ, я могу его принять. С тех пор я читал справочные страницы для bash и до сих пор не совсем понимаю, чего он не нашел. Если я запускаю .\bash.exe -c "whoami", я получаю тот же результат, что и whoami из терминала cygwin. Но я предполагаю, что в профиле есть что-то, что ему нужно. И я до сих пор не понимаю, почему запустить rsync.exe из PowerShell было так сложно. Но в любом случае это отличное решение.   -  person dsl101    schedule 09.08.2018


Ответы (1)


Если запустить скрипт /home/davidl/deploy-dev.sh из оболочки входа в систему по умолчанию, он работает и работает как

.\bash.exe /home/davidl/deploy-dev.sh

терпит неудачу, чем разница из-за отсутствия настроек входа в систему. Вы можете преодолеть это с помощью опции -l bash.

.\bash.exe -l /home/davidl/dploy-dev.sh

PS: ярлык Mintty aka Cygwin Terminal по умолчанию запускает оболочку входа)

person matzeri    schedule 09.08.2018